Une minute et demie de différence entre l'heure locale et l'heure du tic-tac frais. Ce qu'il faut faire. - page 4

 

J'ai découvert le problème suivant : parfois, l'événement OnTick traite les ticks dans le mauvais ordre chronologique (rare mais pas rare). Il y a d'abord un tic plus tardif, puis un plus précoce. Par conséquent, j'ai fait une règle dans mes Expert Advisors pour compter les ticks et les indicateurs (dont j'ai besoin). Et j'écarte simplement les "mauvais tics".

PS : J'ai remarqué cela à cause du comportement "étrange" de mes robots (cela arrive parfois). Vous regardez le graphique et "sur votre logique" - il n'y a pas de règle d'ouverture, mais l'EA a ouvert. Vous commencez à fouiller et à le chercher. Je trouve "des tics si étranges". Si vous les supprimez, le conseiller expert commence à fonctionner "correctement", c'est-à-dire selon ma logique.

 
Alexey Kozitsyn:

Veuillez fournir un morceau de code qui rattrape les retards. Juste ici, par le bouton d'insertion de code.

//+----------------------------------------------------------------------------+
//|  Проверяем не установлили ли новые рекорды.                                |
//+----------------------------------------------------------------------------+
void PitaemsayObnovitRekordi(CInformaziaOPoslednemTike &InformaziaOPoslednemTike[], int NomerSimolaS_NovimTikom )
  {   
//---  1. Определяем время и символ(ипользуется только для вывода информации)  самого свещего тика по всем символам.
//---  2. Вычисляем разность. Время самого свежего тика по всем символам МИНУС время последнего тика по проверяемому символу.
//---  3. Обновляем глобальные строки для функции Comment.
//---  4. Обновляем глобальные строки для функции Comment если установлен рекорд.
   static long RekordRaznosti=        -1;
  
   static long SymmaRaznostei=       0;
   static long KolichestvoPolychenixNovixTikov= 0;
     
//---  1. Определяем время и символ(ипользуется только для вывода информации)  самого свещего тика по всем символам.
   long VremaySamogoSvegegoTikaPoVsemSimvolam= 0; 
   int IndeksSimvolaS_SamimSvegimTikom= 0;   
   for(int i=0; i<KolichestvoSimvolov; i++)     
   if( InformaziaOPoslednemTike[i].LastTick.time_msc > VremaySamogoSvegegoTikaPoVsemSimvolam ) {VremaySamogoSvegegoTikaPoVsemSimvolam= InformaziaOPoslednemTike[i].LastTick.time_msc;IndeksSimvolaS_SamimSvegimTikom=i;}
   
//---  2. Вычисляем разность. Время самого свежего тика по всем символам МИНУС время последнего тика по проверяемому символу.
   long Rasnost= VremaySamogoSvegegoTikaPoVsemSimvolam - InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].LastTick.time_msc;
//---    
   SymmaRaznostei+= Rasnost;
   KolichestvoPolychenixNovixTikov++;
   
//---  3. Обновляем глобальные строки для функции Comment. 
   StringConcatenate(GStrokaDlayComment[2]," Самый свежий тик ",InformaziaOPoslednemTike[IndeksSimvolaS_SamimSvegimTikom].Simvol," time_msc ",PrintMilesekond(InformaziaOPoslednemTike[IndeksSimvolaS_SamimSvegimTikom].LastTick.time_msc));
   if( ((VremaySamogoSvegegoTikaPoVsemSimvolam-StartTimeMsc)/1000) != 0 )
     {StringConcatenate(GStrokaDlayComment[3]," Средняя разность ",SymmaRaznostei/KolichestvoPolychenixNovixTikov," милесекунд. Количество полученных новых тиков ",KolichestvoPolychenixNovixTikov," Количество новых тиков в секунду ",KolichestvoPolychenixNovixTikov/((VremaySamogoSvegegoTikaPoVsemSimvolam-StartTimeMsc)/1000) );}
     
//---  4. Обновляем глобальные строки для функции Comment если установлен рекорд.    
   if( RekordRaznosti < Rasnost ) 
     {
      RekordRaznosti= Rasnost;
      GStrokaDlayComment[4]="--------------------------------------------------------------------------------";      
      StringConcatenate(GStrokaDlayComment[5],"РЕКОРДная  Разница между временем последенго тика по ВСЕМ символам Минус только, что полученный новый тик по символу ",RekordRaznosti," милесекундa.");
      StringConcatenate(GStrokaDlayComment[6]," Получен НОВЫЙ тик по символу                     ",InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].Simvol," time_msc= ",PrintMilesekond(InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].LastTick.time_msc));      
      StringConcatenate(GStrokaDlayComment[7]," ХОТЯ до этого был получeн тик                        ",InformaziaOPoslednemTike[IndeksSimvolaS_SamimSvegimTikom].Simvol," time_msc ",PrintMilesekond(InformaziaOPoslednemTike[IndeksSimvolaS_SamimSvegimTikom].LastTick.time_msc));
      StringConcatenate(GStrokaDlayComment[8]," Локальное время получения нового тика по символу.                                   ",PrintMilesekond(InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].PoslednieVremayRaboti));
      StringConcatenate(GStrokaDlayComment[9]," Предпоследние Локальное время попытки получить новый тик по символу    ",PrintMilesekond(InformaziaOPoslednemTike[NomerSimolaS_NovimTikom].PredPoslednieVremayRaboti));
      
      GStrokaDlayComment[10]="--------------------------------------------------------------------------------";
      
      for( int i=2; i<12; i++ )
      Print(GStrokaDlayComment[i]);      
     }
  }  

