Vitaly Gorbunov: А вроде я понял! Индюк запускается сразу вместе с терминалом? Если да то перед проверкой дождитесь что есть связь с сервером IsConnected() у вас очень быстрый таймер он не успевает синхронизироваться!
Хорошая попытка. Уже было начал думать, что это сработает. Но... нет:
2018.09.2115:16:40.519 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: removed
2018.09.2115:32:29.397 Custom indicator test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: loaded successfully
2018.09.2115:32:29.415 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: initialized
2018.09.2115:32:29.508 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.532 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.557 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.587 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.620 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.651 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.683 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.716 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.743 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.776 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.807 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.841 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.872 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.901 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.935 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.972 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:29.996 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: OnTimer: Связь отсутствует!
2018.09.2115:32:30.059 test_isNewDayInTimer_iBarShirt() EURGBP.e,M5: test_isNewDayInTimer_iBarShirt().mq4: Актуальное время открытия бара М15 = 2018.09.2113:15. Ошибка #0
//+------------------------------------------------------------------+//| Timer function |//+------------------------------------------------------------------+voidOnTimer()
{
if( !IsConnected() )
{
Print( __FUNCTION__,": Связь отсутствует!" );
return;
}
//--- Проверяем, записано ли время открытия текущего бара М15if(!CheckCurrentM15OpenTime()) // Если время не записаноreturn; // Выходим
}
А вроде я понял! Индюк запускается сразу вместе с терминалом? Если да то перед проверкой дождитесь что есть связь с сервером IsConnected() у вас очень быстрый таймер он не успевает синхронизироваться!
Или сделай вот так
Но придётся учитывать разницу между Серверным временем и локальным. Отпишись по результатам!
Костыли я точно городить не собираюсь. Тут на лицо явная ошибка в языке! Ждем разработчиков...
Очень интересно, по идее должно работать. Но опять таки очень быстрый таймер возможно терминал не успевает начать принимать котировки. Надо подумать. А если сделать нормальный таймер секунд на 5-ть для проверки идеи?
Очень интересно, по идее должно работать. Но опять таки очень быстрый таймер возможно терминал не успевает начать принимать котировки. Надо подумать. А если сделать нормальный таймер секунд на 5-ть для проверки идеи?
А мне не нужен "подгон" под проверку идеи. В реальных условиях нужен максимально быстрый таймер.
//+------------------------------------------------------------------+//| ProjectName |//| Copyright 2012, CompanyName |//| http://www.companyname.net |//+------------------------------------------------------------------+#property version"1.00"#property strict#property indicator_chart_windowdatetime ChkTime;
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+//--- Время открытия текущего часа, дня и неделиdatetime _m15OpenTime=0;
//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//Сохраняем старое время
ChkTime=TimeCurrent();
//--- Запускаем таймерif(!EventSetMillisecondTimer(20))
{
Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": таймер с частотой 20 ms не установлен!");
return( INIT_FAILED );
}
//--- Сбрасываем время открытия текущего бара м15
_m15OpenTime=0;
//---return( INIT_SUCCEEDED );
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
return( rates_total );
}
//+------------------------------------------------------------------+//| Timer function |//+------------------------------------------------------------------+voidOnTimer()
{
if(!IsConnected())
{
Print(__FUNCTION__,": Связь отсутствует!");
return;
}
//Если есть соединение проверяем что прошла синхронизация времни if(IsConnected() && ChkTime==TimeCurrent())
{
return;
}
//--- Проверяем, записано ли время открытия текущего бара М15if(!CheckCurrentM15OpenTime()) // Если время не записаноreturn;// Выходим
}
//+------------------------------------------------------------------+//| Проверяем, записано ли время открытия текущего бара М15 |//+------------------------------------------------------------------+bool CheckCurrentM15OpenTime()
{
//--- Проверяем, записано ли времяif(_m15OpenTime==0) // Если время не записано
{
//---ResetLastError();
if(iBarShift(Symbol(),PERIOD_M15,TimeCurrent(),true)==-1)
{
Print(__FILE__+": Данные истории по последнему часу отсутствуют! Ошибка #",GetLastError());
return( false );
}
//---if(GetLastError()==ERR_NO_ERROR)
{
ResetLastError();
//--- Запоминаем время открытия бара
_m15OpenTime=iTime(NULL,PERIOD_M15,0);
//---Print(__FILE__,": Актуальное время открытия бара М15 = "+TimeToString(_m15OpenTime)+". Ошибка #",GetLastError());
//--- Возвращаем истинуreturn( true );
}
elsereturn( false );
}
//--- Время открытия недели ранее записано. Возвращаем истинуreturn( true );
}
//+------------------------------------------------------------------+
2018.09.2115:02:42.910 Custom indicator test XAUUSD,H1: removed
2018.09.2115:15:27.985 test XAUUSD,H1: initialized
2018.09.2115:15:29.520 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.552 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.589 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.605 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.636 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.667 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.705 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.736 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.768 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.805 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.837 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.868 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.906 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.937 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:29.969 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:30.006 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:30.038 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:30.069 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:30.106 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:30.138 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:30.169 test XAUUSD,H1: OnTimer: Связь отсутствует!
2018.09.2115:15:31.880 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #40662018.09.2115:15:31.900 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:31.940 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:31.990 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:32.010 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:32.074 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:32.100 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:32.120 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:32.174 test XAUUSD,H1: test.mq4: Данные истории по последнему часу отсутствуют! Ошибка #02018.09.2115:15:32.274 test XAUUSD,H1: test.mq4: Актуальное время открытия бара М15 = 2018.09.2115:15. Ошибка #0
Опять костыль. Вы пытаетесь решить проблему любыми методами, даже нерациональными, игнорируя причину проблемы - ошибки языка. Я считаю, так делать не стоит.
Добавлено:
Да, похоже такой прием работает. Как вариант использовать можно. Спасибо! Но, все таки хотелось бы нормальной работы функций.
Ну я бы не сказал что это костыль. Я ожидаю потока котировок от сервера иначе история не будет обновлена. Другой вариант это брать локальное время компьютера вводить поправку на тайм зону, которую можно высчитывать автоматически и в конце концов всё равно ждать обновления котировок. Да немного кривовато но не думаю что Метаквотовцы будут что то менять в МТ4. В конце концов эта проблема коннекта к серверу которую надо обрабатывать так или иначе.
Сначала ответ @Ihor Herasko. Код для воспроизведения:
Результат:
По записям лога. Терминал был выключен в 14:25. Далее, включен в 14:30. Проверяем время бара М15. Запуск с ТФ М1. Индикатор (код выше) показал актуальное время открытия 12:15 (терминальное время, отстает от моего локального на 2 часа). Должен был получен результат 12:30! Вывод - ошибка присутствует. И данный метод, предложенный @Ihor Herasko не работает.
В Вашем подходе к проверке имеется две существенные ошибки:
В OnInit() индикатора невозможно получить корректные данные какого-либо ТФ, даже текущего. OnInit() индикатора при старте терминала выполняется практически в пустом окне (там может не быть даже тех данных, которые были на момент выключения терминала). Даже рыночное окружение зачастую еще недоступно. В справке достаточно много предупреждений насчет того, чего не стоит делать в OnInit(). Поэтому в ее код мало, что можно включать. Обычно это проверка значений настроечных параметров, связывание буферов индикатора с массивами и создание классов, если таковые используются. Все остальное приходится делать в OnCalculate().
Все подобные проверки можно делать только после того, как хотя бы один раз произошел вызов OnCalculate.
А вроде я понял! Индюк запускается сразу вместе с терминалом? Если да то перед проверкой дождитесь что есть связь с сервером IsConnected() у вас очень быстрый таймер он не успевает синхронизироваться!
Хорошая попытка. Уже было начал думать, что это сработает. Но... нет:
В предыдущем коде функцию OnTimer() заменил на эту:
А вроде я понял! Индюк запускается сразу вместе с терминалом? Если да то перед проверкой дождитесь что есть связь с сервером IsConnected() у вас очень быстрый таймер он не успевает синхронизироваться!
Или сделай вот так
Но придётся учитывать разницу между Серверным временем и локальным. Отпишись по результатам!Костыли я точно городить не собираюсь. Тут на лицо явная ошибка в языке! Ждем разработчиков...
Очень интересно, по идее должно работать. Но опять таки очень быстрый таймер возможно терминал не успевает начать принимать котировки. Надо подумать. А если сделать нормальный таймер секунд на 5-ть для проверки идеи?
Очень интересно, по идее должно работать. Но опять таки очень быстрый таймер возможно терминал не успевает начать принимать котировки. Надо подумать. А если сделать нормальный таймер секунд на 5-ть для проверки идеи?
А мне не нужен "подгон" под проверку идеи. В реальных условиях нужен максимально быстрый таймер.
Очень интересно, по идее должно работать.
Вы всегда можете запустить индикатор у себя в терминале, подождать 15 минут и отписаться по результатам.
Ок но у меня ещё другой работы полно. Как только появиться пауза проведу эксперемент.
И вроде у меня даже появилась идея как это отлавливать.
Попробуй вот так!
Попробуй вот так!
Опять костыль. Вы пытаетесь решить проблему любыми методами, даже нерациональными, игнорируя причину проблемы - ошибки языка. Я считаю, так делать не стоит.
Добавлено:
Да, похоже такой прием работает. Как вариант использовать можно. Спасибо! Но, все таки хотелось бы нормальной работы функций.
Сначала ответ @Ihor Herasko. Код для воспроизведения:
Результат:
По записям лога. Терминал был выключен в 14:25. Далее, включен в 14:30. Проверяем время бара М15. Запуск с ТФ М1. Индикатор (код выше) показал актуальное время открытия 12:15 (терминальное время, отстает от моего локального на 2 часа). Должен был получен результат 12:30! Вывод - ошибка присутствует. И данный метод, предложенный @Ihor Herasko не работает.
В Вашем подходе к проверке имеется две существенные ошибки: