/* ! учитывать праздники */ #property copyright "Клименко Сергей" #property link "https://www.mql5.com" #property version "1.00" #property strict #property indicator_separate_window #property indicator_minimum 0 #property indicator_maximum 4 #import "EcLib.ex4" void ref_load( string &ref_array[][150], string &words_array[]); #import bool ref_bool[][150]; int i,j,k, market_count, GMT2local, GMT2server, server2local, ref_ID, handle_LOG, settings_file, font_size, handle_READ; MqlDateTime time_full; struct market_struct { string name; string country; datetime open; datetime close; bool off; }; market_struct market[]; string str, str2, font, market_label, market_label_text, ref[][150], words[]; //========================================INIT========================================================== int OnInit() { handle_READ = FileOpen("ec\\DB\\ec.ini", FILE_COMMON|FILE_READ|FILE_CSV, ';'); string str0; do str0 = FileReadString(handle_READ); while(str0 != "[GMT2serverShiftMin]"); GMT2server = StrToInteger(FileReadString(handle_READ))*60; FileClose(handle_READ); GMT2local = int(MathRound(TimeGMTOffset()/3600)*3600) * (- 1); //коррекция GMT->local server2local = GMT2local - GMT2server; settings_file = FileOpen("calendar\\settings.csv", FILE_COMMON|FILE_READ|FILE_CSV, ";"); market_count = 0; TimeCurrent(time_full); ref_load(ref, words); ref_ID = ArrayRange(ref, 0) - 1; ArrayResize(ref_bool, ArraySize(ref)); //обнуляем буферный справочник for(k=0; k <= ref_ID; k++) for(j=1; j < 150; j++) ref_bool[k, j] = false; while(!FileIsEnding(settings_file)) //currency { str = FileReadString(settings_file); if(FileIsLineEnding(settings_file)) break; } while(!FileIsEnding(settings_file)) //country { str = FileReadString(settings_file); if(FileIsLineEnding(settings_file)) break; } while(!FileIsEnding(settings_file)) //volatility { str = FileReadString(settings_file); if(FileIsLineEnding(settings_file)) break; } while(!FileIsEnding(settings_file)) //market { ArrayResize(market, market_count +1, 3); market[market_count].name = FileReadString(settings_file); market[market_count].country = FileReadString(settings_file); j = 1; while(ref[3, j] != NULL) { if(ref[3, j] == market[market_count].country) {ref_bool[3, j] = true; break;} j++; } time_full.hour = StrToInteger( FileReadString(settings_file)); time_full.min = StrToInteger( FileReadString(settings_file)); market[market_count].open = StructToTime(time_full); market[market_count].open += GMT2local - 3600*24; time_full.hour = StrToInteger( FileReadString(settings_file)); time_full.min = StrToInteger( FileReadString(settings_file)); market[market_count].close = StructToTime(time_full); market[market_count].close += GMT2local - 3600*24; market_count++; if(FileIsLineEnding(settings_file)) break; } FileClose(settings_file); i = 0; while(i < market_count) { if(market[i].open > market[i].close) market[i].close += 3600*24; while(market[i].close < TimeCurrent() + server2local) { market[i].open += 3600*24; market[i].close += 3600*24; } font_size = 8; font = "Tahoma"; //рисуем часы работы рынков market_label = market[i].name; market_label_text = market_label + "_text"; if (ObjectFind( market_label) == -1) ObjectCreate( market_label, OBJ_RECTANGLE, 1, market[i].open - server2local, 4 - i - 0.1, market[i].close - server2local, 3 - i); ObjectSet( market_label, OBJPROP_PRICE1, 4 - i - 0.1); ObjectSet( market_label, OBJPROP_PRICE2, 3 - i); ObjectSet( market_label, OBJPROP_TIME1, market[i].open - server2local); ObjectSet( market_label, OBJPROP_TIME2, market[i].close - server2local); ObjectSet( market_label, OBJPROP_COLOR, C'0,66,0'); ObjectSet( market_label, OBJPROP_BGCOLOR, C'0,66,0'); ObjectSetInteger(0, market_label, OBJPROP_BACK, 1); ObjectSetInteger(0, market_label, OBJPROP_SELECTABLE, 0); ObjectSetString(0, market_label, OBJPROP_TOOLTIP, market_label + " " + TimeToString(market[i].open, TIME_MINUTES) + ":" + TimeToString(market[i].close, TIME_MINUTES) + " [MSK]"); if (ObjectFind( market_label_text) == -1) ObjectCreate( market_label_text, OBJ_TEXT, 1, (market[i].open + market[i].close)/2 - server2local, 3.5 - i); ObjectSet( market_label_text, OBJPROP_PRICE1, 3.5 - i); ObjectSet( market_label_text, OBJPROP_TIME1, (market[i].open + market[i].close)/2 - server2local); ObjectSetString(0, market_label_text, OBJPROP_TEXT, market_label); ObjectSetString(0, market_label_text, OBJPROP_FONT, font); ObjectSetInteger(0, market_label_text, OBJPROP_FONTSIZE, font_size); ObjectSetInteger(0, market_label_text, OBJPROP_COLOR, clrWhite); ObjectSetInteger(0, market_label_text, OBJPROP_SELECTABLE, 0); ObjectSetInteger(0, market_label_text, OBJPROP_ANCHOR, ANCHOR_CENTER); ObjectSetInteger(0, market_label_text, OBJPROP_ALIGN, ALIGN_CENTER); ObjectSetString(0, market_label_text, OBJPROP_TOOLTIP, TimeToString(market[i].open, TIME_MINUTES) + " - " + TimeToString(market[i].close, TIME_MINUTES) + " [MSK]"); i++; }//end.while if (ObjectFind( "mh0") == -1) ObjectCreate( "mh0", OBJ_VLINE, 1, TimeCurrent(), 1); ObjectSetInteger(0, "mh0", OBJPROP_COLOR, clrLime); ObjectSetInteger(0, "mh0", OBJPROP_BACK, 1); ObjectSetInteger(0, "mh0", OBJPROP_SELECTABLE, 0); ChartRedraw(0); return(INIT_SUCCEEDED); } 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[]) { //======================================NEW_BAR==================================================== if(rates_total != prev_calculated) { //обновляем метку текущего времени ObjectSetInteger(0, "mh0", OBJPROP_TIME, TimeCurrent()); ObjectSetString( 0, "mh0", OBJPROP_TOOLTIP, TimeToString( TimeCurrent() + server2local, TIME_MINUTES) + " [MSK]"); //зажигаем и гасим рынки i = 0; while(i < market_count) { market_label = market[i].name; if((market[i].open <= (TimeCurrent()+server2local)) && (market[i].close > (TimeCurrent()+server2local))) { ObjectSet( market_label, OBJPROP_COLOR, C'0,150,0'); ObjectSet( market_label, OBJPROP_BGCOLOR, C'0,150,0'); } else { ObjectSet( market_label, OBJPROP_COLOR, C'0,50,0'); ObjectSet( market_label, OBJPROP_BGCOLOR, C'0,50,0'); } i++; } ChartRedraw(0); } return(rates_total); }