L'EA elle-même attrape les retards.

Dossiers :
 
pivomoe:

L'EA elle-même prend du retard.

Immédiatement accrocheur : vous voulez comprendre si le terminal est à la traîne avec l'émission de ticks, non ? Alors pourquoi prenez-vous le temps pour tous les symboles, et non pour un symbole particulier ? Pourquoi ne pouvez-vous pas l'écrire d'une manière plus simple :

#property indicator_plots 0
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   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[])
  {
//--- Получаем время последней котировки по символу
   const datetime lastTime=(datetime)SymbolInfoInteger(_Symbol,SYMBOL_TIME);
//--- Приемник данных о последнем тике
   MqlTick tick;
//--- Получение последнего тика
   if(SymbolInfoTick(_Symbol,tick))
     {
      //--- Проводим ГРУБОЕ сравнение времени последней котировки и последнего тика
      int lag=int(lastTime-tick.time);
      //---
      Print(__FILE__,": Время прихода: последней котировки = "+TimeToString(lastTime,TIME_SECONDS)+", последнего тика = "+TimeToString(tick.time,TIME_SECONDS)+". Задержка = ",lag," сек.");
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
Honnêtement, je ne comprends pas quelle heure renvoieSymbolInfoInteger(_Symbol,SYMBOL_TIME) ? Quelle est l'heure du dernier devis?
Alexey Kozitsyn:

Vous voulez comprendre si le terminal est en décalage avec les ticks, non

? Un retard d'une minute et demie dans la réception des tics n'est pas acceptable.

 
pivomoe:
Pour être honnête, je ne comprends pas quelle heure renvoieSymbolInfoInteger(_Symbol,SYMBOL_TIME) ? Quelle est l'heure de la dernière citation?

Oui, c'est vrai. Des retards d'une minute et demie dans la réception des ticks ne sont pas acceptables.

C'est l'heure d'arrivée de la dernière cotation pour le symbole actuel (dans mon exemple). Vous pouvez voir la même heure ici :

Et SymbolInfoInteger() retourne la propriété du symbole spécifié.

 
Qu'est-ce qu'un devis ? Je viens d'examiner cette fonction hier dans la documentation et sur le forum. Ce qu'elle renvoie n'est pas du tout clair.
 
pivomoe:
Qu'est-ce qu'un devis ? Je viens d'examiner cette fonction hier, à la fois dans la documentation et sur le forum. Ce qu'elle renvoie n'est pas du tout clair.

Une nouvelle cotation est un nouveau changement de prix. C'est-à-dire un changement dans l'offre et/ou la demande.

 
Alexey Kozitsyn:

Une nouvelle cotation est un nouveau changement de prix. C'est-à-dire le changement de l'offre et/ou de la demande.

Dans la vue d'ensemble du marché, il y a également des colonnes "Volume" "Dernière transaction". On soupçonne que cette fonction renvoie simplement l'heure du dernier tick.

 
pivomoe:

Dans la vue d'ensemble du marché, il y a également des colonnes "Volume" "Dernière transaction". Je soupçonne que cette fonction renvoie simplement l'heure du dernier tick.

Saviez-vous qu'il existe différentes tiques ? Que les ticks sont divisés en ticks de négociation et d'information ?

 
Alexey Kozitsyn:

Saviez-vous qu'il existe différents types de tiques ? Que les ticks sont divisés en ticks de négociation et d'information ?

Je sais. Où veux-tu en venir ?