Un minuto e mezzo di differenza tra l'ora locale e l'ora fresca di zecca. Cosa fare. - pagina 4

 

Ho scoperto quanto segue: a volte l'evento OnTick gestisce i tick nell'ordine temporale sbagliato (raro ma non raro). Prima c'è una spunta successiva e poi una precedente. Pertanto, ho fatto una regola nei miei Expert Advisors per contare i tick e gli indicatori (di cui ho bisogno). E scarto semplicemente le "zecche cattive".

PS: Ho notato questo a causa del comportamento "strano" dei miei robot (a volte succede). Guardi il grafico e "sulla tua logica" - non c'è una regola di apertura, ma l'EA ha aperto. Si comincia a frugare e a cercare. Trovo "dei tic così strani". Se li rimuovi, l'Expert Advisor inizia a funzionare "correttamente", cioè secondo la mia logica.

 
Alexey Kozitsyn:

Si prega di fornire un pezzo di codice che cattura i ritardi. Proprio qui, attraverso il pulsante di inserimento del codice.

//+----------------------------------------------------------------------------+
//|  Проверяем не установлили ли новые рекорды.                                |
//+----------------------------------------------------------------------------+
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 stessa che cattura i ritardi.

 
pivomoe:

L'EA in sé sta prendendo dei ritardi.

Immediatamente accattivante: volete capire se il terminale è in ritardo con l'emissione di tick, giusto? Allora perché si prende il tempo per tutti i simboli e non per un simbolo particolare? Perché non puoi scriverlo in modo più semplice?

#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);
  }
//+------------------------------------------------------------------+
 
Sinceramente non capisco che tempo restituisceSymbolInfoInteger(_Symbol,SYMBOL_TIME)? Qual è l'ora dell'ultima citazione?
Alexey Kozitsyn:

Volete capire se il terminale è in ritardo con i tick, giusto

? Un ritardo di un minuto e mezzo nella ricezione dei tick non è accettabile.

 
pivomoe:
Ad essere onesti, non capisco che tempo restituisceSymbolInfoInteger(_Symbol,SYMBOL_TIME)? Qual è l'ora dell'ultima citazione?

Sì, è così. Ritardi di un minuto e mezzo nella ricezione delle zecche non sono accettabili.

Questo è il tempo di arrivo dell'ultima quotazione per il simbolo corrente (nel mio esempio). Potete vedere la stessa ora qui:

E SymbolInfoInteger() restituisce la proprietà del simbolo specificato.

 
Cos'è una citazione? Ho appena guardato questa funzione ieri nella documentazione e sul forum. Cosa restituisce non è affatto chiaro.
 
pivomoe:
Cos'è una citazione? Ho dato un'occhiata a questa funzione proprio ieri, sia nella documentazione che nel forum. Cosa restituisce non è affatto chiaro.

Una nuova quotazione è un nuovo cambiamento di prezzo. Cioè un cambiamento nell'offerta e/o nella domanda.

 
Alexey Kozitsyn:

Una nuova quotazione è un nuovo cambiamento di prezzo. Cioè il cambiamento dell'offerta e/o della domanda.

Nella panoramica del mercato ci sono anche le colonne "Volume" "Last trade" Ho il sospetto che questa funzione restituisca semplicemente il .time dell'ultimo tick.

 
pivomoe:

Nella panoramica del mercato ci sono anche le colonne "Volume" "Last trade" Ho il sospetto che questa funzione restituisca semplicemente il .time dell'ultimo tick.

Sapevate che ci sono diverse zecche? Che i tick sono divisi in tick di trading/informazione?

 
Alexey Kozitsyn:

Sapevi che ci sono diversi tipi di zecche? Che i tick sono divisi in tick di trading/informazione?

Lo so. Dove vuoi arrivare?