MT5 и скорость в боевом исполнении - страница 80

 
fxsaber:

ЗЫ Хорошо бы избавить от зависаний, что в течение нескольких месяцев происходят. Запустите этот скрипт на машине с бесконечной ОЗУ. Например, я не могу закачать тики с 1-го июня всего по одному символу. Просто висит CopyTicks с нулевым потреблением ресурсов.

b2699 - исправлено, Спасибо.

 
В копилку кодов, которые демонстрируют тормоза. На этот раз Тестер.
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Акцептирование SL/TP-ордеров

fxsaber, 2020.12.11 09:17

// Измеряет размер лага между приходом тика на MT5-сервер и MT5-Терминал.
// Запускать на той же машине, на которой установлен MT5-сервер.

Было обработано 100 тиков. Лаг прихода между сервером и Терминалом тиков колеблется от одной до восьми миллисекунд. В среднем - немного больше четырех миллисекунд. Это как раз равно отставанию срабатывания TP-ордеров, с которого началась эта ветка.


Сам лаг находится внутри MT5-сервера. Канал Server->Terminal не при чем.


Большая просьба разработчиков устранить этот лаг. Сейчас на биржах при нулевом пинге имеем постоянное приличное запаздывание прихода тиков не только в Терминал, но и на Сервере. В частности, акцепты ордеров.

 
Для уменьшения лагов при торговле рекомендую переводить боевой Терминал на RAM-drive.
 

Неожиданно нарвался на отсутствие тика в истории, несмотря на то, что он приходил в Обзор рынка: SymbolInfoTick.



Распечатка этих же тиков через MQL выдает интересный флаг.

                         [time]     [bid]     [ask] [last] [volume]    [time_msc] [flags] [volume_real]
        [0] 2021.01.04 20:52:55 103.16300 103.16500 0.0000        0 1609793575267       4       0.00000
        [1] 2021.01.04 20:52:55 103.16300 103.16400 0.0000        0 1609793575788       4       0.00000
        [2] 2021.01.04 20:52:59 103.16400 103.16400 0.0000        0 1609793579367     130       0.00000
        [3] 2021.01.04 20:53:01 103.16400 103.16400 0.0000        0 1609793581817       2       0.00000
        [4] 2021.01.04 20:53:01 103.16300 103.16400 0.0000        0 1609793581969       2       0.00000

Этот флаг образовался у тика в истории прямо перед пропавшим тиком Обзора рынка. Возможно, это подскажет, где проблема.


ЗЫ К сожалению, такое происходит систематически. История тиков не содержит всех тиков, что приходят в Терминал.

 
fxsaber:

Неожиданно нарвался на отсутствие тика в истории, несмотря на то, что он приходил в Обзор рынка: SymbolInfoTick.



Распечатка этих же тиков через MQL выдает интересный флаг.

Этот флаг образовался у тика в истории прямо перед пропавшим тиком Обзора рынка. Возможно, это подскажет, где проблема.


ЗЫ К сожалению, такое происходит систематически. История тиков не содержит всех тиков, что приходят в Терминал.

так и есть. скажем, ЕА торгует целый день на реальном счете, получаем прибыль.

на следующий день прогоняю тестер на прошлом дне, получаю убыток.

причина непонятна, то-ли брокер дает неправильные тики, то-ли еще что...

Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
Документация по MQL5: Константы, перечисления и структуры / Состояние окружения / Информация о счете
  • www.mql5.com
Информация о счете - Состояние окружения - Константы, перечисления и структуры - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

MT5 и скорость в боевом исполнении

fxsaber, 2021.01.04 20:51

Неожиданно нарвался на отсутствие тика в истории, несмотря на то, что он приходил в Обзор рынка: SymbolInfoTick.


Запустил параллельный Терминал, в котором tkc не формировался Терминалом, а закачался с Сервера.

На скрине этот Терминал слева - тик присутствует. А на другом Терминале (справа) - нет!


Получается, что сам Терминал не все приходящие тики запихивает в историю тиков. И если хотите историю без пропусков, то сейчас нужно прибивать tkc-файл и тянуть его с Сервера.

