Я для себя открыл следующее: порой событие OnTick обрабатывает тики не в том временном порядке (редко но встречается). Сначала идет более поздний тик, а потом более ранний. Поэтому в советниках взял за правило самому учитывать тики, самому считать индикаторы (которые мне нужны). А "непорядочные тики" просто отбрасываю.
PS: заметил это благодаря "странному" поведению моих роботов (иногда и такое бывает). Смотришь на график и "на свою логику" - нету правила открытия, а советник открыл. Начинаешь ковыряться и искать. Обнаруживаю "такие странные тики". Если их убрать, то советник начинает работать "правильно", т.е. по моей логике.
Кусок кода приведите пожалуйста, который ловит задержки. Прямо тут, через кнопку вставки кода.
//+----------------------------------------------------------------------------+//| Проверяем не установлили ли новые рекорды. |//+----------------------------------------------------------------------------+void PitaemsayObnovitRekordi(CInformaziaOPoslednemTike &InformaziaOPoslednemTike[], int NomerSimolaS_NovimTikom )
{
//--- 1. Определяем время и символ(ипользуется только для вывода информации) самого свещего тика по всем символам.//--- 2. Вычисляем разность. Время самого свежего тика по всем символам МИНУС время последнего тика по проверяемому символу.//--- 3. Обновляем глобальные строки для функции Comment.//--- 4. Обновляем глобальные строки для функции Comment если установлен рекорд.staticlong RekordRaznosti= -1;
staticlong SymmaRaznostei= 0;
staticlong KolichestvoPolychenixNovixTikov= 0;
//--- 1. Определяем время и символ(ипользуется только для вывода информации) самого свещего тика по всем символам.long VremaySamogoSvegegoTikaPoVsemSimvolam= 0;
int IndeksSimvolaS_SamimSvegimTikom= 0;
for(int i=0; i<KolichestvoSimvolov; i++)
if( InformaziaOPoslednemTike[i].LastTick.time_msc > VremaySamogoSvegegoTikaPoVsemSimvolam ) {VremaySamogoSvegegoTikaPoVsemSimvolam= InformaziaOPoslednemTike[i].LastTick.time_msc;IndeksSimvolaS_SamimSvegimTikom=i;}
//--- 2. Вычисляем разность. Время самого свежего тика по всем символам МИНУС время последнего тика по проверяемому символу.long Rasnost= VremaySamogoSvegegoTikaPoVsemSimvolam - InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].LastTick.time_msc;
//---
SymmaRaznostei+= Rasnost;
KolichestvoPolychenixNovixTikov++;
//--- 3. Обновляем глобальные строки для функции Comment. StringConcatenate(GStrokaDlayComment[2]," Самый свежий тик ",InformaziaOPoslednemTike[IndeksSimvolaS_SamimSvegimTikom].Simvol," time_msc ",PrintMilesekond(InformaziaOPoslednemTike[IndeksSimvolaS_SamimSvegimTikom].LastTick.time_msc));
if( ((VremaySamogoSvegegoTikaPoVsemSimvolam-StartTimeMsc)/1000) != 0 )
{StringConcatenate(GStrokaDlayComment[3]," Средняя разность ",SymmaRaznostei/KolichestvoPolychenixNovixTikov," милесекунд. Количество полученных новых тиков ",KolichestvoPolychenixNovixTikov," Количество новых тиков в секунду ",KolichestvoPolychenixNovixTikov/((VremaySamogoSvegegoTikaPoVsemSimvolam-StartTimeMsc)/1000) );}
//--- 4. Обновляем глобальные строки для функции Comment если установлен рекорд. if( RekordRaznosti < Rasnost )
{
RekordRaznosti= Rasnost;
GStrokaDlayComment[4]="--------------------------------------------------------------------------------";
StringConcatenate(GStrokaDlayComment[5],"РЕКОРДная Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу ",RekordRaznosti," милесекундa.");
StringConcatenate(GStrokaDlayComment[6]," Получен НОВЫЙ тик по символу ",InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].Simvol," time_msc= ",PrintMilesekond(InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].LastTick.time_msc));
StringConcatenate(GStrokaDlayComment[7]," ХОТЯ до этого был получeн тик ",InformaziaOPoslednemTike[IndeksSimvolaS_SamimSvegimTikom].Simvol," time_msc ",PrintMilesekond(InformaziaOPoslednemTike[IndeksSimvolaS_SamimSvegimTikom].LastTick.time_msc));
StringConcatenate(GStrokaDlayComment[8]," Локальное время получения нового тика по символу. ",PrintMilesekond(InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].PoslednieVremayRaboti));
StringConcatenate(GStrokaDlayComment[9]," Предпоследние Локальное время попытки получить новый тик по символу ",PrintMilesekond(InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].PredPoslednieVremayRaboti));
GStrokaDlayComment[10]="--------------------------------------------------------------------------------";
for( int i=2; i<12; i++ )
Print(GStrokaDlayComment[i]);
}
}
Сразу бросается в глаза: Вы хотите понять запаздывает ли терминал с выдачей тиков, так? Дак почему Вы берете время по всем символам, а не по конкретному символу? Почему нельзя написать проще:
#property indicator_plots0//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
//--- indicator buffers mapping//---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[])
{
//--- Получаем время последней котировки по символуconstdatetime lastTime=(datetime)SymbolInfoInteger(_Symbol,SYMBOL_TIME);
//--- Приемник данных о последнем тикеMqlTick tick;
//--- Получение последнего тикаif(SymbolInfoTick(_Symbol,tick))
{
//--- Проводим ГРУБОЕ сравнение времени последней котировки и последнего тикаint lag=int(lastTime-tick.time);
//---Print(__FILE__,": Время прихода: последней котировки = "+TimeToString(lastTime,TIME_SECONDS)+", последнего тика = "+TimeToString(tick.time,TIME_SECONDS)+". Задержка = ",lag," сек.");
}
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
Я для себя открыл следующее: порой событие OnTick обрабатывает тики не в том временном порядке (редко но встречается). Сначала идет более поздний тик, а потом более ранний. Поэтому в советниках взял за правило самому учитывать тики, самому считать индикаторы (которые мне нужны). А "непорядочные тики" просто отбрасываю.
PS: заметил это благодаря "странному" поведению моих роботов (иногда и такое бывает). Смотришь на график и "на свою логику" - нету правила открытия, а советник открыл. Начинаешь ковыряться и искать. Обнаруживаю "такие странные тики". Если их убрать, то советник начинает работать "правильно", т.е. по моей логике.
Кусок кода приведите пожалуйста, который ловит задержки. Прямо тут, через кнопку вставки кода.
Сам советник отлавливающий задержки.
Сам советник отлавливающий задержки.
Сразу бросается в глаза: Вы хотите понять запаздывает ли терминал с выдачей тиков, так? Дак почему Вы берете время по всем символам, а не по конкретному символу? Почему нельзя написать проще:
Вы хотите понять запаздывает ли терминал с выдачей тиков, так?
Да именно так. Задержки в полторы минуты в получении тиков не допустимы.
Я честно говоря не понимаю, что за время возвращает SymbolInfoInteger(_Symbol,SYMBOL_TIMЕ) ? Что это за время последней котировки ?
Да именно так. Задержки в полторы минуты в получении тиков не допустимы.
Это время прихода последней котировки по текущему (в моем примере) символу. Это же время Вы можете увидеть здесь:
А SymbolInfoInteger() возвращает свойство указанного символа.
Что такое котировка ? Я вчера только смотрел эту функцию и в документации и на форуме. Что она возвращает совершенно не понятно.
Новая котировка - новое изменение цены. Т.е. изменение бида и/или аска.
Новая котировка - новое изменение цены. Т.е. изменение бида и/или аска.
В обзоре рынке ещё есть столбцы "Объем" "Последняя сделка " Есть подозрения, что эта функция просто возвращает .time последнего тика.
В обзоре рынке ещё есть столбцы "Объем" "Последняя сделка " Есть подозрения, что эта функция просто возвращает .time последнего тика.
А Вы знаете, что тики бывают разные? Что тики делятся на торговые/информационные?
А Вы знаете, что тики бывают разные? Что тики делятся на торговые/информационные?