//+------------------------------------------------------------------+ //| 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]))); 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]) < Finish[k]) { if (k == 0) { DayBar++; int j = 2; } else j = k - 1; datetime BeginDay = iTime(Symbol(), PERIOD_D1, DayBar); // Расчет времени начала суток if (!(TimeDayOfWeek(BeginDay) == 5 && k == 0)) { int StartBar = iBarShift(Symbol(), 0, BeginDay+Start[j]*3600); // Бар, соответсвующий началу суток плюс смещение в часах int FinishBar = iBarShift(Symbol(), 0, BeginDay+Finish[j]*3600)+1; // Бар, соответствующий последнему бару предыдущей сессии double LowV = Low[iLowest(Symbol(), 0, MODE_LOW, StartBar-FinishBar+1, FinishBar)]; // Нижняя граница double HighV = High[iHighest(Symbol(), 0, MODE_HIGH, StartBar-FinishBar+1, FinishBar)]; // Верхняя граница } else { LowV = 0; HighV = 0; } break; } while (TimeHour(Time[i]) >= Start[k] && TimeHour(Time[i]) < Finish[k]) { switch (k) { case 0: Up1[i] = HighV; Dn1[i] = LowV; break; case 1: Up2[i] = HighV; Dn2[i] = LowV; break; case 2: Up3[i] = HighV; Dn3[i] = LowV; break; } i--; } } //---- return(0); } //+------------------------------------------------------------------+