Services, nouvelles fonctionnalités dans l'architecture de MT5, les funérailles de MT4 ne sont pas loin. - page 8

 

de l'anglais.

données

alimentation

datafeed -- source de données (bien que le mot "source" ne soit pas tout à fait juste)


feeder -- feeder, feeder, feeder

 

О датафидах. Сколько встречал этот термин, сложилось ощущение, что этим словом обозначают источник данных (котировок). Буквально "заполнитель данных". Когда речь идет о собственных инструментах, понимаю так, что мы сможем вычислять котировки, например, никем не котируемого MXNRUB по известным курсам MXNUSD и USDRUB, выгруженным из терминала в .csv формат, и легализовать для терминала новые котировки, указав файл .csv как новый датафид. Возможно, будет реализовано и более изящное решение, без выгрузки в файлы, путем онлайновых операций */ над тиками (MXNRUB =  MXNUSD * USDRUB). И это будет новый датафид.

A-t-on déjà importé des cotations .csv en ticks pour MT5 ???
 
Andrey Khatimlianskii:

Il n'y a pas de lien vers une discussion, un rapport de bogue ou autre chose de ce genre ? Ou juste le sentiment qu'il y en avait un, mais que vous ne l'avez pas vérifié maintenant ?

Autant que je me souvienne, les ticks collectés dans OnCalculate correspondaient à ceux demandés via CopyTix.

Maintenant, je l'ai vérifié exprès... comme je m'en doutais, j'ai reçu des conneries, mais pas celles que j'attendais :)

2017.05.22 12:47:10.591 (RTS-6.17,M1)   OnCalculate: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.591 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.599 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.605 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.617 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.637 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.649 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.683 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.765 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.27 ms v = 1, bid = 108320, ask = 108330, last = 108330, flags = 4
2017.05.22 12:47:10.771 (RTS-6.17,M1)   OnCalculate: 2017.05.22 10:47:11.193 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 88
2017.05.22 12:47:10.781 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.193 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 88
2017.05.22 12:47:10.843 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.244 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 0
2017.05.22 12:47:10.843 (RTS-6.17,M1)   OnBookEvent: Время последнего OnCalculate = 2017.05.22 10:47:11.193 ms (88), время последнего OnBookEvent = 2017.05.22 10:47:11.244 ms (0)
2017.05.22 12:47:10.859 (RTS-6.17,M1)   OnCalculate: 2017.05.22 10:47:11.282 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 88
2017.05.22 12:47:10.863 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 10:47:11.282 ms v = 1, bid = 108320, ask = 108330, last = 108320, flags = 88

OnBookEvent() attrape les ticks avec le flag 0...

 

Et c'est ce que je m'attendais à voir :

2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.242 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 11:24:38.689 ms v = 2, bid = 108540, ask = 108560, last = 108550, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.253 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.253 (RTS-6.17,M1)   OnCalculate: Время последнего STick = 2017.05.22 11:24:38.704 ms (TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME ), время последнего CopyTicks = 2017.05.22 11:24:38.697 ms (TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME )
2017.05.22 13:24:38.253 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.253 (RTS-6.17,M1)   OnCalculate: Время последнего STick = 2017.05.22 11:24:38.704 ms (TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME ), время последнего CopyTicks = 2017.05.22 11:24:38.697 ms (TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME )
2017.05.22 13:24:38.254 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.255 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.255 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.255 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.704 ms v = 2, bid = 108550, ask = 108560, last = 108550, flags = 'TICK_FLAG_SELL TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.261 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.261 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.261 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.262 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.262 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.270 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 11:24:38.710 ms v = 1, bid = 108540, ask = 108560, last = 108560, flags = 'TICK_FLAG_BID '
2017.05.22 13:24:38.280 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.730 ms v = 2, bid = 108550, ask = 108560, last = 108560, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.280 (RTS-6.17,M1)   OnCalculate: Время последнего STick = 2017.05.22 11:24:38.730 ms (TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME ), время последнего CopyTicks = 2017.05.22 11:24:38.719 ms (TICK_FLAG_BID )
2017.05.22 13:24:38.282 (RTS-6.17,M1)   OnBookEvent: 2017.05.22 11:24:38.730 ms v = 2, bid = 108550, ask = 108560, last = 108560, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
2017.05.22 13:24:38.283 (RTS-6.17,M1)   OnCalculate: 2017.05.22 11:24:38.730 ms v = 2, bid = 108550, ask = 108560, last = 108560, flags = 'TICK_FLAG_BUY TICK_FLAG_LAST TICK_FLAG_VOLUME '
Comme vous pouvez le voir, en demandant le dernier tick à chaque appel à OnCalculate() avec SymbolInfoTick() - il y a un saut dans certains des ticks que CopyTicks() renvoie.
 

