//+------------------------------------------------------------------+ //| TrendMFI_v1.mq5 | //| Copyright © 2005, TrendLaboratory Ltd. | //| E-mail: igorad2004@list.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, TrendLaboratory Ltd." #property link "E-mail: igorad2004@list.ru" //---- номер версии индикатора #property version "1.00" //---- описание индикатора #property description "" //---- отрисовка индикатора в отдельном окне #property indicator_separate_window //---- для расчёта и отрисовки индикатора использовано три буфера #property indicator_buffers 3 //---- использовано три графических построения #property indicator_plots 3 //+----------------------------------------------+ //| Параметры отрисовки MFI | //+----------------------------------------------+ //---- отрисовка индикатора 1 в виде линии #property indicator_type1 DRAW_LINE //---- в качестве цвета линии индикатора использован оранжевый цвет #property indicator_color1 clrOrange //---- линия индикатора 1 - непрерывная кривая #property indicator_style1 STYLE_SOLID //---- толщина линии индикатора 1 равна 2 #property indicator_width1 2 //---- отображение метки индикатора #property indicator_label1 "MFI" //+----------------------------------------------+ //| Параметры отрисовки MAMFI fast | //+----------------------------------------------+ //---- отрисовка индикатора 2 в виде линии #property indicator_type2 DRAW_LINE //---- в качестве цвета линии индикатора использован розовый цвет #property indicator_color2 clrMagenta //---- линия индикатора 2 - непрерывная кривая #property indicator_style2 STYLE_SOLID //---- толщина линии индикатора 2 равна 3 #property indicator_width2 3 //---- отображение метки индикатора #property indicator_label2 "MAMFI fast" //+----------------------------------------------+ //| Параметры отрисовки MAMFI slow | //+----------------------------------------------+ //---- отрисовка индикатора 3 в виде линии #property indicator_type3 DRAW_LINE //---- в качестве цвета медвежьей линии индикатора использован голубой цвет #property indicator_color3 clrDodgerBlue //---- линия индикатора 3 - непрерывная кривая #property indicator_style3 STYLE_SOLID //---- толщина линии индикатора 3 равна 4 #property indicator_width3 4 //---- отображение медвежьей метки индикатора #property indicator_label3 "MAMFI slow" //+----------------------------------------------+ //| Параметры отображения горизонтальных уровней | //+----------------------------------------------+ #property indicator_level1 70.0 #property indicator_level2 50.0 #property indicator_level3 30.0 #property indicator_levelcolor clrGray #property indicator_levelstyle STYLE_DASHDOTDOT //+----------------------------------------------+ //| объявление констант | //+----------------------------------------------+ #define RESET 0 // константа для возврата терминалу команды на пересчёт индикатора //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input uint MFIPeriod=14; input ENUM_APPLIED_VOLUME VolumeType=VOLUME_TICK; // объём input uint FastMAPeriod=9; input ENUM_MA_METHOD FastMAType=MODE_EMA; input uint SlowMAPeriod=45; input ENUM_MA_METHOD SlowMAType=MODE_EMA; input int Shift=0; // сдвиг индикатора по горизонтали в барах //+----------------------------------------------+ //---- объявление динамических массивов, которые будут в // дальнейшем использованы в качестве индикаторных буферов double Ind1Buffer[]; double Ind2Buffer[]; double Ind3Buffer[]; //---- Объявление целых переменных начала отсчёта данных int min_rates_total; //---- Объявление целых переменных для хендлов индикаторов int MFI_Handle,FsMA_Handle,SlMA_Handle; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //---- Инициализация переменных начала отсчёта данных min_rates_total=int(MathMax(FastMAPeriod,SlowMAPeriod)+MFIPeriod); //---- получение хендла индикатора iMFI MFI_Handle=iMFI(NULL,0,MFIPeriod,VolumeType); if(MFI_Handle==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора iMFI"); return(INIT_FAILED); } //---- получение хендла индикатора Fast iMA FsMA_Handle=iMA(_Symbol,PERIOD_CURRENT,FastMAPeriod,0,FastMAType,MFI_Handle); if(FsMA_Handle==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора Fast iMA"); return(INIT_FAILED); } //---- получение хендла индикатора Slow iMA SlMA_Handle=iMA(_Symbol,PERIOD_CURRENT,SlowMAPeriod,0,SlowMAType,MFI_Handle); if(SlMA_Handle==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора Slow iMA"); return(INIT_FAILED); } //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(0,Ind1Buffer,INDICATOR_DATA); //---- осуществление сдвига индикатора 1 по горизонтали на Shift PlotIndexSetInteger(0,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчёта отрисовки индикатора 1 на min_rates_total PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(Ind1Buffer,true); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(1,Ind2Buffer,INDICATOR_DATA); //---- осуществление сдвига индикатора 2 по горизонтали на Shift PlotIndexSetInteger(1,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчёта отрисовки индикатора 2 на min_rates_total PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(Ind2Buffer,true); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(2,Ind3Buffer,INDICATOR_DATA); //---- осуществление сдвига индикатора 3 по горизонтали на Shift PlotIndexSetInteger(2,PLOT_SHIFT,Shift); //---- осуществление сдвига начала отсчёта отрисовки индикатора 3 на min_rates_total PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE); //---- индексация элементов в буфере как в таймсерии ArraySetAsSeries(Ind3Buffer,true); //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,"TrendMFI_v1"); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,0); //---- завершение инициализации return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom indicator iteration function | //+------------------------------------------------------------------+ int OnCalculate( const int rates_total, // количество истории в барах на текущем тике const int prev_calculated,// количество истории в барах на предыдущем тике const datetime &time[], const double &open[], const double& high[], // ценовой массив максимумов цены для расчёта индикатора const double& low[], // ценовой массив минимумов цены для расчёта индикатора const double &close[], const long &tick_volume[], const long &volume[], const int &spread[] ) { //---- проверка количества баров на достаточность для расчёта if(BarsCalculated(MFI_Handle)rates_total || prev_calculated<=0)// проверка на первый старт расчёта индикатора to_copy=rates_total-min_rates_total; // стартовый номер для расчёта всех баров else to_copy=rates_total-prev_calculated+1; // стартовый номер для расчёта новых баров //---- копируем вновь появившиеся данные в массивы if(CopyBuffer(MFI_Handle,0,0,to_copy,Ind1Buffer)<=0) return(RESET); if(CopyBuffer(FsMA_Handle,0,0,to_copy,Ind2Buffer)<=0) return(RESET); if(CopyBuffer(SlMA_Handle,0,0,to_copy,Ind3Buffer)<=0) return(RESET); //---- return(rates_total); } //+------------------------------------------------------------------+