Неприятный баг.

 
// Попытка поймать тик, который не попал в историю тиков.

// Сравнение двух тиков.
bool IsEqual( const MqlTick &Tick1, const MqlTick &Tick2 )
{
  return((Tick1.time_msc == Tick2.time_msc) &&
         !NormalizeDouble(Tick1.bid - Tick2.bid, _Digits) &&
         !NormalizeDouble(Tick1.ask - Tick2.ask, _Digits));
}

// Проверяет наличие тика в истории.
bool IsHistory( const MqlTick &Tick )
{
  bool Res = false;
  
  MqlTick Ticks[];
  
  const int 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);
}

void OnTick()
{
  static MqlTick Ticks[];
  MqlTick Tick;
  
  if (SymbolInfoTick(_Symbol, Tick)) // Взяли текущий тик.
  {
    const int 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.

Сами пропущенные тики могут быть актуальными десяток миллисекунд.

 
fxsaber:
Выше был пост с исходником. Сейчас там пусто. Причина?
Наверное, пост был в момент обновления сайта (в англ части два поста таких).
 
fxsaber:

Запустил параллельный Терминал, в котором tkc не формировался Терминалом, а закачался с Сервера.

На скрине этот Терминал слева - тик присутствует. А на другом Терминале (справа) - нет!

Запустил на обоих Терминалах такой скрипт.

// Сохранение тиковой истории в текстовый файл.

string GetTickFlag( uint tickflag )
{
  string flag = " " + (string)tickflag;

#define TICKFLAG_MACRO(A) flag += ((bool)(tickflag & TICK_FLAG_##A)) ? " TICK_FLAG_" + #A : ""; \
                        tickflag -= tickflag & TICK_FLAG_##A;
TICKFLAG_MACRO(BID)
TICKFLAG_MACRO(ASK)
TICKFLAG_MACRO(LAST)
TICKFLAG_MACRO(VOLUME)
TICKFLAG_MACRO(BUY)
TICKFLAG_MACRO(SELL)
#undef TICKFLAG_MACRO

  if (tickflag)
    flag += " FLAG_UNKNOWN (" + (string)tickflag + ")";

  return(flag);
}

#define TOSTRING(A) " " + #A + " = " + (string)Tick.A
string TickToString( const MqlTick &Tick, const int FilterFlags = 0xFF )
{
  return(TOSTRING(time) + "." + ::IntegerToString(Tick.time_msc % 1000, 3, '0') +
         TOSTRING(bid) + TOSTRING(ask) + TOSTRING(last)+ TOSTRING(volume) + GetTickFlag(Tick.flags & FilterFlags));
}
#undef TOSTRING


void OnStart()
{  
  MqlTick Ticks[];
  const int Size = CopyTicksRange(_Symbol, Ticks, COPY_TICKS_ALL, D'2021.01.05 01:00' * 1000, D'2021.01.05 10:50' * 1000);
  
  string From = (string)Ticks[0].time;
  string To = (string)Ticks[Size - 1].time;
  
  StringReplace(From, ":", ".");
  StringReplace(To, ":", ".");
  
  const int handle = FileOpen(_Symbol + "_" + From + "-" + To + ".txt", FILE_WRITE | FILE_ANSI | FILE_TXT);

  if (handle != INVALID_HANDLE)
  {        
    for (int i = 0; i < Size; i++)
      FileWrite(handle, TickToString(Ticks[i], 0x7F)); // Фильтр флагов, иначе очень много различий.

    FileClose(handle);
  }
  
  Alert("Done.");
}


В зависимости от того, какой интервал запрашиваешь, tkc может меняться (синхронизироваться с Сервером). Поэтому некоторые тики, что отсутствовали до запроса, могут начать присутствовать.

Несмотря на это, удалось все же выявить несколько на разных символах. Пришлось применять фильтр флагов, т.к. очень сильно они у тиков отличаются на разных Терминалах.

Вот так выглядят различия.


EURJPY.


USDCHF


В общем, при торговле в реальном времени в близкой истории тиков может не быть некоторых тиков, что приходили в Терминал и есть на Сервере.

Надо править этот баг.