Ошибки, баги, вопросы - страница 2220

 
1861 - невозможно открыть демо на Альпари. Выбор брокера не прокатывает.
 
fxsaber:

По-моему, это баг, когда ордер есть на торговом сервере, а после синхронной OrderSend на Терминале об этом ни духом.

Решил проверить, как долго длятся такие ситуации фантомных ордеров, когда ордер есть в системе, но нет в Терминале.

// Советник отслеживает длительность ситуаций, когда ордер отсутствует среди текущих и исторических

#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

bool OrderIsExist( const ulong &OrderTicket )
{
  return(OrderTicket ? OrderSelect(OrderTicket) || HistoryOrderSelect(OrderTicket) : true);
}

void OnTradeTransaction ( const MqlTradeTransaction &Trans, const MqlTradeRequest&, const MqlTradeResult& )
{
  static bool PrevIsExist = true;
  static ulong StartTime = 0;
  static ulong MaxInterval = 0;
  
  const ulong NowTime = GetMicrosecondCount();
  const bool IsExist = OrderIsExist(Trans.order);
    
  if (!IsExist)
  {
    Print(TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
  
    if (PrevIsExist) 
      StartTime = NowTime;
  }
  else if (!PrevIsExist)
  {
    const ulong Interval = NowTime - StartTime;
    
    Print(TOSTRING(Interval) + TOSTRING2(Trans.type) + TOSTRING(Trans.order) +
          TOSTRING(OrderSelect(Trans.order)) + TOSTRING(HistoryOrderSelect(Trans.order)));       
    
    if (Interval > MaxInterval)
    {
      MaxInterval = Interval;
      
      Comment(TOSTRING(MaxInterval) + TOSTRING(Trans.order)); // mcs.
    }
  }
          
  PrevIsExist = IsExist;
}


Результат

2018.06.21 00:10:31.047 Trans.type = TRADE_TRANSACTION_ORDER_DELETE (2)
2018.06.21 00:10:31.047 Trans.order = 2210967406
2018.06.21 00:10:31.047 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 HistoryOrderSelect(Trans.order) = false
2018.06.21 00:10:31.047 
2018.06.21 00:10:31.080 Interval = 32643
2018.06.21 00:10:31.080 Trans.type = TRADE_TRANSACTION_HISTORY_ADD (3)
2018.06.21 00:10:31.080 Trans.order = 2210967406
2018.06.21 00:10:31.080 OrderSelect(Trans.order) = false
2018.06.21 00:10:31.080 HistoryOrderSelect(Trans.order) = true


32 миллисекунды ордер есть, но его в Терминале нет! Только представьте себе, какие это может нести последствия, если в этом интервале выполнялась торговая логика...


Интересно, что фантомные ордера чаще всего присутствуют только при TRADE_TRANSACTION_ORDER_DELETE и при TRADE_TRANSACTION_DEAL_ADD (значительно реже) типах транзакций.


Очень нехороший нюанс платформы.


ЗЫ Сомнительное быстродействие торговых операций на пятерке, к сожалению.

Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?
Сравнение MQL5 и QLUA - почему торговые операции в MQL5 до 28 раз быстрее?
  • 2016.09.13
  • MetaQuotes Software Corp.
  • www.mql5.com
Многие трейдеры зачастую не задумываются над тем, как быстро доходит их заявка до биржи, как долго она там исполняется и когда торговый терминал трейдера узнает о результате. В результате они не знают, что легко могут улучшить качество исполнения своих сделок за счет более быстрой реакции и скорости проведения транзакций. 12 сентября 2016 года...
 
fxsaber:

Решил проверить, как долго длятся такие ситуации фантомных ордеров, когда ордер есть в системе, но нет в Терминале.


Результат


32 миллисекунды ордер есть, но его в Терминале нет! Только представьте себе, какие это может нести последствия, если в этом интервале выполнялась торговая логика...

Да, непорядок.  Как видно, эти результаты транзакций шлются в разных пакетах.  А должны быть в одном.

 
Alexey Navoykov:

Да, непорядок.  Как видно, эти результаты транзакций шлются в разных пакетах.  А должны быть в одном.

Оказалось, что может сразу после OrderSend ордер быть фантомным, при этом параллельный советник с OnTradeTransaction это состояние не всегда может поймать. Т.е. OnTradeTransaction сама иногда подтормаживает.


В общем, в MT5 в разных местах архитектурно сидят лаги, которые вряд ли возможно искоренить. Это лаги приходов тиков, а теперь и торговых транзакций. Нужно четко отдавать себе отчет, на что способна платформа, если закладываться на скорость исполнения. Например, тики, пришедшие с приличным опозданием, затем - транзакции.. и в итоге кто-то другой на MT5 или другой платформе может обогнать, даже если сами сидите вплотную к бирже.

 
Торговые транзакции идут приоритетными пакетами, обгоняя остальные. Это серьезно уменьшает латенси.
 
Renat Fatkhullin:
Торговые транзакции идут приоритетными пакетами, обгоняя остальные. Это серьезно уменьшает латенси.

Как получается, что скрипт после OrderSend обнаруживает ситуацию фантомного ордера, а OnTradeTransaction на параллельном советнике - нет (не всегда, но случается)?

 
Renat Fatkhullin:
Торговые транзакции идут приоритетными пакетами, обгоняя остальные. Это серьезно уменьшает латенси.

Проблема в том, что транзакции TRADE_TRANSACTION_ORDER_DELETE и TRADE_TRANSACTION_HISTORY_ADD приходят в разных пакетах, и поэтому неважно какой там приоритет, сетевая задержка всё-равно будет.  А эти транзакции должны выполняться синхронно, одна за другой, без какого либо промежуточного состояния.  Т.е. это одна атомарная операция по сути.  Ведь помещение удалённого ордера в список истории никак не связано с биржей.

Т.е. тут вариантов два:  либо обе эти транзакции приходят вместе в одном пакете,  либо же первая транзакция не выполняется в терминале до тех пор, пока не придёт вторая.

 
Alexey Navoykov:

Т.е. тут вариантов два:  либо обе эти транзакции приходят вместе в одном пакете,  либо же первая транзакция не выполняется в терминале до тех пор, пока не придёт вторая.

Бывают ситуации, когда TRADE_TRANSACTION_DEAL_ADD приходит ДО транзакции TRADE_TRANSACTION_ORDER_DELETE. При этом еще до TRADE_TRANSACTION_ORDER_DELETE ордер все равно фантомный.

 

Удаленные агенты перестали проводить оптимизацию

2018.06.22 14:05:24.901 SVA_03  pass 19 tested with error "task rejected by tester agent" in 0:00:00.000
2018.06.22 14:05:27.387 SVA_03  pass 19 tested with error "task rejected by tester agent" in 0:00:00.000

Предполагаю, что из-за нового компилятора, как их можно обновить, что всё заработало?

Кроме того, из-за такой ошибки прошло только часть проходов в оптимизаторе 13 из 28.
 

Просматриваю код пакета Alglib. Там полно таких конструкций, усложняющих читаемость кода:

         for(i_=0;i_<=nvars-1;i_++)
            tmp[i_]=xy[i][i_];
         for(i_=0;i_<=nvars-1;i_++)
            tmp[i_]=tmp[i_]-ct[xyc[i]][i_];
         //--- calculation
         v=0.0;
         for(i_=0;i_<=nvars-1;i_++)
            v+=tmp[i_]*tmp[i_];

Не проще ли так?

v=0.0;
for(i_=0;i_<=nvars-1;i_++){
   tmp=xy[i][i_]-ct[xyc[i]][i_];
   v+=tmp*tmp;
}

Мне кажется, что скорость исполнения будет даже выше.

Зачем так усложнили код? Или просто портировали с др. языка, без корректировок? Но все равно интересно, зачем такое усложнение в оригинале?
Причина обращения: