//+------------------------------------------------------------------+ //| ATR_Channels_XKPrmSt_X20_ZZ_HTF.mq5 | //| Copyright © 2018, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2018, Nikolay Kositsin" #property link "farria@mail.redcom.ru" //--- номер версии индикатора #property version "1.61" #property description "ATR_Channels_XKPrmSt_X20_ZZ с фиксированным во входных параметрах таймфреймом" //--- отрисовка индикатора в отдельном окне #property indicator_separate_window //+--------------------------------------------------+ //| объявление констант | //+--------------------------------------------------+ #define LINES_TOTAL 20 // Константа для количества линий индикатора #define RESET 0 // Константа для возврата терминалу команды на пересчёт индикатора #define INDICATOR_NAME "ATR_Channels_XKPrmSt_X20_ZZ" // Константа для имени индикатора #define SIZE LINES_TOTAL*2+7 // Константа для количества вызовов функции CountIndicator в коде //+----------------------------------------------+ //---- количество индикаторных буферов #property indicator_buffers LINES_TOTAL*2+7+2 //LINES_TOTAL*2+7 //---- использовано всего графических построений #property indicator_plots LINES_TOTAL+7+2 //+--------------------------------------------------+ //| Параметры отрисовки индикатора | //+--------------------------------------------------+ //---- отрисовка индикатора в виде линии #property indicator_type21 DRAW_LINE //---- в качестве цвета линии индикатора использован сине-фиолетовый цвет #property indicator_color21 clrBlueViolet //---- линия индикатора - сплошная линия #property indicator_style21 STYLE_SOLID //---- толщина линии индикатора равна 1 #property indicator_width21 1 //---- отображение метки индикатора #property indicator_label21 "ATR" //+--------------------------------------------------+ //| Параметры отрисовки индикатора Envelope уровней | //+--------------------------------------------------+ //---- отрисовка уровней в виде линий #property indicator_type22 DRAW_LINE #property indicator_type23 DRAW_LINE #property indicator_type24 DRAW_LINE #property indicator_type25 DRAW_LINE #property indicator_type26 DRAW_LINE #property indicator_type27 DRAW_LINE //---- выбор цветов уровней #property indicator_color22 clrPurple #property indicator_color23 clrRed #property indicator_color24 clrBlue #property indicator_color25 clrBlue #property indicator_color26 clrRed #property indicator_color27 clrPurple //---- уровни - штрихпунктирные кривые #property indicator_style22 STYLE_SOLID #property indicator_style23 STYLE_SOLID #property indicator_style24 STYLE_SOLID #property indicator_style25 STYLE_SOLID #property indicator_style26 STYLE_SOLID #property indicator_style27 STYLE_SOLID //---- толщина уровней равна 1 #property indicator_width22 1 #property indicator_width23 1 #property indicator_width24 1 #property indicator_width25 1 #property indicator_width26 1 #property indicator_width27 1 //---- отображение меток уровней #property indicator_label22 "+3 Envelope" #property indicator_label23 "+2 Envelope" #property indicator_label24 "+1 Envelope" #property indicator_label25 "-1 Envelope" #property indicator_label26 "-2 Envelope" #property indicator_label27 "-3 Envelope" //+--------------------------------------------------+ //| Параметры отрисовки зигзага | //+--------------------------------------------------+ //---- в качестве индикатора использован ZIGZAG #property indicator_type28 DRAW_ZIGZAG //---- отображение метки индикатора #property indicator_label28 "ZigZag" //---- в качестве цвета линии индикатора использован DarkGray цвет #property indicator_color28 clrDarkGray //---- линия индикатора - непрерывная кривая #property indicator_style28 STYLE_SOLID //---- толщина линии индикатора равна 3 #property indicator_width28 3 //+--------------------------------------------------+ //| Параметры отрисовки индикаторов XKPrmSt | //+--------------------------------------------------+ //--- отрисовка индикатора в виде цветного облака #property indicator_type1 DRAW_FILLING //--- в качестве цветов индикатора использованы #property indicator_color1 C'166,233,255',C'255,179,255' //---- отображение метки линии индикатора #property indicator_label1 "XKPrmSt;Signal" //+----------------------------------------------+ //| Параметры размеров окна индикатора | //+----------------------------------------------+ #property indicator_minimum 0 #property indicator_maximum 100 //+----------------------------------------------+ //| объявление перечислений | //+----------------------------------------------+ enum Applied_price_ // Тип константы { PRICE_CLOSE_ = 1, // Close PRICE_OPEN_, // Open PRICE_HIGH_, // High PRICE_LOW_, // Low PRICE_MEDIAN_, // Median Price (HL/2) PRICE_TYPICAL_, // Typical Price (HLC/3) PRICE_WEIGHTED_, // Weighted Close (HLCC/4) PRICE_SIMPLE, // Simple Price (OC/2) PRICE_QUARTER_, // Quarted Price (HLOC/4) PRICE_TRENDFOLLOW0_, // TrendFollow_1 Price PRICE_TRENDFOLLOW1_, //TrendFollow_2 Price PRICE_DEMARK_ //Demark Price }; //+----------------------------------------------+ //| объявление перечислений | //+----------------------------------------------+ enum Smooth_Method { 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 ENUM_TIMEFRAMES TimeFrame=PERIOD_H4; // Период графика индикатора //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input uint Per1=14; //период поиска экстремальных экстремумов input Smooth_Method MA_Method2=MODE_T3; //метод усреднения второго сглаживания input uint StartPer2=5; //стартовый период второго усреднения input uint step=1; //шаг периода второго усреднения input int Phase2=15; //параметр второго сглаживания, //---- для JJMA изменяющийся в пределах -100 ... +100, влияет на качество переходного процесса; //---- Для VIDIA это период CMO, для AMA это период медленной скользящей input Smooth_Method MA_Method3=MODE_JJMA; //метод усреднения третьего сглаживания input int Per3=3; //глубина третьего сглаживания input int Phase3=15; //параметр третьего сглаживания, //---- для JJMA изменяющийся в пределах -100 ... +100, влияет на качество переходного процесса; //---- Для VIDIA это период CMO, для AMA это период медленной скользящей input uint Per4=5; //период поиска экстремумов //---- input uint ATRPeriod=18; input double Mult_Factor1=5000; input double Mult_Factor2=10000; input double Mult_Factor3=15000; input Smooth_Method XMA_Method=MODE_SMA_; //метод усреднения input uint XLength=100; //глубина сглаживания input int XPhase=15; //параметр усреднения, //---- для JJMA изменяющийся в пределах -100 ... +100, влияет на качество переходного процесса; //---- Для VIDIA это период CMO, для AMA это период медленной скользящей //---- входные параметры зигзага input uint ExtDepth=3; input uint ExtDeviation=3; input uint ExtBackstep=3; //+----------------------------------------------+ //---- объявление динамических массивов, которые будут в дальнейшем использованы в качестве индикаторных буферов double ExtLineBuffer0[]; double ExtLineBuffer1[],ExtLineBuffer2[],ExtLineBuffer3[]; double ExtLineBuffer4[],ExtLineBuffer5[],ExtLineBuffer6[]; double LowestBuffer[],HighestBuffer[]; //--- объявление целочисленных переменных начала отсчета данных int min_rates_total; //--- объявление целочисленных переменных для хендлов индикаторов int Ind_Handle; //+------------------------------------------------------------------+ //| Получение таймфрейма в виде строки | //+------------------------------------------------------------------+ string GetStringTimeframe(ENUM_TIMEFRAMES timeframe) {return(StringSubstr(EnumToString(timeframe),7,-1));} //+------------------------------------------------------------------+ //| Массивы переменных для создания индикаторных буферов | //+------------------------------------------------------------------+ class CIndicatorsBuffers { public: double UpIndBuffer[]; public: double DnIndBuffer[]; }; //+------------------------------------------------------------------+ //| Создание индикаторных буферов | //+------------------------------------------------------------------+ CIndicatorsBuffers Ind[LINES_TOTAL]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- инициализация переменных min_rates_total=2; //--- получение хендла индикатора ATR_Channels_XKPrmSt_X20 Ind_Handle=iCustom(Symbol(),TimeFrame,"ATR_Channels_XKPrmSt_X20_ZZ", Per1,MA_Method2,StartPer2,step,Phase2,MA_Method3,Per3,Phase3,Per4, ATRPeriod,Mult_Factor1,Mult_Factor2,Mult_Factor3,XMA_Method,XLength, XPhase,ExtDepth,ExtDeviation,ExtBackstep); if(Ind_Handle==INVALID_HANDLE) { Print(" Не удалось получить хендл индикатора ATR_Channels_XKPrmSt_X20"); return(INIT_FAILED); } //---- uint period=StartPer2; for(int numb=0; numbrates_total || prev_calculated<=0)// проверка на первый старт расчета индикатора { limit=rates_total-min_rates_total-1; // стартовый номер для расчета всех баров } else limit=LimitShift+rates_total-prev_calculated; // стартовый номер для расчета новых баров //---- индексация элементов в массивах, как в таймсериях ArraySetAsSeries(time,true); ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); //---- обнулим содержимое индикаторных буферов до расчета for(bar=limit; bar>=0 && !IsStopped(); bar--) { LowestBuffer[bar]=EMPTY_VALUE; HighestBuffer[bar]=EMPTY_VALUE; } //---- основной цикл расчета индикатора for(bar=limit; bar>=0 && !IsStopped(); bar--) { //---- копируем вновь появившиеся данные в массивы if(CopyTime(NULL,TimeFrame,time[bar],1,ZigZagTime)<=0) return(RESET); if(time[bar+1]=ZigZagTime[0]) { //---- копируем вновь появившиеся данные в массивы if(CopyBuffer(Ind_Handle,48,time[bar],1,UpZigZag)<=0) return(RESET); if(CopyBuffer(Ind_Handle,47,time[bar],1,DnZigZag)<=0) return(RESET); if(UpZigZag[0]) HighestBuffer[bar]=UpZigZag[0]; if(DnZigZag[0]) LowestBuffer[bar]=DnZigZag[0]; } } //---- return(rates_total); } //+------------------------------------------------------------------+ //| Инициализация индикаторного буфера | //+------------------------------------------------------------------+ void IndInit(int Number,double &Buffer[],double Empty_Value,int Draw_Begin,int nShift) { //--- превращение динамического массива в индикаторный буфер SetIndexBuffer(Number,Buffer,INDICATOR_DATA); //--- осуществление сдвига начала отсчета отрисовки индикатора PlotIndexSetInteger(Number,PLOT_DRAW_BEGIN,Draw_Begin); //--- установка значений индикатора, которые не будут видимы на графике PlotIndexSetDouble(Number,PLOT_EMPTY_VALUE,Empty_Value); //--- осуществление сдвига индикатора 2 по горизонтали на Shift PlotIndexSetInteger(Number,PLOT_SHIFT,nShift); //--- индексация элементов в буфере как в таймсерии ArraySetAsSeries(Buffer,true); } //+------------------------------------------------------------------+ //| CountIndicator | //+------------------------------------------------------------------+ bool CountIndicator(uint Numb, // Номер функции CountLine по списку в коде индикатора (стартовый номер - 0) string Symb, // Символ графика ENUM_TIMEFRAMES TFrame, // Период графика int IndHandle, // Хендл обрабатываемого индикатора uint BuffNumb, // Номер буфера обрабатываемого индикатора 1 double& IndBuf[], // Приемный буфер индикатора 1 const datetime& Time[], // Таймсерия времени const int Rates_Total, // количество истории в барах на текущем тике const int Prev_Calculated,// количество истории в барах на предыдущем тике const int Min_Rates_Total)// минимальное количество истории в барах для расчета { //--- static int LastCountBar[SIZE]; datetime IndTime[1]; int limit; //--- расчеты необходимого количества копируемых данных //--- и стартового номера limit для цикла пересчета баров if(Prev_Calculated>Rates_Total || Prev_Calculated<=0)// проверка на первый старт расчета индикатора { limit=Rates_Total-Min_Rates_Total-1; // стартовый номер для расчета всех баров LastCountBar[Numb]=limit; } else limit=LastCountBar[Numb]+Rates_Total-Prev_Calculated; // стартовый номер для расчета новых баров //--- основной цикл расчета индикатора for(int bar=limit; bar>=0 && !IsStopped(); bar--) { //--- копируем вновь появившиеся данные в массив IndTime if(CopyTime(Symbol(),TFrame,Time[bar],1,IndTime)<=0) return(false); //--- if(Time[bar]>=IndTime[0] && Time[bar+1]