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

 
pivomoe:

TimeCurrent() - Die Zeit des letzten Ticks auf ein Zeichen ist kleiner als die Verzögerungszeit, so dass sie verwendet werden kann. Die Verwendung der Ortszeit in der ersten Version war keine gute Idee.

Whoa... Nun, auch die aktuelle Version scheint erfolglos zu sein.

Lesen wir die Definition von TimeCurrent():

ZeitStrom

Gibt die letzte bekannte Serverzeit und die Zeit des letzten Kurses für eines der in "Market Watch" ausgewählten Symbole zurück.

Eine davon bedeutet, dass der Zeitpunkt der häufigsten (der Einfachheit halber: der flüssigsten) angezeigt wird. Das ist nicht das, was Sie wollen. Was Sie brauchen, ist SymbolInfoInteger( blah-blah, SYMBOL_TIME ). Das sieht folgendermaßen aus.

 
Alexey Kozitsyn:

Whoa... dac, die aktuelle Version scheint ebenfalls zu versagen.

Lesen Sie die Definition von TimeCurrent():

Mit "eins" ist gemeint, dass die Zeit des häufigsten Wechsels angezeigt wird (der Einfachheit halber, die flüssigste). Und das ist nicht das, was Sie brauchen. Was Sie brauchen, ist SymbolInfoInteger( blah-blah, SYMBOL_TIME ). Ich glaube schon.

Das ist, wie ich versucht, für prostotrader zu tragen, was ich sehe das Problem. In der letzten Version gehe ich durch alle Symbole und nehme die maximale Zeit des letzten empfangenen Ticks.

   for(int i=0; i<KolichestvoSimvolov; i++)     
   if( InformaziaOPoslednemTike[i].LastTick.time_msc > VremaySamogoSvegegoTikaPoVsemSimvolam ) VremaySamogoSvegegoTikaPoVsemSimvolam= InformaziaOPoslednemTike[i].LastTick.time_msc;
Alexey Kozitsyn:

Wenn jemand um 17:59:01 Uhr eine Information über eine Zecke erhält und ich sie nicht einmal um 18:00 Uhr - das ist ein großes Problem.

Und hier ist die Frage. Was ist das Problem (und gibt es eines)? Im Server des Brokers, der den Tick (für alle) lange Zeit nicht freigibt, oder im MT5, der ihn lange Zeit nicht empfängt.

Einerseits beträgt die durchschnittliche Zeit zwischen "TimeCurrent" und der Ankunftszeit des letzten Ticks 5 Millisekunden, andererseits gibt es Ticks, die mit zig Sekunden Abstand kommen. Zum Beispiel von 18 bis 25. Ich habe eine Zecke mit einer Verzögerung von 45 Sekunden erwischt. Und das bei ein paar Dutzend nicht liquider Symbole.


+ Darüber hinaus kann das Problem der Laufzeit durch die Verwendung von CopyTicks zum Abrufen des letzten Tick verschärft werden.
if(CopyTicks(Symbol(),ticks,COPY_TICKS_TRADE,0,1)==1) 

Sie ist nicht nur um ein Vielfaches langsamer, sondern kann auch eineinhalb Sekunden lang flach ausgeführt werden.

Ich habe verstanden, dass OnBookEvent nur für den Handel mit einem Symbol geeignet ist.

 
pivomoe:

Dies ist, wie ich versucht, für prostotrader zu tragen, was ich als ein Problem zu sehen. In der letzten Version gehe ich durch alle Symbole und nehme die maximale Zeit des letzten empfangenen Ticks.

Einerseits beträgt die durchschnittliche Zeit zwischen "TimeCurrent" und der Ankunftszeit des letzten Ticks 5 Millisekunden, andererseits gibt es Ticks, die mit einem Abfall von mehreren zehn Sekunden kommen. Zum Beispiel von 18 bis 25. Ich habe eine Zecke mit einer Verzögerung von 45 Sekunden erwischt. Und das bei ein paar Dutzend nicht liquider Symbole.


