ЗЫ Хорошо бы избавить от зависаний, что в течение нескольких месяцев происходят. Запустите этот скрипт на машине с бесконечной ОЗУ. Например, я не могу закачать тики с 1-го июня всего по одному символу. Просто висит CopyTicks с нулевым потреблением ресурсов.
// Измеряет размер лага между приходом тика на MT5-сервер и MT5-Терминал.// Запускать на той же машине, на которой установлен MT5-сервер.
Было обработано 100 тиков. Лаг прихода между сервером и Терминалом тиков колеблется от одной до восьми миллисекунд. В среднем - немного больше четырех миллисекунд. Это как раз равно отставанию срабатывания TP-ордеров, с которого началась эта ветка.
Сам лаг находится внутри MT5-сервера. Канал Server->Terminal не при чем.
Большая просьба разработчиков устранить этот лаг. Сейчас на биржах при нулевом пинге имеем постоянное приличное запаздывание прихода тиков не только в Терминал, но и на Сервере. В частности, акцепты ордеров.
Информация о счете - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Неожиданно нарвался на отсутствие тика в истории, несмотря на то, что он приходил в Обзор рынка: SymbolInfoTick.
Запустил параллельный Терминал, в котором tkc не формировался Терминалом, а закачался с Сервера.
На скрине этот Терминал слева - тик присутствует. А на другом Терминале (справа) - нет!
Получается, что сам Терминал не все приходящие тики запихивает в историю тиков. И если хотите историю без пропусков, то сейчас нужно прибивать tkc-файл и тянуть его с Сервера.
// Попытка поймать тик, который не попал в историю тиков.// Сравнение двух тиков.bool IsEqual( constMqlTick &Tick1, constMqlTick &Tick2 )
{
return((Tick1.time_msc == Tick2.time_msc) &&
!NormalizeDouble(Tick1.bid - Tick2.bid, _Digits) &&
!NormalizeDouble(Tick1.ask - Tick2.ask, _Digits));
}
// Проверяет наличие тика в истории.bool IsHistory( constMqlTick &Tick )
{
bool Res = false;
MqlTick Ticks[];
constint Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, Tick.time_msc, Tick.time_msc + 1);
for (int i = 0; !Res && (i < Size); i++)
Res = IsEqual(Tick, Ticks[i]);
return(Res);
}
voidOnTick()
{
staticMqlTick Ticks[];
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick)) // Взяли текущий тик.
{
constint Size = ArrayResize(Ticks, ArraySize(Ticks) + 1);
Ticks[Size - 1] = Tick; // Дописали его в массивMqlTick HistoryTick[1];
if (CopyTicks(_Symbol, HistoryTick, COPY_TICKS_ALL, 0, 1) > 0) // Взяли последний исторический тик
{
int i = 0;
while ((i < Size) && (Ticks[i].time_msc < HistoryTick[0].time_msc)) // Если исторический тик пришел позже проверяемого
{
if (!IsHistory(Ticks[i])) // Если в истории тиков нет проверяемого тика,
{
Alert("!IsHistory(Ticks[i]) == true");
ArrayPrint(Ticks, _Digits, NULL, i, 1, ARRAYPRINT_HEADER); // выводим его.
}
i++;
}
ArrayRemove(Ticks, 0, i); // Удалили тики, что проверили.
}
}
}
Такой советник поймать пропущенные в истории тики не смог. Боевой - ловил. Видимо, эти тики не инициируют OnTick.
Сами пропущенные тики могут быть актуальными десяток миллисекунд.
В зависимости от того, какой интервал запрашиваешь, tkc может меняться (синхронизироваться с Сервером). Поэтому некоторые тики, что отсутствовали до запроса, могут начать присутствовать.
Несмотря на это, удалось все же выявить несколько на разных символах. Пришлось применять фильтр флагов, т.к. очень сильно они у тиков отличаются на разных Терминалах.
Вот так выглядят различия.
EURJPY.
USDCHF
В общем, при торговле в реальном времени в близкой истории тиков может не быть некоторых тиков, что приходили в Терминал и есть на Сервере.
ЗЫ Хорошо бы избавить от зависаний, что в течение нескольких месяцев происходят. Запустите этот скрипт на машине с бесконечной ОЗУ. Например, я не могу закачать тики с 1-го июня всего по одному символу. Просто висит CopyTicks с нулевым потреблением ресурсов.
b2699 - исправлено, Спасибо.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Акцептирование SL/TP-ордеров
fxsaber, 2020.12.11 09:17
// Измеряет размер лага между приходом тика на MT5-сервер и MT5-Терминал. // Запускать на той же машине, на которой установлен MT5-сервер.Было обработано 100 тиков. Лаг прихода между сервером и Терминалом тиков колеблется от одной до восьми миллисекунд. В среднем - немного больше четырех миллисекунд. Это как раз равно отставанию срабатывания TP-ордеров, с которого началась эта ветка.
Сам лаг находится внутри MT5-сервера. Канал Server->Terminal не при чем.
Большая просьба разработчиков устранить этот лаг. Сейчас на биржах при нулевом пинге имеем постоянное приличное запаздывание прихода тиков не только в Терминал, но и на Сервере. В частности, акцепты ордеров.
Неожиданно нарвался на отсутствие тика в истории, несмотря на то, что он приходил в Обзор рынка: SymbolInfoTick.
Распечатка этих же тиков через MQL выдает интересный флаг.
Этот флаг образовался у тика в истории прямо перед пропавшим тиком Обзора рынка. Возможно, это подскажет, где проблема.
ЗЫ К сожалению, такое происходит систематически. История тиков не содержит всех тиков, что приходят в Терминал.
Неожиданно нарвался на отсутствие тика в истории, несмотря на то, что он приходил в Обзор рынка: SymbolInfoTick.
Распечатка этих же тиков через MQL выдает интересный флаг.
Этот флаг образовался у тика в истории прямо перед пропавшим тиком Обзора рынка. Возможно, это подскажет, где проблема.
ЗЫ К сожалению, такое происходит систематически. История тиков не содержит всех тиков, что приходят в Терминал.
так и есть. скажем, ЕА торгует целый день на реальном счете, получаем прибыль.
на следующий день прогоняю тестер на прошлом дне, получаю убыток.
причина непонятна, то-ли брокер дает неправильные тики, то-ли еще что...
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
MT5 и скорость в боевом исполнении
fxsaber, 2021.01.04 20:51
Неожиданно нарвался на отсутствие тика в истории, несмотря на то, что он приходил в Обзор рынка: SymbolInfoTick.
Запустил параллельный Терминал, в котором tkc не формировался Терминалом, а закачался с Сервера.
На скрине этот Терминал слева - тик присутствует. А на другом Терминале (справа) - нет!
Получается, что сам Терминал не все приходящие тики запихивает в историю тиков. И если хотите историю без пропусков, то сейчас нужно прибивать tkc-файл и тянуть его с Сервера.
Неприятный баг.
Такой советник поймать пропущенные в истории тики не смог. Боевой - ловил. Видимо, эти тики не инициируют OnTick.
Сами пропущенные тики могут быть актуальными десяток миллисекунд.
Выше был пост с исходником. Сейчас там пусто. Причина?
Запустил параллельный Терминал, в котором tkc не формировался Терминалом, а закачался с Сервера.
На скрине этот Терминал слева - тик присутствует. А на другом Терминале (справа) - нет!
Запустил на обоих Терминалах такой скрипт.
В зависимости от того, какой интервал запрашиваешь, tkc может меняться (синхронизироваться с Сервером). Поэтому некоторые тики, что отсутствовали до запроса, могут начать присутствовать.
Несмотря на это, удалось все же выявить несколько на разных символах. Пришлось применять фильтр флагов, т.к. очень сильно они у тиков отличаются на разных Терминалах.
Вот так выглядят различия.
EURJPY.
USDCHF
В общем, при торговле в реальном времени в близкой истории тиков может не быть некоторых тиков, что приходили в Терминал и есть на Сервере.
Надо править этот баг.