Errori, bug, domande - pagina 2220

 
1861 - impossibile aprire una demo su Alpari. Scegliere un broker non funziona.
 
fxsaber:

Secondo me, questo è un bug quando l'ordine è sul server commerciale, ma dopo l'OrderSend sincrono sul terminale non c'è traccia di esso.

Ho deciso di verificare quanto durano questi ordini fantasma, quando l'ordine è presente sul sistema ma non nel terminale.

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

#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;
}


Il risultato è

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


Un ordine è presente nel sistema ma non nel terminale per 32 millisecondi! Provate a immaginare le conseguenze se la logica di trading fosse eseguita in questo intervallo...


È interessante che gli ordini fantasma sono più spesso presenti solo nei tipi di transazioneTRADE_TRANSACTION_ORDER_DELETE e TRADE_TRANSACTION_DEAL_ADD (molto più rari).


Una pessima sfumatura della piattaforma.


ZZY La velocità delle transazioni commerciali su 5 è discutibile, purtroppo.

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

Ho deciso di controllare quanto durano queste situazioni di ordine fantasma, quando un ordine è nel sistema ma non nel terminale.


Il risultato è


Per 32 millisecondi, c'è un ordine ma non è nel terminale! Immaginate le conseguenze se la logica di trading venisse eseguita durante questo intervallo.

Sì, non va bene. Come puoi vedere, questi risultati di transazione sono inviati in pacchetti diversi. Dovrebbero essere in uno solo.

 
Alexey Navoykov:

Come potete vedere, questi risultati di transazione sono inviati in pacchetti diversi, mentre dovrebbero essere in uno solo.

Si scopre che l'ordine può essere fantasma subito dopo OrderSend e l'Expert Advisor parallelo con OnTradeTransaction non può sempre catturare questo stato. Cioè OnTradeTransaction stesso a volte rallenta.


In generale, in MT5 ci sono dei ritardi architettonici in diversi punti che difficilmente vengono eliminati. Questi sono ritardi di arrivi di zecche e ora di transazioni commerciali. È necessario essere chiari su ciò che la piattaforma è in grado di fare se si punta sulla velocità di esecuzione. Per esempio, i tick arrivano con un discreto ritardo, poi le transazioni... e alla fine qualcun altro su MT5 o un'altra piattaforma può sorpassare, anche se tu stesso sei seduto proprio accanto allo scambio.

 
Letransazioni commerciali vanno in pacchetti prioritari, superando il resto. Questo riduce seriamente la latenza.
 
Renat Fatkhullin:
Le transazioni commerciali vanno in pacchetti prioritari, superando le altre. Questo riduce seriamente la latenza.

Come è possibile che lo script rilevi una situazione di ordine fantasma dopo OrderSend, ma OnTradeTransaction su un EA parallelo non lo fa (non sempre, ma succede)?

 
Renat Fatkhullin:
Le transazioni commerciali arrivano in pacchetti prioritari, superando le altre. Questo riduce seriamente la latenza.

Il problema è che le transazioniTRADE_TRANSACTION_ORDER_DELETE eTRADE_TRANSACTION_HISTORY_ADD arrivano in pacchetti diversi ed è per questo che non importa quale priorità abbiano, la latenza di rete lo farà comunque.E queste transazioni devono essere eseguite sincronicamente, una dopo l'altra, senza alcuno stato intermedio. Cioè è un'operazione atomica in sostanza, perché mettere un ordine cancellato nella lista della storia non ha nulla a che fare con uno scambio.

Cioè ci sono due opzioni qui: o queste due transazioni si uniscono in un unico pacchetto, o la prima transazione non viene eseguita nel terminale finché non arriva la seconda.

 
Alexey Navoykov:

Cioè ci sono due opzioni: o entrambe queste transazioni arrivano insieme in un unico pacchetto, o la prima transazione non viene eseguita nel terminale finché non arriva la seconda.

Ci sono situazioni in cui TRADE_TRANSACTION_DEAL_ADD viene PRIMA della transazione TRADE_TRANSACTION_ORDER_DELETE. In questo caso anche prima di TRADE_TRANSACTION_ORDER_DELETE l'ordine è ancora fantasma.

 

Gli agenti remoti hanno smesso di ottimizzare

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

Suppongo che sia a causa del nuovo compilatore, come possono essere aggiornati per farlo funzionare?

Inoltre, solo una parte dell'ottimizzatore passa 13 su 28 a causa di questo errore.
 

Guardando il codice del pacchetto Alglib. È pieno di queste costruzioni, rendendo il codice più difficile da leggere:

         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_];

Non è più semplice così?

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

Mi sembra che la velocità di esecuzione sarebbe ancora più veloce.

Perché hanno reso il codice così complicato? O semplicemente portato da un'altra lingua, senza alcuna regolazione? Ma mi chiedo ancora perché una tale complicazione nell'originale?