+ Darüber hinaus kann das Problem der Laufzeit durch die Verwendung von CopyTicks zum Abrufen des letzten Ticks noch verschärft werden.

Sie ist nicht nur um ein Vielfaches langsamer, sondern kann auch eineinhalb Sekunden lang flach ausgeführt werden.

Ich habe auch verstanden, dass OnBookEvent nur für den Handel mit einem Symbol geeignet ist.

Hier sind wir. Es stellt sich heraus, dass Sie gerade verstanden haben, dass das Marktglas für jedes Währungspaar separat gebildet wird, so dass der Handel auf seine Daten für verschiedene Paare nicht möglich ist.

Ich hoffe, Sie werden bald erkennen, dass das Abrufen von Daten aus verschiedenen Charts in einer bestimmten, von Ihnen vorgegebenen Reihenfolge nicht mit der Reihenfolge der eingehenden Daten über neue Ticks in den Charts der verschiedenen Währungspaare übereinstimmt.

Wenn also EURUSD zuerst und BTCUSD zuletzt geprüft wird und dazwischen Dutzende von Symbolen liegen, kann die Zeit des Tick-Empfangs wie folgt aussehen

18:50:00.000; 18:48:59.018; 18:51:00.001; 18:47:59.000 und so weiter. Ohne jede Verschwörungstheorie, ohne Fehler von MT oder Maklern. Was sie programmiert haben, ist das, was sie bekommen haben.

 
Алексей Тарабанов:

Hier sind wir. Es stellt sich heraus, dass Sie gerade festgestellt haben, dass das Glas für jedes Währungspaar separat gebildet wird, so dass der Handel auf seine Daten ist nicht möglich für verschiedene Paare.

Ich hoffe, Sie werden bald erkennen, dass das Abrufen von Daten aus verschiedenen Charts in einer bestimmten, von Ihnen vorgegebenen Reihenfolge nicht der Reihenfolge der eingehenden Daten über neue Ticks in den Charts der verschiedenen Währungspaare entspricht.

Wenn also EURUSD zuerst und BTCUSD zuletzt geprüft wird und dazwischen Dutzende von Symbolen liegen, kann die Zeit des Tick-Empfangs wie folgt aussehen

18:50:00.000; 18:48:59.018; 18:51:00.001; 18:47:59.000 und so weiter. Ohne jede Verschwörungstheorie, ohne Fehler von MT oder Maklern. Was wir programmiert haben, ist das, was wir bekommen haben.

Um neue Zecken über OnBookEvent zu fangen, wurde ich vonprostotrade inspiriert, der schrieb, dass "es korrekter ist". Ich verwende den Tick nicht selbst, sondern abonniere nur seine Aktualisierung für alle Symbole im Marktbericht.OnBookEven wird verwendet, um nur das Symbol zu erkennen, das zur Aktualisierung des Ticks verwendet wurde. Dann wird geprüft, ob es einen neuen Tick gibt und dann schaue ich, ob der EA neue Anti-Records gesetzt hat. Das isteigentlich die ganze Funktion:

void OnBookEvent(const string &symbol)
  {   
   if( MestoPoluchenieTikov == ON_TIMER ) return;
//--- Ищем индекс символа для которого полученно событие OnBookEvent
   int IndeksSimvola= -1;
   for(  int i=0;  i < KolichestvoSimvolov; i++ )
   if(  symbol == GCInformaziaOPoslednemTike[i].Simvol  ) { IndeksSimvola= i; break; }
   
   if( IndeksSimvola== -1 ){Print(__FUNCTION__,"Не удалось найти символ по которому полученно событие OnBookEvent ");ExpertRemove();return;}
   
   bool PoluchiliNoviiTick= false;
          
    //--- Получаем тик заданным в настройках способом.
   if( SposobPoluchenieTikov == SYMBOL_INFO_TICK  ) PoluchiliNoviiTick= PolychaemNoviiTickSymbolInfoTick(GCInformaziaOPoslednemTike[IndeksSimvola]);
   if( SposobPoluchenieTikov == COPY_TICKS       )  PoluchiliNoviiTick= PolychaemNoviiTickCopyTicks(GCInformaziaOPoslednemTike[IndeksSimvola]);    
       
     //--- Смотрим не установлены ли новые рекорды.  
   if(  PoluchiliNoviiTick ) PitaemsayObnovitRekordi( GCInformaziaOPoslednemTike, IndeksSimvola );                 
   
   ObnovlaemInformacyyNaGrafikeEslePora();
 
  }   
