Erreurs, bugs, questions - page 2220

 
fxsaber:

À mon avis, il s'agit d'un bogue lorsqu'un ordre se trouve sur le serveur commercial, mais qu'après l'envoi synchrone de l'ordre sur le terminal, il n'y a aucun signe de celui-ci.

J'ai décidé de vérifier combien de temps durent ces ordres fantômes lorsque l'ordre est présent sur le système mais pas dans le terminal.

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

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


Le résultat est

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


Une commande est présente dans le système mais pas dans le terminal pendant 32 millisecondes ! Imaginez les conséquences si la logique de trading était exécutée dans cet intervalle ...


Il est intéressant de constater que les ordres fantômes ne sont le plus souvent présents que pour les types de transactionTRADE_TRANSACTION_ORDER_DELETE et TRADE_TRANSACTION_DEAL_ADD (beaucoup plus rares).


Très mauvaise nuance de plate-forme.


ZZY La vitesse des transactions commerciales sur 5 est malheureusement discutable.

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

J'ai décidé de vérifier combien de temps durent ces situations d'ordre fantôme, lorsqu'un ordre est dans le système mais pas dans le terminal.


Le résultat est


Pendant 32 millisecondes, il y a un ordre mais il n'est pas dans le Terminal ! Imaginez les conséquences si la logique de trading était exécutée pendant cet intervalle.

Oui, ce n'est pas bon. Comme vous pouvez le voir, les résultats des transactions sont envoyés dans des paquets différents. Ils devraient être réunis en un seul.

 
Alexey Navoykov:

Comme vous pouvez le constater, les résultats de ces transactions sont envoyés dans des paquets différents, alors qu'ils devraient être dans un seul.

Il s'avère que l'ordre peut être fantôme juste après l'envoi de l'ordre et que le conseiller expert parallèle avec OnTradeTransaction ne peut pas toujours détecter cet état. C'est-à-dire que OnTradeTransaction lui-même est parfois ralenti.


D'une manière générale, il y a des décalages dans l'architecture de MT5 à différents endroits qui sont difficilement éliminés. Il s'agit des décalages des arrivées de tirages et maintenant des transactions commerciales. Vous devez savoir clairement ce dont la plateforme est capable si vous misez sur la vitesse d'exécution. Par exemple, les ticks arrivent avec un délai raisonnable, puis les transactions... et finalement quelqu'un d'autre sur MT5 ou une autre plateforme peut prendre le dessus, même si vous êtes assis juste à côté de la bourse.

 
Lestransactions commerciales vont dans des paquets prioritaires, prenant le pas sur le reste. Cela réduit considérablement la latence.
 
Renat Fatkhullin:
Les transactions commerciales vont dans des paquets prioritaires, prenant le pas sur les autres. Cela réduit considérablement la latence.

Comment est-il possible que le script détecte une situation d'ordre fantôme après OrderSend, mais que OnTradeTransaction sur un EA parallèle ne le fasse pas (pas toujours, mais cela arrive) ?

 
Renat Fatkhullin:
Les transactions commerciales arrivent en paquets prioritaires, prenant le pas sur les autres. Cela réduit considérablement la latence.

Le problème est que les transactionsTRADE_TRANSACTION_ORDER_DELETE etTRADE_TRANSACTION_HISTORY_ADD arrivent dans des paquets différents et c'est pourquoi la priorité qu'elles ont n'a pas d'importance, la latence du réseau en aura de toute façon.Et ces transactions doivent être exécutées de manière synchrone, l'une après l'autre, sans aucun état intermédiaire, c'est-à-dire qu'il s'agit d'une opération atomique par essence, car le fait de placer un ordre supprimé dans la liste historique n'a rien à voir avec un échange.

Autrement dit, il y a deux possibilités : soit ces deux transactions sont regroupées en un seul paquet, soit la première transaction n'est pas exécutée dans le terminal avant l'arrivée de la seconde.

 
Alexey Navoykov:

Autrement dit, il y a deux possibilités : soit ces deux transactions sont regroupées en un seul paquet, soit la première transaction n'est pas exécutée dans le terminal avant l'arrivée de la seconde.

Il y a des situations où la transaction TRADE_TRANSACTION_DEAL_ADD vient AVANT la transaction TRADE_TRANSACTION_ORDER_DELETE. Dans ce cas, même avant TRADE_TRANSACTION_ORDER_DELETE, l'ordre est toujours fantôme.

 

Les agents distants ont cessé d'optimiser

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

Je suppose que c'est à cause du nouveau compilateur, comment peut-on les mettre à jour pour que cela fonctionne ?

En outre, seule une partie de l'optimiseur passe 13 fois sur 28 à cause de cette erreur.
 

Examen du code du paquet Alglib. Il est plein de ces constructions, ce qui rend le code plus difficile à lire:

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

N'est-ce pas plus simple comme ça ?

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

Il me semble que la vitesse d'exécution serait encore plus rapide.

Pourquoi ont-ils rendu le code si compliqué ? Ou simplement porté d'une autre langue, sans aucun ajustement ? Mais je me demande toujours pourquoi une telle complication dans l'original ?
 

Outil synthétique. J'importe des barres de minutes, chaque barre de minutes diffère d'un point (5 chiffres).

Je ferme la fenêtre avec les symboles, puis je rouvre cette fenêtre, demande les barres minutes du chargement précédent, j'obtiens

Les symboles sont les mêmes pour chaque journée complète. Quelle est l'erreur ?