//+------------------------------------------------------------------+ //| ShadeOpen.mq5 | //| Copyright © 2017, Nikolay Kositsin | //| Khabarovsk, farria@mail.redcom.ru | //+------------------------------------------------------------------+ #property copyright "Copyright © 2017, Nikolay Kositsin" #property link "farria@mail.redcom.ru" //--- номер версии индикатора #property version "1.60" #property description "Индикатор ночных ссесий в виде свечек." //--- отрисовка индикатора в основном окне #property indicator_chart_window //--- количество индикаторных буферов 6 #property indicator_buffers 6 //--- использовано три графических построения #property indicator_plots 3 //+----------------------------------------------+ //| объявление констант | //+----------------------------------------------+ #define RESET 0 // Константа для возврата терминалу команды на пересчет индикатора #define INDICATOR_NAME "ShadeOpen" // Константа для имени индикатора #define EMPTYVALUE 0 // Константа для неотображаемых значений индикатора //+----------------------------------------------+ //| Параметры отрисовки индикатора 1 | //+----------------------------------------------+ //--- отрисовка индикатора в виде цветного облака #property indicator_type1 DRAW_FILLING //--- в качестве цвета индикатора использованы #property indicator_color1 clrPaleGreen,clrYellow //--- линия индикатора - непрерывная кривая #property indicator_style1 STYLE_SOLID //--- отображение метки индикатора #property indicator_label1 "Upper Shade" //+----------------------------------------------+ //| Параметры отрисовки индикатора 2 | //+----------------------------------------------+ //--- отрисовка индикатора в виде цветного облака #property indicator_type2 DRAW_FILLING //--- в качестве цвета индикатора использованы #property indicator_color2 clrLimeGreen,clrDarkOrange //--- линия индикатора - непрерывная кривая #property indicator_style2 STYLE_SOLID //--- отображение метки индикатора #property indicator_label2 "Body" //+----------------------------------------------+ //| Параметры отрисовки индикатора 3 | //+----------------------------------------------+ //--- отрисовка индикатора в виде цветного облака #property indicator_type3 DRAW_FILLING //--- в качестве цвета индикатора использован #property indicator_color3 clrPaleGreen,clrYellow //--- линия индикатора - непрерывная кривая #property indicator_style3 STYLE_SOLID //--- отображение метки индикатора #property indicator_label3 "Lower Shade" //+------------------------------------------------------------------+ //| Объявление перечисления часов суток | //+------------------------------------------------------------------+ enum HOURS { ENUM_HOUR_0=0, //0 ENUM_HOUR_1, //1 ENUM_HOUR_2, //2 ENUM_HOUR_3, //3 ENUM_HOUR_4, //4 ENUM_HOUR_5, //5 ENUM_HOUR_6, //6 ENUM_HOUR_7, //7 ENUM_HOUR_8, //8 ENUM_HOUR_9, //9 ENUM_HOUR_10, //10 ENUM_HOUR_11, //11 ENUM_HOUR_12, //12 ENUM_HOUR_13, //13 ENUM_HOUR_14, //14 ENUM_HOUR_15, //15 ENUM_HOUR_16, //16 ENUM_HOUR_17, //17 ENUM_HOUR_18, //18 ENUM_HOUR_19, //19 ENUM_HOUR_20, //20 ENUM_HOUR_21, //21 ENUM_HOUR_22, //22 ENUM_HOUR_23 //23 }; //+------------------------------------------------------------------+ //| Объявление перечисления минут часов | //+------------------------------------------------------------------+ enum MINUTS { ENUM_MINUT_0=0, //0 ENUM_MINUT_1, //1 ENUM_MINUT_2, //2 ENUM_MINUT_3, //3 ENUM_MINUT_4, //4 ENUM_MINUT_5, //5 ENUM_MINUT_6, //6 ENUM_MINUT_7, //7 ENUM_MINUT_8, //8 ENUM_MINUT_9, //9 ENUM_MINUT_10, //10 ENUM_MINUT_11, //11 ENUM_MINUT_12, //12 ENUM_MINUT_13, //13 ENUM_MINUT_14, //14 ENUM_MINUT_15, //15 ENUM_MINUT_16, //16 ENUM_MINUT_17, //17 ENUM_MINUT_18, //18 ENUM_MINUT_19, //19 ENUM_MINUT_20, //20 ENUM_MINUT_21, //21 ENUM_MINUT_22, //22 ENUM_MINUT_23, //23 ENUM_MINUT_24, //24 ENUM_MINUT_25, //25 ENUM_MINUT_26, //26 ENUM_MINUT_27, //27 ENUM_MINUT_28, //28 ENUM_MINUT_29, //29 ENUM_MINUT_30, //30 ENUM_MINUT_31, //31 ENUM_MINUT_32, //32 ENUM_MINUT_33, //33 ENUM_MINUT_34, //34 ENUM_MINUT_35, //35 ENUM_MINUT_36, //36 ENUM_MINUT_37, //37 ENUM_MINUT_38, //38 ENUM_MINUT_39, //39 ENUM_MINUT_40, //40 ENUM_MINUT_41, //41 ENUM_MINUT_42, //42 ENUM_MINUT_43, //43 ENUM_MINUT_44, //44 ENUM_MINUT_45, //45 ENUM_MINUT_46, //46 ENUM_MINUT_47, //47 ENUM_MINUT_48, //48 ENUM_MINUT_49, //49 ENUM_MINUT_50, //50 ENUM_MINUT_51, //51 ENUM_MINUT_52, //52 ENUM_MINUT_53, //53 ENUM_MINUT_54, //54 ENUM_MINUT_55, //55 ENUM_MINUT_56, //56 ENUM_MINUT_57, //57 ENUM_MINUT_58, //58 ENUM_MINUT_59 //59 }; //+----------------------------------------------+ //| Входные параметры индикатора | //+----------------------------------------------+ input HOURS StartH=ENUM_HOUR_6; //Старт торговли (Часы) input MINUTS StartM=ENUM_MINUT_30; //Старт торговли (Минуты) input HOURS EndH=ENUM_HOUR_13; //Окончание торговли (Часы) input MINUTS EndM=ENUM_MINUT_5; //Окончание торговли (Минуты) input int Shift=0; //Сдвиг индикатора по горизонтали в барах //+----------------------------------------------+ //--- объявление динамических массивов, которые в дальнейшем //--- будут использованы в качестве индикаторных буферов double ExtA1Buffer[]; double ExtB1Buffer[]; double ExtA2Buffer[]; double ExtB2Buffer[]; double ExtA3Buffer[]; double ExtB3Buffer[]; //--- объявление целочисленных переменных начала отсчета данных int min_rates_total; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- проверка входных переменных if(StartH>EndH || (StartH==EndH && StartM>=EndM)) { Print("Неверные значения входных переменных старта и окончания торговли!"); return(INIT_PARAMETERS_INCORRECT); } //--- инициализация переменных min_rates_total=2; //--- превращение динамических массивов в индикаторные буферы ArrayInit(0,ExtA1Buffer); ArrayInit(1,ExtB1Buffer); ArrayInit(2,ExtA2Buffer); ArrayInit(3,ExtB2Buffer); ArrayInit(4,ExtA3Buffer); ArrayInit(5,ExtB3Buffer); //--- инициализация индикаторов PlotInit(0,2,Shift); PlotInit(1,2,Shift); PlotInit(2,2,Shift); //--- создание имени для отображения в отдельном подокне и во всплывающей подсказке IndicatorSetString(INDICATOR_SHORTNAME,INDICATOR_NAME); //--- определение точности отображения значений индикатора IndicatorSetInteger(INDICATOR_DIGITS,_Digits); //--- завершение инициализации 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(rates_totalrates_total || prev_calculated<=0) // проверка на первый старт расчёта индикатора limit=rates_total-min_rates_total-1; // стартовый номер для расчёта всех баров else limit=rates_total-prev_calculated+lshift; // стартовый номер для расчёта новых баров //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries(open,true); ArraySetAsSeries(high,true); ArraySetAsSeries(low,true); ArraySetAsSeries(close,true); ArraySetAsSeries(time,true); //---- основной цикл расчёта индикатора for(int bar=limit; bar>=0 && !IsStopped(); bar--) { if(!ShadeOpenCheck(time[bar])) { ExtA1Buffer[bar]=EMPTYVALUE; ExtB1Buffer[bar]=EMPTYVALUE; ExtA2Buffer[bar]=EMPTYVALUE; ExtB2Buffer[bar]=EMPTYVALUE; ExtA3Buffer[bar]=EMPTYVALUE; ExtB3Buffer[bar]=EMPTYVALUE; lshift=NULL; continue; } else { datetime Start=GetShadeOpenStart(time[bar]); datetime End=MathMin(GetShadeOpenEnd(time[bar]),time[0]); double iOpen[1],iClose[1],iHigh[],iLow[]; //---- индексация элементов в массивах как в таймсериях ArraySetAsSeries(iHigh,true); ArraySetAsSeries(iLow,true); //---- if(CopyOpen(Symbol(),PERIOD_CURRENT,Start,1,iOpen)<=0) return(RESET); if(CopyHigh(Symbol(),PERIOD_CURRENT,Start,End,iHigh)<=0) return(RESET); if(CopyLow(Symbol(),PERIOD_CURRENT,Start,End,iLow)<=0) return(RESET); if(CopyClose(Symbol(),PERIOD_CURRENT,End,1,iClose)<=0) return(RESET); //---- double ihigh=iHigh[ArrayMaximum(iHigh,0,WHOLE_ARRAY)]; double ilow=iLow[ArrayMinimum(iLow,0,WHOLE_ARRAY)]; //---- if(iClose[0]>=iOpen[0]) { ExtA1Buffer[bar]=ihigh; ExtB1Buffer[bar]=iClose[0]; ExtA2Buffer[bar]=iClose[0]; ExtB2Buffer[bar]=iOpen[0]; ExtA3Buffer[bar]=iOpen[0]; ExtB3Buffer[bar]=ilow; } else { ExtB1Buffer[bar]=ihigh; ExtA1Buffer[bar]=iClose[0]; ExtA2Buffer[bar]=iClose[0]; ExtB2Buffer[bar]=iOpen[0]; ExtB3Buffer[bar]=iOpen[0]; ExtA3Buffer[bar]=ilow; } lshift=bar; } } //---- return(rates_total); } //+------------------------------------------------------------------+ //| Определение сигналов для торговли в периоде | //+------------------------------------------------------------------+ bool ShadeOpenCheck(datetime ChkTime) { //---- Объявление переменной для разрешения торговли bool Trade=false; MqlDateTime tm; TimeToStruct(ChkTime,tm); if(StartH=StartM) Trade=true; if(tm.hour>StartH && tm.hourStartH && tm.hour==EndH && tm.min=StartM && tm.min