Alexej Tarabanow:

Ich hoffe, dass Sie verstehen, dass das Verfolgen von Daten aus verschiedenen Gläsern in einer bestimmten, von Ihnen vorgegebenen Reihenfolge nicht der Reihenfolge der eingehenden Daten über neue Ticks in den Gläsern der verschiedenen Währungspaare entspricht.

Soweit ich das verstanden habe, suche ich nichts, wenn ich mit MarketBookGet keine Tasse erhalte. Vielleicht haben Sie sich nur meinen Code auf der zweiten Seite nicht angeschaut.

 
pivomoe:

Die Idee, neue Zecken über OnBookEvent abzufangen, habe ich vonprostotrade, der schrieb, dass dies "korrekter" sei. Ich verwende den Tick nicht selbst, sondern abonniere nur seine Aktualisierungen für alle Symbole im Marktbericht.OnBookEven verwende ich im Grunde nur, um das Symbol zu identifizieren, für das der Tick aktualisiert wurde. Dann wird geprüft, ob es einen neuen Tick gibt und dann schaue ich, ob der EA neue Anti-Records gesetzt hat. Das isteigentlich die ganze Funktion:

Soweit ich das verstehe, muss ich nichts überprüfen, wenn ich die Tasse nicht mit MarketBookGet bekomme. Sie haben sich wahrscheinlich nur meinen Code auf der zweiten Seite nicht angesehen.

Das MT-Signal wird erst verarbeitet, wenn das vorherige Signal verarbeitet ist.

 
pivomoe:

Die Idee, neue Zecken über OnBookEvent abzufangen, habe ich vonprostotrade, der schrieb, dass dies "korrekter" sei. Ich verwende den Tick nicht selbst, sondern abonniere nur seine Aktualisierungen für alle Symbole im Marktbericht.OnBookEven verwende ich im Grunde nur, um das Symbol zu identifizieren, für das der Tick aktualisiert wurde. Dann wird geprüft, ob es einen neuen Tick gibt und dann schaue ich, ob der EA neue Anti-Records gesetzt hat. Das isteigentlich die ganze Funktion:

Soweit ich das verstehe, muss ich nichts überprüfen, wenn ich die Tasse nicht mit MarketBookGet bekomme. Sie haben sich wahrscheinlich nur meinen Code auf der zweiten Seite nicht angesehen.

Das habe ich nicht.

 
pivomoe:

Ihre Logik ist gut, hören Sie nicht auf die, die vorbeigehen.

1. Versuchen Sie, 3-5 Instrumente zu behalten (von denen eines illiquide ist). Wird es funktionieren?

2. Führen Sie es auf einem sauberen Rechner ohne andere Software aus, der das Internet nutzt. Wird sie sich wiederholen?

3. Versuchen Sie, das Auffangen der Latenz in verschiedene EAs aufzuteilen (1 pro Tool).

Wenn das Problem nicht bei den Ressourcen liegt (es gab eine Begrenzung der Anzahl der einem Terminal zugewiesenen Threads), dann sollte der Fehler behoben sein.

 
Andrey Khatimlianskii:

Ihre Logik ist gut, hören Sie nicht auf die, die vorbeigehen.

1. Versuchen Sie, 3-5 Instrumente zu behalten (von denen eines illiquide ist). Wird es funktionieren?

2. Führen Sie es auf einem sauberen Rechner ohne andere Software aus, der das Internet nutzt. Wird sie sich wiederholen?

