Un minuto y medio de diferencia entre la hora local y la hora fresca. Qué hacer. - página 4

 

He descubierto lo siguiente: a veces el evento OnTick maneja los ticks en un orden de tiempo incorrecto (raro pero no infrecuente). Primero hay una garrapata posterior, y luego una anterior. Por lo tanto, he hecho una regla en mis Asesores Expertos para contar ticks y calcular indicadores (que necesito) por mí mismo. Y simplemente descarto las "garrapatas malas".

PD: Me di cuenta de esto debido al comportamiento "extraño" de mis robots (a veces sucede). Usted mira el gráfico y "en su lógica" - no hay regla de apertura, pero el EA ha abierto. Empiezas a hurgar y a buscarlo. Me parece que hay "garrapatas tan extrañas". Si los quitas, el Asesor Experto empieza a funcionar "correctamente", es decir, según mi lógica.

 
Alexey Kozitsyn:

Por favor, proporcione un trozo de código que capte los retrasos. Aquí mismo, a través del botón de inserción de código.

//+----------------------------------------------------------------------------+
//|  Проверяем не установлили ли новые рекорды.                                |
//+----------------------------------------------------------------------------+
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]);      
     }
  }  

La propia EA captando los retrasos.

Archivos adjuntos:
 
pivomoe:

El propio EA está captando retrasos.

Inmediatamente pegadizo: quieres entender si el terminal se retrasa con la emisión de ticks, ¿verdad? Entonces, ¿por qué se toma el tiempo para todos los símbolos y no para uno en particular? ¿Por qué no puedes escribirlo de forma más sencilla?

#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, no entiendo qué tiempo devuelveSymbolInfoInteger(_Symbol,SYMBOL_TIME) ? ¿Cuál es la hora de la última cita?
Alexey Kozitsyn:

Quieres entender si el terminal se retrasa con los ticks, ¿verdad

? Un retraso de un minuto y medio en la recepción de ticks no es aceptable.

 
pivomoe:
Sinceramente, no entiendo qué tiempo devuelveSymbolInfoInteger(_Symbol,SYMBOL_TIME). ¿Cuál es la hora de la última cita?

Sí, lo es. Los retrasos de un minuto y medio en la recepción de ticks no son aceptables.

Es la hora de llegada de la última cotización del símbolo actual (en mi ejemplo). Puede ver la misma hora aquí:

Y SymbolInfoInteger() devuelve la propiedad del símbolo especificado.

 
¿Qué es un presupuesto? Ayer miré esta función en la documentación y en el foro. Lo que devuelve no está nada claro.
 
pivomoe:
¿Qué es un presupuesto? Ayer miré esta función tanto en la documentación como en el foro. Lo que devuelve no está nada claro.

Una nueva cotización es un nuevo cambio de precio. Es decir, un cambio en la oferta y/o la demanda.

 
Alexey Kozitsyn:

Una nueva cotización es un nuevo cambio de precio. Es decir, el cambio en la oferta y/o la demanda.

En el resumen del mercado también hay columnas "Volumen" "Última operación" Sospecho que esta función simplemente devuelve el .tiempo del último tick.

 
pivomoe:

En el resumen del mercado también hay columnas "Volumen" "Última operación" Sospecho que esta función simplemente devuelve el .tiempo del último tick.

¿Sabías que hay diferentes garrapatas? ¿Que las garrapatas se dividen en garrapatas de comercio/información?

 
Alexey Kozitsyn:

¿Sabías que hay diferentes tipos de garrapatas? ¿Que las garrapatas se dividen en garrapatas de comercio/información?

Lo sé. ¿Cuál es tu punto?