Diskussion zum Artikel "Die Ereignisverarbeitungsroutine "Neuer Balken"" - Seite 2

[Gelöscht]  

Prival:

Selten, aber es gibt Situationen, in denen die Notierungen für ein Instrument für eine lange Zeit einfrieren (ich habe eine solche Situation beim Yen gesehen). Und wenn der Expert Advisor bei diesem Paar hängen bleibt, sind Sie in Schwierigkeiten, wenn Sie nicht den gesamten Code in OnTime() übersetzt haben.

Wenn Sie mit OOP arbeiten oder bestimmte Algorithmen verwenden, brauchen Sie den Code nicht zu übersetzen. Aber ich stimme zu, dass es bequemer ist, Echtzeit-Ticks für alle Paare in der Übersicht zu erhalten (und nicht etwas Eigenes zu erfinden)....

Lizar:

Ein solches Ereignis kann mit TimeCuurent() empfangen werden, aber was man damit weiter macht, wie man es synchronisiert, ist eine Frage.

Was hat TimeCuurent() damit zu tun?
 
Interesting:
Was hat TimeCuurent() damit zu tun?

Die Hilfe sagt:

Im OnTick()-Handler gibt diese Funktion die Zeit des eingehenden verarbeiteten Ticks zurück. In anderen Fällen (z.B. Aufruf in OnInit(), OnDeinit(), OnTimer() Handlern usw.) ist dies die Ankunftszeit des letzten Kurses für jedes im "Market Watch"-Fenster verfügbare Symbol, die gleiche Zeit, die im Titel dieses Fensters angezeigt wird.

[Gelöscht]  
Lizar:

Die Synopse lautet:

Im OnTick()-Handler gibt diese Funktion die Ankunftszeit des gerade verarbeiteten Ticks zurück. In anderen Fällen (z.B. Aufruf in den Handlern OnInit(), OnDeinit(), OnTimer() usw.) ist dies die Ankunftszeit des letzten Kurses für jedes im "Market Watch"-Fenster verfügbare Symbol, die gleiche Zeit, die in der Kopfzeile dieses Fensters angezeigt wird.

Ja, das ist klar. Nur wenn wir es in OnTime setzen, können wir die Zeit nicht mehr als einmal pro Minute aktualisieren, und wenn wir es in das aktuelle OnTick() setzen, riskieren wir, Ticks für einige der Paare zu verpassen (in mults).

Und was im Verarbeitungsblock zu tun ist, ist klar (für mults) - Wir erhalten einen neuen Wert, vergleichen ihn mit dem bestehenden und ziehen Schlussfolgerungen, ob es einen neuen Tick gab oder nicht.

Aber sagen Sie mir, warum machen Sie das im Expert Advisor?

 
Lizar:

Die Synopse lautet:

error. Hier ist, was die Hilfe sagt https://www.mql5.com/de/docs/basis/function/events

DasNewTick-Ereignis wird nur für Expert Advisors erzeugt, wenn ein neuer Tick für das Symbol empfangen wird, an dessen Chart der Expert Advisor angehängt ist.

Noch einmal. Wir sprechen von einem Expert Advisor, der an einem Symbol hängt. Er wird ausgelöst durch das Ereignis

void OnTick() {}

Wenn Sie sich innerhalb dieser Funktion befinden und es für mehr als eine Stunde keine Ticks auf diesem Paar gibt, können Sie innerhalb einer Stunde nichts tun. Der einzige Ausweg besteht darin, die Funktion in einen Timer einzubinden, der unabhängig vom Eintreffen von Ticks auf dem Instrument startet.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
Interesting:

Aber wenn wir es in OnTime setzen, können wir die Zeit nicht mehr als einmal pro Minute aktualisieren, und wenn wir es in der aktuellen OnTick() setzen, riskieren wir, Ticks auf einige der Paare (in mults) zu verpassen.

Das ist der Punkt, wir können das Ereignis erhalten, aber wir können es nicht verwenden.
 
Prival:

Hier ist, was die Hilfe sagt https://www.mql5.com/de/docs/basis/function/events.

Noch einmal. Wir sprechen über einen Expert Advisor, der an einem Symbol hängt. Er wird durch das Ereignis

void OnTick() {}

Wenn Sie sich innerhalb dieser Funktion befinden und mehr als eine Stunde lang keine Ticks auf diesem Paar vorhanden sind, können Sie innerhalb einer Stunde nichts tun. Bisher ist der einzige Ausweg, es im Timer zu tun, es ist unabhängig von der Ankunft der Ticks auf dem Instrument gestartet.

Ja, wenn wir im Rahmen dieser https://www.mql5.com/de/docs/basis/function/events handeln , stimme ich zu, dass die beste Option, wie es jetzt scheint, OnTime ist. Aber es wird uns nur vor der Abhängigkeit von der Ankunft von Ticks bewahren. Und es wird uns nicht vor der Single-Thread-Abhängigkeit bewahren: Während wir ein Signal für ein Instrument verarbeiten, riskieren wir, die Verarbeitung anderer Instrumente zu verpassen oder zu verzögern. Dies gilt insbesondere dann, wenn die "Zeit für die Verarbeitung von Handelsaufträgen zwischen 2 und 7 Sekunden" + Requotes beträgt.

Ich erinnerte mich an TimeCuurent(), weil es interessant war, in der Marktübersicht über Echtzeit-Ticks für alle Paare zu sprechen.

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
[Gelöscht]  
Guter Artikel, danke.
 
thnx
 

Sehr interessanter Artikel. Danke, dass Sie all dies mit uns teilen.

Dennoch einige Bemerkungen:

Wenn Sie über diese Funktion sprechen, sagen Sie:

If you call this prototype function from one place, then we have what we need. But if we want to use this function, for example, again in another place in the same calculation loop, it will always return false, which means that there is no bar. And this will not always be true. Static variable in this case imposes an artificial limit on the number of prototype function calls.

  • Sie haben Recht. Aber der mehrmalige Aufruf einer Funktion wie isnewbar() während eines Ticks ist eine schlechte Praxis. Rufen Sie sie nur einmal auf und speichern Sie das Ergebnis in einer Variablen.
  • Das Problem ist, dass die von Ihnen vorgeschlagene Lösung, eine Klasse ohne statische Variable zu verwenden, nicht das Problem löst, das Sie hervorgehoben haben. Und die Situation ist jetzt noch schlimmer. Sie müssen die Instanz Ihrer Klasse als globale Variable (Objekt) deklarieren, Sie müssen sie auch bei OnInit() initialisieren. Derjenige, der Ihre Klasse benutzenwird , muss die Operation kennen:
  1. Verwenden Sie immer eine globale Variable
  2. Immer initialisieren , auch wenn das Symbol und die Periode der Standard sind (für Zeitdiagramm).
  • Schließlich, "wenn wir diese Funktion zum Beispiel an einer anderen Stelle in derselben Berechnungsschleife wieder verwenden wollen". Dennoch wird sie IMMER FALSE zurückgeben.

Sie haben eine statische lokale Variable durch eine globale Variable ersetzt, was dasselbe ist, und Sie haben Ihr Problem nicht gelöst.


Dennoch hat Ihr Artikel das Verdienst , zum Nachdenken anzuregen und interessante Ideen zu bieten .

[Gelöscht]  

Guter Artikel, danke für den Austausch! All das war sehr nützlich!

Wie auch immer, ich habe Ihre isNewBar-Funktion genommen und es wirft die folgende Meldung beim Kompilieren:"möglicher Datenverlust aufgrund der Typkonvertierung".

Also habe ich die Var-Typen von datetime auf long geändert:

//+------------------------------------------------------------------+
//| Gibt true zurück, wenn ein neuer Balken für ein Symbol/Periodenpaar erschienen ist |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//--- Speichern der Öffnungszeit des letzten Taktes in der statischen Variablen
   static long last_time=0;
//--- aktuelle Zeit
   long lastbar_time=SeriesInfoInteger(CurrencyPair,Period01,SERIES_LASTBAR_DATE);

//--- wenn es der erste Aufruf der Funktion ist
   if(last_time==0)
     {
      //--- die Zeit einstellen und beenden
      last_time=lastbar_time;
      return(false);
     }

//--- wenn die Uhrzeit abweicht
   if(last_time!=lastbar_time)
     {
      //--- die Zeit speichern und true zurückgeben
      last_time=lastbar_time;
      return(true);
     }
//--- wenn wir diese Zeile erreicht haben, dann ist der Balken nicht neu; return false
   return(false);
  }

Jetzt kompiliert sie ohne Probleme und scheint gut zu funktionieren. Ich danke Ihnen!


Documentation on MQL5: Language Basics / Data Types / Typecasting
  • www.mql5.com
Language Basics / Data Types / Typecasting - Documentation on MQL5