Code à vérifier :

#property indicator_chart_window
#property indicator_plots 0
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MqlTick _tick;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- Подписываемся на стакан
   MarketBookAdd(_Symbol);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   ResetLastError();
//--- Проверяем получение параметров тика
   if(!SymbolInfoTick(_Symbol,_tick))
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": параметры тика не получены!");
   else
      Print(__FUNCTION__,": "+GetMsToStringTime(_tick.time_msc)+" v = ",_tick.volume,", bid = "+DoubleToString(_tick.bid,_Digits)+
            ", ask = "+DoubleToString(_tick.ask,_Digits)+", last = "+DoubleToString(_tick.last,_Digits)+", flags = '"+GetStrFlags(_tick.flags)+"'");
//---
   ResetLastError();
//---
   MqlTick t[1];
   if(CopyTicks(_Symbol,t,COPY_TICKS_ALL,0,1)!=1)
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": Последний тик не получен!");
   else
     {
      if(t[0].time_msc!=_tick.time_msc)
        {
         Print(__FUNCTION__,": Время последнего STick = "+GetMsToStringTime(_tick.time_msc)+" ("+GetStrFlags(_tick.flags)+")"+
               ", время последнего CopyTicks = "+GetMsToStringTime(t[0].time_msc)+" ("+GetStrFlags(t[0].flags)+")");
        }
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnBookEvent(const string &symbol)
  {
//---
   if(symbol!=_Symbol)
      return;
//--- Структура - приемник последнего тика
   MqlTick tick;
//---
   ResetLastError();
//--- Проверяем получение параметров тика
   if(!SymbolInfoTick(_Symbol,tick))
      Print(__FUNCTION__,": ОШИБКА #",GetLastError(),": параметры тика не получены!");
   else
      Print(__FUNCTION__,": "+GetMsToStringTime(tick.time_msc)+" v = ",tick.volume,", bid = "+DoubleToString(tick.bid,_Digits)+
            ", ask = "+DoubleToString(tick.ask,_Digits)+", last = "+DoubleToString(tick.last,_Digits)+", flags = '"+GetStrFlags(tick.flags)+"'");
//--- Сравниваем последний тик OnCalculate с последним тиком OnBookEvent
   if(tick.time_msc!=_tick.time_msc)
     {
      Print( __FUNCTION__,": Время последнего OnCalculate = "+GetMsToStringTime( _tick.time_msc )+" ("+GetStrFlags( _tick.flags )+")"+
            ", время последнего OnBookEvent = "+GetMsToStringTime( tick.time_msc )+" ("+GetStrFlags( tick.flags )+")" );
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- Отписываемся от стакана
   MarketBookRelease(_Symbol);
  }
//+------------------------------------------------------------------+
//| Получаем строку времени из миллисекунд                                                                      |
//+------------------------------------------------------------------+
string GetMsToStringTime(const ulong ms)
  {
   const int MS_KOEF=1000;               // Коэффициент перевода секунд в миллисекунды
   return( TimeToString( ms/MS_KOEF, TIME_DATE|TIME_SECONDS )+"."+string( ms%MS_KOEF )+" ms" );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string GetStrFlags(const uint flags)
  {
   string s="";
//---
   if(( flags&TICK_FLAG_ASK)==TICK_FLAG_ASK)
      s+="TICK_FLAG_ASK ";
   if(( flags&TICK_FLAG_BID)==TICK_FLAG_BID)
      s+="TICK_FLAG_BID ";
   if(( flags&TICK_FLAG_BUY)==TICK_FLAG_BUY)
      s+="TICK_FLAG_BUY ";
   if(( flags&TICK_FLAG_SELL)==TICK_FLAG_SELL)
      s+="TICK_FLAG_SELL ";
   if(( flags&TICK_FLAG_LAST)==TICK_FLAG_LAST)
      s+="TICK_FLAG_LAST ";
   if(( flags&TICK_FLAG_VOLUME)==TICK_FLAG_VOLUME)
      s+="TICK_FLAG_VOLUME ";
//---
   return( s );
  }
//+------------------------------------------------------------------+
 
Alexey Kozitsyn:

Code à tester :

Je n'écrirais les ticks dans le fichier que lorsque OnCalculate est appelé, pour être sûr (pas pour tester OnBookEvent et CopyTicks, maisOnCalculate, comme prévu).

Et ensuite, le script aurait généré le même fichier, en récupérant les ticks via CopyTicks. La différence serait plus évidente, et indiquerait soit des ticks manqués dans OnCalculate, soit un travail incorrect de CopyTicks.

 
Andrey Khatimlianskii:

Pour être sûr (pas pour tester OnBookEvent et CopyTicks, mais OnCalculate, comme prévu), je laisserais seulement les ticks écrire dans le fichier lorsque OnCalculate est appelé.

Et ensuite, le script aurait généré le même fichier, en récupérant les ticks via CopyTicks. La différence serait beaucoup plus claire et indiquerait soit un saut de ticks dans OnCalculate, soit un travail incorrect de CopyTicks.

Avec un calcul aussi simple, je ne vois pas l'intérêt de s'embêter. Il y a une comparaison spécifique de deux appels : SymbolInfoTick() et CopyTicks(). Et tous les appels de SymbolInfoTick() sont clairement affichés. Et on peut clairement voir que CopyTicks() a retourné le tick, qui n'a pas été reçu dans l'appel SymbolInfoTick() de OnCalculate(). Et il peut y avoir deux raisons pour l'erreur ici : 1. Soit OnCalculate() manque un tick, soit 2. SymbolInfoTick() renvoie la mauvaise chose quelque part.

Oui, c'est une partie du journal, qui a été collecté pendant environ 30 secondes... alors imaginez le nombre de ticks manquants.

 
Alexey Kozitsyn:

Notre dialogue avec le service d'assistance :

Saut de tic dans OnCalculate
Ouvert, Démarré : 2017.05.22 14:52, #1751442

Regardez pour ne pas vous perdre: https://www.mql5.com/ru/forum/190129/page8#comment_5081300 et les 2 postes suivants.

CopyTicks de l'indicateur donne un tick que l'indicateur n'obtient pas dans OnCalculate (ni avant ni après).

Équipe de soutien2017.05.23 09:44
Statut :Non traitéOuvert
Votre demande a été acceptée pour examen.
Équipe de soutien2017.05.23 09:46

OnCalculate est appelé à chaque tic.

Les ticks sont ajoutés à la base de données dans un fil séparé. C'est-à-dire de manière asynchrone. Ce n'est pas un fait qu'avec CopyTicks vous obtiendrez le même tick qui a appelé OnCalculate.

Andrey Khatimlianskii 2017.05.23 14:08

Il ne s'agit pas de ça.

Avec CopyTicks il est possible d'obtenir un tick, qui n'était pas dans OnCalculate (nous l'apprenons dans OnCalculate sur un tick, dont le temps est plus long que manqué).

Jetez un coup d'œil aux journaux.

Équipe de soutien2017.05.23 14:13

C'est exactement ce dont nous parlons.

Un lot de tiques est arrivé. Deux threads commencent à traiter ce paquet - un thread dans la boucle exécute OnCalculate sur chaque tick du paquet ; un autre thread place le paquet entier dans une base de données de tick. Ces deux threads ne sont pas synchronisés entre eux de quelque manière que ce soit et on ne sait pas quel thread traitera un paquet de ticks plus rapidement.

Andrey Khatimlianskii 2017.05.23 14:26

Mais chaque tick du pack doit être traité par OnCalculate. Et ce n'est pas le cas.

Il n'y a pas de tic avec ce temps. Il y a une tique avec moins de temps, et une tique avec plus de temps. Et il n'y a pas d'appel OnCalculate entre les deux.

Équipe de soutien2017.05.23 14:33

komposter

Mais chaque tick du paquet doit être traité par OnCalculate. Et ce n'est pas le cas.

Il n'y a pas de tic avec ce temps. Il y a une tique avec moins de temps, et une tique avec plus de temps. Et il n'y a pas d'appel de OnCalculate entre eux.

Chaque tick du paquet est traité à OnCalculate. Il n'y a pas de saut de puce. La boucle est écrite de cette façon.

Pour savoir quel tick est traité dans OnCalculate, utilisezSymbolInfoTick- tout est clair ici. Le tick est appliqué à l'information du symbole et ensuite tous les indicateurs de ce symbole sont appelés, le tout en une seule fois.

Andrey Khatimlianskii 2017.05.23 14:36

Veuillez consulter le journal en cliquant sur le lien.

SymbolInfoTick de OnCalculate ne voit pas le tick, qui peut être obtenu de CopyTicks.

C'est pourquoi j'ai écrit

Équipe de soutien2017.05.23 14:40

Nous devons faire exactement ce que vous avez suggéré surhttps://www.mql5.com/ru/forum/190129/page8#comment_5082755.

Pour être sûr (pour tester OnCalculate au lieu de OnBookEvent et CopyTicks, comme prévu), je laisserais seulement l'écriture des ticks dans le fichier lorsque OnCalculate est appelé.

Et ensuite, le script aurait généré le même fichier, en récupérant les ticks via CopyTicks. La différence serait beaucoup plus claire et indiquerait soit un saut de ticks dans OnCalculate, soit un travail incorrect de CopyTicks.

Et c'est exactement de cette façon que nous avons vérifié à un moment donné l'exactitude de CopyTicks. Les scripts de test et les indicateurs sont laissés, nous allons les vérifier à nouveau.

 

Forum sur le trading, les systèmes de trading automatisé et les tests de stratégies de trading

Bugs, bugs, questions

fxsaber, 2017.02.07 13:41

SymbolInfoTick dans les indicateurs fonctionne assez différemment que dans les EAs.

Dans un indicateur, il renvoie toujours le tick qui était l'initiateur de l'appel OnCalculate. Et ces tics initiateurs dans l'indicateur ne doivent pas être ignorés - c'est l'idéologie des développeurs. Le problème réside dans la formation de la file d'attente de ces tics.

Dans le conseiller expert, le SymbolInfoTick dans OnTick ne renvoie pas le tick qui a initié l'appel de OnTick, mais fait une demande complète pour l'état actuel.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Caractéristiques du langage mql5, subtilités et astuces

fxsaber, 2017.03.29 22:32

L'événement Calculate est généré sur CHAQUE tick. Il existe donc une file d'attente pour les indicateurs. S'il atteint un certain nombre, un avertissement dans le journal indique que l'indicateur est trop lent.

Les barres elles-mêmes sont des indicateurs par nature et sont générées par les Calculate-events. Par conséquent, si TF M1 et qu'il est 10:15:00.020 et qu'un paquet de 50ms arrive, le premier tick dans celui-ci a toujours le temps 10:14:59.970. Et tous les indicateurs sont appelés en premier sur cet événement Calculate - d'abord l'indicateur de séries chronologiques et ensuite les indicateurs personnalisés avec ces séries chronologiques. C'est-à-dire que dans cette disposition, la barre de 10:15 n'est pas encore formée comme la barre de zéro. Et la barre de zéro est à 10:14.


Ensuite, lorsque le pack commence à se dérouler via les événements Calculate, la barre de 10:15 apparaîtra également. Je pense l'avoir décrit en détail.

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégie

Caractéristiques du langage mql5, subtilités et astuces

fxsaber, 2017.03.29 22:41

Par conséquent, il est tout à fait normal qu'un EA obtienne un tick d'une barre qui ne s'est pas encore formée. Mais c'est un point si subtil qu'il faut faire un effort pour le reproduire volontairement. En général, il est plus théorique que pratique.


Si nous sommes paranoïaques à propos de la vitesse, l'utilisation des indicateurs (et des barres, bien sûr) n'est pas une option. Tout est dans l'EA.

 
Andrey Khatimlianskii:

Notre dialogue avec le Service Desk :

Le Service Desk fait malheureusement partie de leur répertoire. Ils n'ont pas besoin d'ajouter un lien lorsqu'il s'agit de discuter. Mais pour donner un exemple concret, sur leurs doigts. Ce n'est pas de ça qu'il s'agit. Ils disent que SymbolInfoTick() renvoie le tick actuel à vérifier, et comme OnCalculate() traite chaque tick - il s'avère que la sortie devrait être de chaque tick. Et CopyTicks() nous dit le contraire. Eh bien... Et ils disent, ne regardez pas CopyTicks() :). Ils m'ont aussi expliqué à propos de deux fils, quand ils ont corrigé CopyTicks() à la fin de l'année. Seulement ce n'est pas le problème ici (bien que, peut-être en elle aussi, je ne sais pas).

Vous ne leur avez pas demandé ce qu'il en est des ticks avec le drapeau 0 lorsqu'ils sont reçus de OnBookEvent() ?

Raison: