Yerel saat ile taze kene saati arasında bir buçuk dakikalık fark. Ne yapalım. - sayfa 4

 

Kendim için şunu keşfettim: bazen OnTick olayı süreçleri yanlış zaman düzeninde keneler (nadiren, ancak gerçekleşir). Sonraki kene önce gelir, sonra önceki kene. Bu nedenle, Uzman Danışmanlarda, keneleri kendim hesaba katmayı, göstergeleri kendim hesaplamayı (ihtiyacım olan) bir kural haline getirdim. Ve ben sadece "dürüst olmayan tikleri" atıyorum.

Not: Bunu robotlarımın "garip" davranışından dolayı fark ettim (bazen böyle oluyor). Grafiğe ve "kendi mantığınıza" bakarsınız - açılış kuralı yoktur, ancak danışman onu açmıştır. Etrafta dolaşmaya ve aramaya başlarsın. "Çok garip tikler" buluyorum. Kaldırılırlarsa, danışman "doğru" çalışmaya başlar, yani. benim mantığımla.

 
Alexey Kozitsyn :

Lütfen gecikmeleri yakalayan bir kod parçası sağlayın. Tam burada, kod ekleme düğmesi aracılığıyla.

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

Danışmanın kendisi gecikmeleri yakalar.

Dosyalar:
 
pivomoe :

Danışmanın kendisi gecikmeleri yakalar.

Hemen gözünüze çarpıyor: Terminalin kene vermekte geç kalıp kalmadığını anlamak istiyorsunuz, değil mi? Neden belirli bir karakter için değil de tüm karakterler için zaman ayırıyorsunuz? Neden yazmak daha kolay olamaz:

 #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);
  }
//+------------------------------------------------------------------+
 
Dürüst olmak gerekirse, SymbolInfoInteger'ın ( _Symbol , SYMBOL_TIME) ne zaman döndüğünü anlamıyorum? Son alıntının zamanı nedir?
Alexey Kozitsyn :

Terminalin kene vermede geç kaldığını anlamak istiyorsunuz, değil mi?

Evet kesinlikle. Kenelerin alınmasında bir buçuk dakikalık gecikmelere izin verilmez.

 
pivomoe :
Dürüst olmak gerekirse, SymbolInfoInteger'ın ( _Symbol , SYMBOL_TIME) ne zaman döndüğünü anlamıyorum? Son alıntının zamanı nedir?

Evet kesinlikle. Kenelerin alınmasında bir buçuk dakikalık gecikmelere izin verilmez.

Bu, geçerli (benim örneğimde) sembol için son alıntının varış zamanıdır. Aynı zamanı burada da görebilirsiniz:

Ve SymbolInfoInteger() , belirtilen sembolün bir özelliğini döndürür.

 
alıntı nedir? Bu fonksiyona dün hem belgelerde hem de forumda baktım. Ne döndürdüğü tamamen anlaşılmaz.
 
pivomoe :
alıntı nedir? Bu fonksiyona dün hem belgelerde hem de forumda baktım. Ne döndürdüğü tamamen anlaşılmaz.

Yeni fiyat teklifi - yeni fiyat değişikliği. Onlar. teklifte değişiklik ve/veya sorma.

 
Alexey Kozitsyn :

Yeni fiyat teklifi - yeni fiyat değişikliği. Onlar. teklifte değişiklik ve/veya sorma.

Ayrıca Piyasa İzleme "Hacim" "Son İşlem Yapıldı" sütunlarında da vardır. Bu işlevin yalnızca son işaretin .zamanını döndürdüğüne dair şüpheler vardır.

 
pivomoe :

Ayrıca Piyasa İzleme "Hacim" "Son İşlem Yapıldı" sütunlarında da vardır. Bu işlevin yalnızca son işaretin .zamanını döndürdüğüne dair şüpheler vardır.

Tiklerin farklı olduğunu biliyor musun? Hangi keneler ticaret/bilgi olarak ikiye ayrılır?

 
Alexey Kozitsyn :

Tiklerin farklı olduğunu biliyor musun? Hangi keneler ticaret/bilgi olarak ikiye ayrılır?

Biliyorum. Bunu neden yapıyorsun?