//--- Связь с основным файлом индикатора //#include "..\MultiSymbolPriceDivergence.mq5" //--- Подключаем свои библиотеки #include "SettingChart.mqh" #include "SetDeleteObjects.mqh" //+------------------------------------------------------------------+ //| Загружает и формируем необходимое/имеющееся кол-во данных | //+------------------------------------------------------------------+ void LoadFormationData() { int try =10; // Количество удачных попыток int number_bars =100; // Количество подгружаемых баров //--- for(int s=0; sPeriodSeconds()*number_bars) { datetime copied_time[]; //--- Получим первую дату символа-периода в базе терминала for(int i=0; iserver_firstdate && series_firstdate-server_firstdate>PeriodSeconds(timeframe_start_point)*number_bars) { datetime copied_time[]; //--- Получим первую дату символа-периода в базе терминала for(int i=0; i=total_period_bars) break; } } //--- Если скопировано меньше данных // значит нужно совершить ещё одну попытку if(ArraySize(time)==0 || ArraySize(time)0) break; //--- Получим количество доступных баров от указанной даты for(int i=0; i0) break; //--- Проверим готовность данных баров // Скопируем указанное количество данных for(int i=0; i0) break; //--- Если скопировано меньше данных // значит нужно совершить ещё одну попытку if(ArraySize(time)<=0 || total_period_bars<=0) { message_last=message_data_available; ShowCanvasMessage(message_data_available); on_calc_prev_calculated=0; return(false); } } //--- return(true); } //+------------------------------------------------------------------+ //| Проверка события загрузки более глубокой истории | //+------------------------------------------------------------------+ bool CheckEventLoadHistory() { bool load=false; //--- for(int s=0; sseries_first_date[s]) { //--- Выведем сообщение в журнал Print("(",symbols_names[s],",",TimeframeToString(Period()), ") > Была загружена/сформирована более глубокая история: ", series_first_date_last[s]," > ",series_first_date[s]); //--- Запомним дату series_first_date_last[s]=series_first_date[s]; load=true; } } } } //--- Если была загружена/сформирована более глубокая история, то // отправим команду на обновление графических серий индикатора if(load) return(false); //--- return(true); } //+------------------------------------------------------------------+ //| Проверяет синхронизированность по символу/периоду | //+------------------------------------------------------------------+ bool CheckSymbolIsSynchronized() { //--- Если есть соединение с сервером, то // проверим синхронизированность данных if(TerminalInfoInteger(TERMINAL_CONNECTED)) { for(int s=0; s=0; s--) { //--- Имя символа на сервере nm_symbol=SymbolName(s,false); //--- Если есть такой символ, то if(nm_symbol==symbol) { //--- установим его в окно Обзор Рынка и SymbolSelect(nm_symbol,true); //--- вернём его имя return(symbol); } } //--- Если такого символа нет, то // вернём строку символизирующую отсутствие символа return(empty_symbol); } //+------------------------------------------------------------------+ //| Проверка на использование индикатора в тестере | //+------------------------------------------------------------------+ bool CheckTesterMode() { //--- Если индикатор был запущен в тестере, то сообщим, что // он не предназначен для использования в тестере if(MQL5InfoInteger(MQL5_TESTER) || MQL5InfoInteger(MQL5_VISUAL_MODE) || MQL5InfoInteger(MQL5_OPTIMIZATION)) { Comment("На данный момент индикатор <- "+PROGRAM_NAME+" -> не предназначен для использования в тестере!"); return(false); } //--- return(true); } //+------------------------------------------------------------------+ //| Проверяет входные параметры на корректность | //+------------------------------------------------------------------+ bool CheckInputParameters() { //--- Если сейчас режим не вертикальной линии if(StartPriceDivergence!=VERT_LINE) { //--- Если текущий период больше либо равен // указанному для начальной точки расхождения цен, сообщим об этом и выйдем if(PeriodSeconds()>=PeriodSeconds(timeframe_start_point)) { Print("Текущий таймфрейм должен быть меньше, чем в параметре Start Price Divergence!"); Comment("Текущий таймфрейм должен быть меньше, чем в параметре Start Price Divergence!"); return(false); } } //--- return(true); } //+------------------------------------------------------------------+ //| Следит за размерами канвы | //+------------------------------------------------------------------+ void EventChartChange() { //--- Получим свойства окна SetSubwindowProperties(); //--- Если размеры окна не изменились, выйдем if(!CheckChartSize()) return; //--- Если размер окна меньше одного пикселя или // центр рассчитан некорректно, выйдем if(chart_height<1 || chart_vcenter<1) return; //--- Установим новый размер канве ResizeCanvas(); //--- Покажем последнее сообщение ShowCanvasMessage(message_last); } //+------------------------------------------------------------------+ //| Проверим размеры графика | //+------------------------------------------------------------------+ bool CheckChartSize() { //--- Если размеры графика не изменились, выйдем if(last_chart_width==chart_width && last_chart_height==chart_height) return(false); //--- Если же изменились, то запомним их else { last_chart_width=chart_width; last_chart_height=chart_height; } //--- return(true); } //+------------------------------------------------------------------+ //| Проверяет пустые значения | //+------------------------------------------------------------------+ bool CheckEmptyValues() { if(MQL5InfoInteger(MQL5_VISUAL_MODE)) return(true); //--- for(int s=0; s1000) { count_empty=0; on_calc_prev_calculated=0; return(false); } //--- if(symbols_names[s]!=empty_symbol) { for(int i=on_calc_rates_total-500; i