//+------------------------------------------------------------------+ //| SessionsFlat.mq4 | //| Scriptong | //| | //+------------------------------------------------------------------+ #property copyright "Scriptong" #property link "" #property indicator_chart_window #property indicator_buffers 6 #property indicator_color1 Yellow #property indicator_color2 Yellow #property indicator_color3 Blue #property indicator_color4 Blue #property indicator_color5 Red #property indicator_color6 Red extern int AzianFlatStart=0; extern int AzianFlatEnd=8; extern int EuropeanFlatStart=8; extern int EuropeanFlatEnd=16; extern int AmericanFlatStart=16; extern int AmericanFlatEnd= 24; extern double TargetLevel = 161.8; extern color UpColor = Turquoise; extern color DnColor = Red; extern color TargetUpColor = Gold; extern color TargetDnColor = Silver; //---- buffers double Up1[],Up2[],Up3[]; double Dn1[],Dn2[],Dn3[]; double TargetUp[]; double TargetDn[]; bool Activate=False; int Start[3],Finish[3]; //+-------------------------------------------------------------------------------------+ //| Custom indicator initialization function | //+-------------------------------------------------------------------------------------+ int init() { // - 1 - === Проверка правильности периода графика ====================================== if(Period()>PERIOD_H1) { Comment("Индикатор работает на таймфреймах меньше H4!"); return(0); } // - 1 - === Окончание блока ============================================================ // - 2 - == Обновление данных дневного ТФ =============================================== Comment("Подождите, идет обновление данных дневного таймфрейма..."); int P=0; while(P<120) { iTime(Symbol(),PERIOD_D1,0); if(GetLastError()!=4066) break; Sleep(1000); P++; } if(P==120) { Comment("Обновление данных завершилось с ошибкой. Советник отключен!"); Print("Обновление данных завершилось с ошибкой. Советник отключен!"); return(0); } Comment(""); // - 2 - == Окончание блока ============================================================= // - 3 - === Перекомпоновка времени сессий в массивы и проверка корректности данных ===== if(!ToArray(0,AzianFlatStart,AzianFlatEnd) || !ToArray(1,EuropeanFlatStart,EuropeanFlatEnd) || !ToArray(2,AmericanFlatStart,AmericanFlatEnd)) return(0); // - 3 - === Окончание блока ============================================================ // - 4 - === Инициализация буферов индикатора =========================================== SetIndexStyle(0,DRAW_ARROW); // Азиатская сессия SetIndexBuffer(0,Up1); SetIndexArrow(0,108); SetIndexStyle(1,DRAW_ARROW); SetIndexBuffer(1,Dn1); SetIndexArrow(1,108); SetIndexStyle(2,DRAW_ARROW); // Европейская сессия SetIndexBuffer(2,Up2); SetIndexArrow(2,108); SetIndexStyle(3,DRAW_ARROW); SetIndexBuffer(3,Dn2); SetIndexArrow(3,108); SetIndexStyle(4,DRAW_ARROW); // Американская сессия SetIndexArrow(4,108); SetIndexBuffer(4,Up3); SetIndexStyle(5,DRAW_ARROW); SetIndexBuffer(5,Dn3); SetIndexArrow(5,108); SetIndexEmptyValue(0, 0.0); SetIndexEmptyValue(1, 0.0); SetIndexEmptyValue(2, 0.0); SetIndexEmptyValue(3, 0.0); SetIndexEmptyValue(4, 0.0); SetIndexEmptyValue(5, 0.0); // - 4 - === Окончание блока ============================================================ Activate=True; // инициализация прошла успешно return(0); } //+------------------------------------------------------------------+ //| Перекомпоновка входных параметров в массив | //+------------------------------------------------------------------+ bool ToArray(int Num,int St,int End) { if(St<0 || End<0 || St>24 || End>24 || St>=End) { Comment("Значения времени Start и End должны лежать в диапазоне от 0 до 24 и Start < End."); Print("Значения времени Start и End должны лежать в диапазоне от 0 до 24 и Start < End."); return(False); } int i=Num-1; while(i>=0) { if(Start[i]>=St || Finish[i]>=End || Finish[i]>St) { Comment("Обнаружено пересечение сессий. Индикатор работать не будет."); Print("Обнаружено пересечение сессий. Индикатор работать не будет."); return(False); } i--; } Start[Num]=St; Finish[Num]=End; return(True); } //+------------------------------------------------------------------+ //| Custom indicator deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- // Удаление объектов-ценовых меток for(int i=ObjectsTotal()-1; i>=0; i--) { string Name=ObjectName(i); if(StringSubstr(Name,0,3)=="Lab") ObjectDelete(Name); } Comment(""); //---- return(0); } //+-------------------------------------------------------------------------------------+ //| Custom indicator iteration function | //+-------------------------------------------------------------------------------------+ int start() { //---- if(!Activate) return(0); // int counted_bars=IndicatorCounted(); // if (counted_bars>0) counted_bars--; //int i = iBarShift(Symbol(), 0, iTime(Symbol(), PERIOD_D1, // iBarShift(Symbol(), PERIOD_D1, Time[Bars-counted_bars]))); int counted_bars=IndicatorCounted(); if(counted_bars<0) return(-1); if(counted_bars>0) counted_bars--; int i=Bars-counted_bars; if(counted_bars==0) i--; while(i>=0) { Up1[i] = 0.0; Up2[i] = 0.0; Up3[i] = 0.0; Dn1[i] = 0.0; Dn2[i] = 0.0; Dn3[i] = 0.0; int DayBar=iBarShift(Symbol(),PERIOD_D1,Time[i]); // Номер бара на D1 int k = 0; for(k = 0; k < 3; k++) if(TimeHour(Time[i])>=Start[k] && TimeHour(Time[i])-1 && ind2>-1) { double LowV=Low[ind1]; // Нижняя граница double HighV=High[ind2]; // Верхняя граница } } else { LowV=0; HighV=0; } break; } while(i>=0) { if(!(TimeHour(Time[i])>=Start[k])) break; if(!(TimeHour(Time[i])