Bibliothèque: OnTickMulti - page 3

 
Stanislav Korotky #:

Il n'y a pas d'anticipation, car si, à l'instant X, il existe des ticks pour plusieurs symboles, alors, parallèlement au premier événement sur l'un des instruments, les autres symboles (pour lesquels les événements sont encore en file d'attente) afficheront le tick précédent, et non le tick suivant (comme dans l'exemple, 00 h 04 précédait 00 h 05, et non l'inverse).

Pour assurer la synchronisation, il faut la mettre en œuvre de manière algorithmique dans le code ; par exemple, dans le gestionnaire OnTick, il faut interroger l’heure des ticks sur tous les symboles concernés avant de lancer une transaction. Mais, en principe, si l'arbitrage porte précisément sur les ticks (et non sur les barres ou les minutes), il est difficile d'imaginer une synchronisation fiable, car les ticks sur certains instruments peuvent en réalité être absents pendant plusieurs secondes.

Tout est relatif : pour un instrument, il y aura un retard, tandis que pour un autre, il y aura une avance.

Tout varie ; dans le débogueur, tout est synchronisé, même avec une fonction OnTick presque vide.

Il faut convertir les barres en ticks pour le test, afin de simuler correctement les commissions et les spreads.

C'est ce qu'il a fallu faire dans OnTick pour que les calculs du testeur personnalisé concordent avec ceux de MT.

   int size=ArraySize(T);
   if(size==0) return;
   datetime dt1=(datetime)SymbolInfoInteger(name1,SYMBOL_TIME);
   datetime dt2=(datetime)SymbolInfoInteger(name2,SYMBOL_TIME);
   while(sh1<size && T[sh1]<dt1) sh1++;
   while(sh2<size && T[sh2]<dt2) sh2++;
   while(sh1<size && T[sh1]==dt1)
     {if(D1[sh1]>0)  Buy(name1);
      if(D1[sh1]<0) Sell(name1);
      if(D1[sh1]==0) Close(name1);
      sh1++;
     }
   while(sh2<size && T[sh2]==dt2)
     {if(D2[sh2]>0)  Buy(name2,D2[sh2]);
      if(D2[sh2]<0) Sell(name2,fabs(D2[sh2]));
      if(D2[sh2]==0) Close(name2);
      sh2++;
     }
 
Stanislav Korotky #:

Pour assurer la synchronisation, il faut la mettre en œuvre de manière algorithmique dans votre code ; par exemple, dans le gestionnaire OnTick, interroger la fréquence des ticks pour tous les symboles concernés avant de lancer une transaction.

Je crains que cela ne permette pas à la fonction OnTick de détecter que la série de ticks correspondant à l'heure actuelle est terminée. Seul un OnTimer en millisecondes devrait, selon toute vraisemblance, résoudre le problème.

 
Rorschach #:

Tout est relatif : pour un instrument, il y aura un décalage, tandis que pour un autre, ce sera un dépassement.

Il y a l'heure actuelle (du testeur) : ce n'est que par rapport à celle-ci qu'on peut parler d'anticipation. Si l'instant actuel est X et que, pour deux instruments, on dispose respectivement de ticks aux instants X-1 et X-2, il s'agit alors des derniers ticks connus et c'est sur ceux-ci que l'algorithme doit effectuer ses calculs. Or, si, à l’instant X-2, quelqu’un tentait de calculer les ticks pour X-1 et X, cela constituerait une projection dans l’avenir. Mais techniquement, le testeur ne permet pas de le faire.
 
fxsaber #:

Je crains que cela ne permette pas à OnTick de détecter que la série de ticks correspondant à l'heure actuelle est terminée. Seul un OnTimer en millisecondes devrait permettre d'y remédier.

Tout dépend de la manière dont on écrit la condition dans la boucle if en fonction du temps : il faut utiliser un « > » strict, et non un « >= », et ne pas prendre en compte le tick qui a déclenché la condition. Avec un timer, cela fonctionnera de la même manière.
 
Stanislav Korotky #:
Tout dépend de la façon dont on écrit la condition dans la boucle « if » en fonction du temps : il faut utiliser le signe « > » strict, et non « >= », et ne pas prendre en compte le tick qui a déclenché la condition.
Je ne comprends pas.
 
Stanislav Korotky #:
Avec un minuteur, ça marchera de la même manière.
C'est plus simple là-bas.
 
fxsaber #:
Je ne comprends pas.

À première vue, avec une identification de l'heure à la milliseconde près (il en va de même pour les secondes) :

// À faire : ArrayResize(lookback, <nombre de symboles>)
MqlTick lookback[];

void OnTickMulti(const string &symbol, const uint &index)
{
   static MqlTick t[1];
   static long timeCurrentMsc;
   
   SymbolInfoTick(symbol, t[0]);
   
   if(t[0].time_msc > timeCurrentMsc)
   {
      if(!timeCurrentMsc) // ce n'est pas tout à fait le début, il s'agit donc d'une nouvelle milliseconde
      {
         // À faire : utiliser les ticks de lookback[] pour l'analyse et les transactions
         // elles n'incluent pas encore le tick actuel, car celui-ci correspond à la milliseconde suivante
         // ...
      }
      timeCurrentMsc = t[0].time_msc;
   }

   // Ce n'est qu'après l'analyse qu'il faut mettre à jour le registre avec le nouvel horodatage
   lookback[index] = t[0];
}

Mais je le répète encore une fois (pour Rorschach) : la synchronisation sur des intervalles aussi courts est illusoire. Les ticks d’un instrument donné peuvent être absents pendant plusieurs secondes, auquel cas le cours qui leur correspond peut en réalité devenir « obsolète ». Si, pour certains, il est important que tous les cours correspondent à la même [milli]seconde, il faut alors, dans l'extrait cité (dans le bloc d'analyse commenté), vérifier en plus que les instants des ticks coïncident et ne passer des ordres que si cette condition est remplie.

 
Stanislav Korotky #:

À vue de nez, avec une identification de l'heure à la milliseconde près (idem pour les secondes) :

Cette méthode ne permet en aucun cas de garantir l'actualité des ticks de tous les symboles. Seul l'OnTimer en millisecondes permet de le garantir.
 
fxsaber #:
Cette méthode ne permet en aucun cas de garantir l'actualité des ticks de tous les instruments. Seul un OnTimer en millisecondes permet de le faire.
Qu'entend-on par « actualité » (cette méthode renvoie les derniers ticks connus pour tous les instruments ; peut-on utiliser CopyTicks si c'est de cela qu'il s'agit) ? Et en quoi OnTimer donnerait-il un résultat différent ?
 

Stanislav Korotky #:
Что подразумевается под актуальностью (этот метод отдает последние известные тики по всем инструментам)?

Il n'y aura plus de ticks avec la dernière heure connue.

Et en quoi OnTimer donnera-t-il un résultat différent ?

L’OnTimer en millisecondes garantit que toutes les mises à jour se sont écoulées AVANT cet événement de temporisation. Autrement dit, les mises à jour sont à jour pour tous les symboles.