//+---------------------------------------------------------------------+ //| VKW_Bands_Modify_Candle.mq5 | //| Copyright © 2008, Alksnis Gatis | //| 2xpoint@gmail.com | //+---------------------------------------------------------------------+ //| Для работы индикатора следует положить файл SmoothAlgorithms.mqh | //| в папку (директорию): terminal_data_folder\MQL5\Include | //+---------------------------------------------------------------------+ #property copyright "Copyright © 2008, Alksnis Gatis" #property link "2xpoint@gmail.com" #property description "Индикатор показывает, где выставлять отложенные ордера" //---- номер версии индикатора #property version "1.00" //---- отрисовка индикатора в отдельном окне #property indicator_separate_window //---- количество индикаторных буферов #property indicator_buffers 7 //---- использовано всего три графических построения #property indicator_plots 3 //+-----------------------------------+ //| Параметры отрисовки индикатора | //+-----------------------------------+ //---- в качестве индикатора использованы цветные свечи #property indicator_type1 DRAW_COLOR_CANDLES #property indicator_color1 clrRed,clrGray,clrBlue //---- отображение метки индикатора #property indicator_label1 "Open;High;Low;Close" //+-----------------------------------+ //| Параметры отрисовки индикатора | //+-----------------------------------+ //---- отрисовка индикатора в виде линии #property indicator_type2 DRAW_LINE //---- в качестве цвета линии индикатора использован DodgerBlue цвет #property indicator_color2 clrLimeGreen //---- линия индикатора - непрерывная кривая #property indicator_style2 STYLE_SOLID //---- толщина линии индикатора равна 1 #property indicator_width2 1 //---- отображение метки индикатора #property indicator_label2 "VKW_Bands Upper" //+-----------------------------------+ //| Параметры отрисовки индикатора | //+-----------------------------------+ //---- отрисовка индикатора в виде линии #property indicator_type3 DRAW_LINE //---- в качестве цвета линии индикатора использован Magenta цвет #property indicator_color3 clrMagenta //---- линия индикатора - непрерывная кривая #property indicator_style3 STYLE_SOLID //---- толщина линии индикатора равна 1 #property indicator_width3 1 //---- отображение метки индикатора #property indicator_label3 "VKW_Bands Lower" //+-----------------------------------+ //| Параметры уровней | //+-----------------------------------+ #property indicator_level1 60 #property indicator_level2 40 #property indicator_levelcolor clrMagenta #property indicator_levelstyle STYLE_DASHDOTDOT //+-----------------------------------+ //| Объявление констант | //+-----------------------------------+ #define RESET 0 // константа для возврата терминалу команды на пересчет индикатора //+-----------------------------------+ //| Описание класса CXMA | //+-----------------------------------+ #include //+-----------------------------------+ //---- объявление переменных класса CXMA из файла SmoothAlgorithms.mqh CXMA XMA1,XMA2; //+-----------------------------------+ //| Объявление перечислений | //+-----------------------------------+ /*enum Smooth_Method - перечисление объявлено в файле SmoothAlgorithms.mqh { MODE_SMA_, //SMA MODE_EMA_, //EMA MODE_SMMA_, //SMMA MODE_LWMA_, //LWMA MODE_JJMA, //JJMA MODE_JurX, //JurX MODE_ParMA, //ParMA MODE_T3, //T3 MODE_VIDYA, //VIDYA MODE_AMA, //AMA }; */ //+-----------------------------------+ //| Входные параметры индикатора | //+-----------------------------------+ input uint PeriodRSI=7; // Период индикатора input int StepSizeFast=5; // Быстрый шаг input int StepSizeSlow=15; // Медленный шаг input int IShift=0; // Сдвиг индикатора по горизонтали в барах input uint RPeriod=25; // Период поиска для экстремумов input Smooth_Method SmMA_Method=MODE_SMA; // Метод сглаживания input uint SLength=3; // Глубина сглаживания input int SPhase=100; // Параметр сглаживания //---- для JJMA изменяющийся в пределах -100 ... +100, влияет на качество переходного процесса; //---- для VIDIA это период CMO, для AMA это период медленной скользящей input int SShift=0; // Сдвиг индикатора канала по горизонтали в барах //+-----------------------------------+ //---- объявление динамического массивов, которые будут в //---- дальнейшем использованы в качестве индикаторных буферов double ExtOpenBuffer[],ExtHighBuffer[],ExtLowBuffer[],ExtCloseBuffer[],ExtColorBuffer[]; double UpIndBuffer[],DnIndBuffer[]; //---- объявление целочисленных переменных для хендлов индикаторов int Ind_Handle[4]; //---- объявление целочисленных переменных начала отсчета данных int min_rates_total,min_rates_1; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //---- инициализация переменных начала отсчета данных min_rates_1=int(PeriodRSI); min_rates_1+=int(RPeriod); min_rates_total=min_rates_1+GetStartBars(SmMA_Method,SLength,SPhase); //---- получение хендлов индикатора METRO Ind_Handle[0]=iCustom(NULL,0,"METRO",PeriodRSI,StepSizeFast,StepSizeSlow,0,PRICE_OPEN); if(Ind_Handle[0]==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора METRO["+string(0)+"]!"); return(INIT_FAILED); } //---- Ind_Handle[1]=iCustom(NULL,0,"METRO",PeriodRSI,StepSizeFast,StepSizeSlow,0,PRICE_HIGH); if(Ind_Handle[1]==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора METRO["+string(1)+"]!"); return(INIT_FAILED); } //---- Ind_Handle[2]=iCustom(NULL,0,"METRO",PeriodRSI,StepSizeFast,StepSizeSlow,0,PRICE_LOW); if(Ind_Handle[2]==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора METRO["+string(2)+"]!"); return(INIT_FAILED); } //---- Ind_Handle[3]=iCustom(NULL,0,"METRO",PeriodRSI,StepSizeFast,StepSizeSlow,0,PRICE_CLOSE); if(Ind_Handle[3]==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора METRO["+string(3)+"]!"); return(INIT_FAILED); } //---- превращение динамических массивов в индикаторные буферы SetIndexBuffer(0,ExtOpenBuffer,INDICATOR_DATA); SetIndexBuffer(1,ExtHighBuffer,INDICATOR_DATA); SetIndexBuffer(2,ExtLowBuffer,INDICATOR_DATA); SetIndexBuffer(3,ExtCloseBuffer,INDICATOR_DATA); //---- превращение динамического массива в цветовой, индексный буфер SetIndexBuffer(4,ExtColorBuffer,INDICATOR_COLOR_INDEX); //---- индексация элементов в буферах как в таймсериях ArraySetAsSeries(ExtOpenBuffer,true); ArraySetAsSeries(ExtHighBuffer,true); ArraySetAsSeries(ExtLowBuffer,true); ArraySetAsSeries(ExtCloseBuffer,true); ArraySetAsSeries(ExtColorBuffer,true); //---- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total); //---- осуществление сдвига индикатора по горизонтали PlotIndexSetInteger(0,PLOT_SHIFT,IShift); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(5,UpIndBuffer,INDICATOR_DATA); //---- осуществление сдвига индикатора 2 по горизонтали PlotIndexSetInteger(1,PLOT_SHIFT,SShift); //---- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0); //---- индексация элементов в буферах как в таймсериях ArraySetAsSeries(UpIndBuffer,true); //---- превращение динамического массива в индикаторный буфер SetIndexBuffer(6,DnIndBuffer,INDICATOR_DATA); //---- осуществление сдвига индикатора 3 по горизонтали PlotIndexSetInteger(2,PLOT_SHIFT,SShift); //---- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total); //---- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0); //---- индексация элементов в буферах как в таймсериях ArraySetAsSeries(DnIndBuffer,true); //---- инициализация переменной для короткого имени индикатора string shortname="VKW_Bands_METRO_Candle"; //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,shortname); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,0); //--- завершение инициализации return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Custom 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(Ind_Handle[0])rates_total || prev_calculated<=0) // проверка на первый старт расчета индикатора { limit=maxbar; // стартовый номер для расчета всех баров } else limit=rates_total-prev_calculated; // стартовый номер для расчета новых баров to_copy=limit+1+int(RPeriod); //---- копируем вновь появившиеся данные в массивы if(CopyBuffer(Ind_Handle[0],0,0,to_copy,ExtOpenBuffer)<=0) return(RESET); if(CopyBuffer(Ind_Handle[1],0,0,to_copy,ExtHighBuffer)<=0) return(RESET); if(CopyBuffer(Ind_Handle[2],0,0,to_copy,ExtLowBuffer)<=0) return(RESET); if(CopyBuffer(Ind_Handle[3],0,0,to_copy,ExtCloseBuffer)<=0) return(RESET); //---- основной цикл исправления и окрашивания свечей for(bar=limit; bar>=0 && !IsStopped(); bar--) { double Max=MathMax(ExtOpenBuffer[bar],ExtCloseBuffer[bar]); double Min=MathMin(ExtOpenBuffer[bar],ExtCloseBuffer[bar]); //---- ExtHighBuffer[bar]=MathMax(Max,ExtHighBuffer[bar]); ExtLowBuffer[bar]=MathMin(Min,ExtLowBuffer[bar]); //---- if(ExtOpenBuffer[bar]ExtCloseBuffer[bar]) ExtColorBuffer[bar]=0.0; else ExtColorBuffer[bar]=1.0; } //---- основной цикл расчета индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { d_max=ExtHighBuffer[ArrayMaximum(ExtHighBuffer,bar,RPeriod)]; d_min=ExtLowBuffer[ArrayMinimum(ExtLowBuffer,bar,RPeriod)]; UpIndBuffer[bar]=XMA1.XMASeries(maxbar,prev_calculated,rates_total,SmMA_Method,SPhase,SLength,d_max,bar,true); DnIndBuffer[bar]=XMA2.XMASeries(maxbar,prev_calculated,rates_total,SmMA_Method,SPhase,SLength,d_min,bar,true); } //---- return(rates_total); } //+------------------------------------------------------------------+