Eineinhalb Minuten Unterschied zwischen der Ortszeit und der neuen Tickerzeit. Was ist zu tun? - Seite 4

 

Ich habe Folgendes entdeckt: Manchmal behandelt das OnTick-Ereignis Ticks in der falschen zeitlichen Reihenfolge (selten, aber nicht ungewöhnlich). Zuerst gibt es einen späteren Tick, dann einen früheren. Deshalb habe ich es mir zur Regel gemacht, in meinen Expert Advisors Ticks zu zählen und Indikatoren (die ich brauche) selbst zu berechnen. Und "schlechte Zecken" werfe ich einfach weg.

PS: Ich habe dies aufgrund des "seltsamen" Verhaltens meiner Roboter bemerkt (manchmal passiert es). Sie schauen auf den Chart und "auf Ihre Logik" - es gibt keine Eröffnungsregel, aber der EA hat geöffnet. Sie fangen an, herumzustochern und zu suchen. Ich finde "so seltsame Ticks". Wenn Sie diese entfernen, beginnt der Expert Advisor "richtig" zu arbeiten, d.h. nach meiner Logik.

 
Alexey Kozitsyn:

Bitte stellen Sie ein Stück Code zur Verfügung, das Verzögerungen auffängt. Genau hier, über die Schaltfläche Code einfügen.

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

Der EA selbst fängt die Verzögerungen auf.

Dateien:
 
pivomoe:

Der EA selbst holt Verzögerungen ein.

Sofort einleuchtend: Sie wollen verstehen, ob das Terminal mit der Ausgabe von Ticks hinterherhinkt, richtig? Warum also nehmen Sie sich die Zeit für alle Symbole und nicht für ein bestimmtes Symbol? Warum können Sie das nicht einfacher formulieren?

#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);
  }
//+------------------------------------------------------------------+
 
Ich verstehe ehrlich gesagt nicht, welche ZeitSymbolInfoInteger(_Symbol,SYMBOL_TIME) zurückgibt? Um wie viel Uhr wurde das letzte Angebot abgegeben?
Alexey Kozitsyn:

Sie wollen verstehen, ob das Terminal mit den Ticks hinkt, richtig

? Eine Verzögerung von eineinhalb Minuten beim Empfang von Ticks ist nicht akzeptabel.

 
pivomoe:
Um ehrlich zu sein, verstehe ich nicht, welche ZeitSymbolInfoInteger(_Symbol,SYMBOL_TIME) zurückgibt? Wann war das letzte Zitat?

Ja, das ist sie. Verzögerungen von eineinhalb Minuten beim Empfang von Ticks sind nicht akzeptabel.

Dies ist die Ankunftszeit der letzten Notierung für das aktuelle (in meinem Beispiel) Symbol. Die gleiche Zeit können Sie hier sehen:

Und SymbolInfoInteger() gibt die Eigenschaft des angegebenen Symbols zurück.

 
Was ist ein Zitat? Ich habe mir diese Funktion erst gestern sowohl in der Dokumentation als auch im Forum angesehen. Was dabei herauskommt, ist überhaupt nicht klar.
 
pivomoe:
Was ist ein Zitat? Ich habe mir diese Funktion erst gestern sowohl in der Dokumentation als auch im Forum angesehen. Was dabei herauskommt, ist überhaupt nicht klar.

Eine neue Notierung ist eine neue Preisänderung. D.h. eine Änderung des Geld- und/oder Briefkurses.

 
Alexey Kozitsyn:

Eine neue Notierung ist eine neue Preisänderung. D.h. Änderung des Geld- und/oder Briefkurses.

In der Marktübersicht gibt es auch Spalten "Volumen" "Letzter Handel" Ich vermute, dass diese Funktion einfach die Zeit des letzten Ticks zurückgibt.

 
pivomoe:

In der Marktübersicht gibt es auch Spalten "Volumen" "Letzter Handel" Ich vermute, dass diese Funktion einfach die Zeit des letzten Ticks zurückgibt.

Wussten Sie, dass es verschiedene Zeckenarten gibt? Dass die Zecken in Handels- und Informationszecken unterteilt sind?

 
Alexey Kozitsyn:

Wussten Sie, dass es verschiedene Arten von Zecken gibt? Dass die Zecken in Handels- und Informationszecken unterteilt sind?

Ich weiß. Worauf willst du hinaus?