3. Versuchen Sie, das Auffangen der Latenz in verschiedene EAs aufzuteilen (1 pro Tool).

Wenn das Problem nicht mit den Ressourcen zusammenhängt (die Anzahl der einem Terminal zugewiesenen Threads war begrenzt), dann sollte der Fehler behoben sein.

Vielen Dank für die Antwort. Heute habe ich einen kleinen Fortschritt bei der Lösung dieses Problems gemacht. Es wird mit dem Befehl Sleep() zwischen den SymbolInfo()-Aufrufen behandelt. Zuvor habe ich die gesamte Marktübersicht in einer Schleife durchlaufen, ohne eine Pause einzulegen. Ich habe es mit 40 Symbolen am Abend getestet. Wenn Sleep(5), dann fange ich "new tick", was vor zwei Sekunden gewesen sein sollte. Aber Sleep(10) zeigt eine Verzögerung von 400 Millisekunden (aufgrund von Sleep(10) ( 40 Symbole *10 ). Ich habe versucht, es mit den 4 liquidesten Symbolen bei Vesper zu testen. Mit Sleep(1) überhaupt keine Verzögerung.... alles ist perfekt. Hier verstehe ich nicht, wie es sein kann, wenn das Symbol in der Rezension klein ist und SymbolInfo ohne Pausen verwendet werden kann. Und wenn das Symbol ist eine Menge von brauchen, um Pausen zu verwenden.

Nun die Antworten:

1) Auf Flüssigkeit wird am Abend nicht gespielt.

2) Bei 40 Zeichen wiederholt sich der Text auch bei deaktivierter Software.

3) Ich verstehe nicht, was Sie vorschlagen. Neue Ticks auf einmal von zwei EAs in einem Terminal abfangen?

ZZZ Jetzt grabe ich mich in die Richtung der Durchführbarkeit des Aufrufs von SymbolInfo. So konnte ich zum Beispiel herausfinden, dass selbst ein Symbol in der Marktübersicht nicht in der Lage ist, neue Ticks im Abstand von mehr als 3,5 Millisekunden zu senden (es war allerdings am Abend).

 
pivomoe:

1) Auf flüssigen, spielt es nicht auf Vespern.

2) Bei 40 Zeichen wiederholt es sich, auch wenn die Software deaktiviert ist.

3) Ich verstehe nicht, worauf Sie hinauswollen. Neue Ticks auf einmal von zwei EAs in einem Terminal abfangen?

ZZZ Jetzt grabe ich mich in die Richtung der Durchführbarkeit des Aufrufs von SymbolInfo. Zum Beispiel konnte ich herausfinden, dass sogar ein Symbol in der Marktübersicht nicht in der Lage ist, neue Ticks mehr als 3,5 Millisekunden zu geben (es war allerdings zur Abendzeit).

1. Versuchen Sie, eine illiquide Aktie hinzuzufügen

3. Fehlschüsse für ein Instrument von einem EA auffangen. Und 40 EAs betreiben.

 
pivomoe:

Ich danke Ihnen für Ihre Antwort. Ich bin heute bei der Lösung dieses Problems etwas weiter gekommen. Sie wird mit dem Befehl Sleep() zwischen den SymbolInfo()-Aufrufen behandelt. Zuvor habe ich die gesamte Marktübersicht ohne Pause durchlaufen. Ich habe es mit 40 Symbolen am Abend getestet. Wenn Sleep(5), dann fange ich "new tick", was vor zwei Sekunden gewesen sein sollte. Aber Sleep(10) zeigt eine Verzögerung von 400 Millisekunden (aufgrund von Sleep(10) ( 40 Symbole *10 ). Ich habe versucht, es mit den 4 liquidesten Symbolen bei Vesper zu testen. Mit Sleep(1) überhaupt keine Verzögerung.... alles ist perfekt. Hier verstehe ich nicht, wie es sein kann, wenn das Symbol in der Rezension klein ist und SymbolInfo ohne Pausen verwendet werden kann. Und wenn Sie viele Zeichen haben, müssen Sie Pausen machen.

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