Diskussion zum Artikel "Umgang mit Zeit (Teil 2): Die Funktionen" - Seite 4

 

Die Version von DealingWithTime.mqh v. 1.01 aus dem Artikel Dealing with Time (Part 2): Funktionen ( https://www.mql5.com/en/articles/9929 ) funktioniert nicht mehr, weil MQ das Verhalten der Funktion CopyTime( ) einige Zeit nach Veröffentlichung dieses Artikels geändert hat. Jetzt gibt diese Funktion keine zukünftigen Zeitwerte mehr zurück, wenn sie größer sind als TimeCurrent(), das für die Parameter start_time und/oder stop_time angegeben wurde. Stattdessen wird die Eröffnungszeit des letzten aktuellen Balkens als größtmöglicher Wert zurückgegeben.

Da das Ende der FX-Session auf diese Weise ermittelt wurde, um die Zeitverschiebung des Brokers zu bestimmen, führt dies nun zu falschen Werten!

Diese Berechnung wurde in der Version 2.03 geändert. Diese Version ist bereits auf CodeBase hier verfügbar: https://www.mql5.com/en/code/45287.

Aber auch die Zeitverschiebungsberechnung wurde komplett geändert, so dass nun auch die komplizierten Zeiten der Zeitverschiebung von Sydney (Australien) bis zurück in die 1970er Jahre abgedeckt sind.

Ebenfalls angehängt ist die Tabelle DST 1975 - 2030.xlsx in einer Zip-Datei mit allen Zeitverschiebungen seit den 1970er Jahren, so dass jeder überprüfen kann, ob die Formeln korrekt funktionieren, hier ein Beispiel für eine Reihe aus der Tabelle:

Der 1. Januar 1982 ist Standardzeit in den USA (Sommerzeit==0) und die nächste Umstellung erfolgt am 25. April 1982, dem letzten (25. des Monats) Sonntag im April (4). Die Tabelle ist bereits nach der geographischen Zeitzone (Spalte A), dann nach der Zeitzone des Jahres (Spalte L, spr=Frühling, aut=Herbst,) und schließlich nach dem Datum der Anfrage (Spalte C) sortiert. Die Tabelle kann automatisch von dem mitgelieferten EA erstellt werden (ein Skript kann nicht im Debug-Modus ausgeführt werden). Test_DST 2.mq5 wenn Sie es im Debug-Modus ausführen und die Zeilen aus dem Tagebuchprotokoll im Debugger kopieren und in eine Tabellenkalkulation einfügen; Das Zelltrennzeichen wäre ein Leerzeichen.

Außerdem gibt es jetzt eine neue, einfache Funktion SecTillClose(), die die verbleibende Zeit in Sekunden (der MQ-Zeitwährung) bis zur Schließung des Devisenmarktes liefert - ohne CopyTime(). Dies ist für diejenigen interessant, die ihre Positionen vor dem Wochenende schließen wollen oder in einem bestimmten Zeitraum vor dem Wochenende keine neue Position eröffnen wollen.

Der mitgelieferte Indikator DealingWithTime_TestIndi.mq5 zeigt als Kommentar zum Chart nicht nur die Sommerzeit in Europa, den USA und Australien (Sydney) an, sondern auch die aktuelle Uhrzeit und den Zeitunterschied verschiedener Städte. Hier finden Sie eine Tabelle mit den verschiedenen Ortszeiten in den wichtigsten Städten zum Vergleich: https://www.timeanddate.com/worldclock/. So können Sie die Werte jederzeit überprüfen. Dieser Indikator zeigt auch, wie diese Werte ermittelt und verwendet werden (was wird wovon subtrahiert oder zu was addiert), so dass Sie ihn leicht selbst verwenden können - Copy and Paste, die schnellste Form der Programmierung.

Die letzten beiden Zeilen zeigen auch die letzte Sekunde der aktuellen Devisensitzung und die verbleibende Zeit in Stunden (was leichter zu beurteilen ist) und in Sekunden. Wenn die Devisensitzung in New York an einem Freitag um 17.00 Uhr Ortszeit schließt, gibt es um 17.00 Uhr New Yorker Zeit keine gültigen Bars mehr. Daher wird in dieser Funktion 1 Sekunde abgezogen, um die letzte gültige Öffnungszeit des letzten Balkens in der Zeit des Brokers zu erhalten. Einige Broker schließen ihre Devisensitzung jedoch ein paar Minuten früher, stellen die Kursstellung ein und nehmen keine Handelsaufträge mehr an.

Dealing with Time (Part 2): The Functions
Dealing with Time (Part 2): The Functions
  • www.mql5.com
Determing the broker offset and GMT automatically. Instead of asking the support of your broker, from whom you will probably receive an insufficient answer (who would be willing to explain a missing hour), we simply look ourselves how they time their prices in the weeks of the time changes — but not cumbersome by hand, we let a program do it — why do we have a PC after all.
 

Artikel Bearbeitungszeit (Teil 2): Die Version der Funktion DealingWithTime.mqh v. 1.01 ( https://www.mql5.com/en/articles/9929 ) funktioniert nicht mehr, weil MQ einige Zeit nach der Veröffentlichung dieses Artikels die Funktion CopyTime() geändert hat. Jetzt gibt die Funktion nicht mehr den zukünftigen Zeitwert zurück, wenn er größer ist als der TimeCurrent(), der für die Parameter start_time und/oder stop_time angegeben wurde. Stattdessen wird die Eröffnungszeit des letzten aktuellen Balkens als maximal möglicher Wert zurückgegeben.

Da auf diese Weise das Ende der FX-Session ermittelt wird, um den Zeitversatz des Brokers zu bestimmen, führt dies nun zu einem falschen Wert!

Diese Berechnung wurde in der Version 2.03 geändert. Diese Version ist nun in der Codebasis verfügbar: https: //www.mql5.com/en/code/45287.

Auch die Berechnung der Zeitverschiebung wurde komplett geändert, so dass sie nun die komplexe Zeit der Zeitverschiebung von Sydney (Australien) bis in die 1970er Jahre abdeckt.

Ebenfalls als Zip-Datei beigefügt ist die Tabelle DST 1975 - 2030.xlsx mit allen Zeitumstellungen seit den 70er Jahren, so dass jeder überprüfen kann, ob die Formeln korrekt funktionieren, und unten ist eine Beispielreihe der Tabelle:

Der 1. Januar 1982 ist in US-Standardzeit (Sommerzeit==0) und die nächste Umstellung erfolgt am 25. April 1982, dem letzten (25. Tag des Monats) Sonntag (4) des Aprils. Die Tabelle wurde nach geographischer Zeitzone (Spalte A), dann nach Jahreszeitzone (Spalte L, spr=Frühling, aut=Herbst) und schließlich nach Abfragedatum (Spalte C) sortiert. Die Tabelle kann automatisch durch das mitgelieferte EA erstellt werden (das Skript kann nicht im Debug-Modus ausgeführt werden). Test_DST 2.mq5 Wenn Sie es im Debug-Modus ausführen und die Zeilen des Logbuchs aus dem Debugger kopieren und in die Tabellenkalkulation einfügen; die Zelltrennzeichen sind die Leerzeichen.

Außerdem gibt es jetzt eine neue einfache Funktion SecTillClose(), die Ihnen die verbleibende Zeit in Sekunden bis zum Schließen des Devisenmarktes (MQs Zeitwährung) angibt - ohne CopyTime(). Dies ist für diejenigen interessant, die eine Position vor dem Wochenende schließen wollen oder keine neue Position innerhalb der angegebenen Zeit vor dem Wochenende eröffnen wollen.

Der mitgelieferte Indikator DealingWithTime_TestIndi.mq5 zeigt als Notiz zum Chart nicht nur die Sommerzeit in Europa, USA und Australien (Sydney) an, sondern auch die aktuelle Zeit und die Zeitdifferenz zwischen den Städten. Hier finden Sie Tabellen zum Vergleich der verschiedenen Ortszeiten in Großstädten: https: //www.timeanddate.com/worldclock/. So können Sie diese Werte jederzeit überprüfen. Der Indikator zeigt auch, wie diese Werte zu ermitteln und zu verwenden sind (was ist wovon abzuziehen oder zu was zu addieren), was es Ihnen erleichtert, ihn selbst zu verwenden - Kopieren und Einfügen, das ist die schnellste Form der Programmierung.

Die letzten beiden Zeilen zeigen auch die letzte Sekunde der aktuellen Forex-Sitzung sowie die verbleibende Zeit in Stunden (leichter zu beurteilen) und Sekunden. Wenn in New York die Forex-Sitzung am Freitag um 17:00 Uhr Ortszeit schließt, sind um 17:00 Uhr New Yorker Zeit keine gültigen Bars mehr geöffnet. Ziehen Sie daher in dieser Funktion 1 Sekunde ab, um die letzte gültige Öffnungszeit des letzten Balkens in der Zeit des Brokers zu erhalten. Einige Broker schließen den Devisenhandel jedoch einige Minuten früher und bieten keine Kurse mehr an oder nehmen keine Handelsaufträge mehr an.

Dealing with Time (Part 2): The Functions
Dealing with Time (Part 2): The Functions
  • www.mql5.com
Determing the broker offset and GMT automatically. Instead of asking the support of your broker, from whom you will probably receive an insufficient answer (who would be willing to explain a missing hour), we simply look ourselves how they time their prices in the weeks of the time changes — but not cumbersome by hand, we let a program do it — why do we have a PC after all.
 

Die Version von DealingWithTime.mqh v. 1.01 aus dem Artikel Dealing with Time (Part 2): Funktionen ( https://www.mql5.com/de/articles/9929 ) funktioniert nicht mehr, weil MQ das Verhalten von CopyTime( ) einige Zeit nach der Veröffentlichung dieses Artikels geändert hat. Jetzt gibt diese Funktion keine zukünftigen Zeitwerte mehr zurück, wenn sie größer sind als die TimeCurrent( ), die für die Parameter start_time und/oder stop_time angegeben wurde. Stattdessen gibt sie den maximal möglichen Eröffnungszeitwert des letzten aktuellen Balkens zurück.

Da das Ende der Währungssitzung so definiert wurde, dass es den Zeitversatz des Brokers bestimmt, führt dies nun zu falschen Werten!

Diese Berechnung wurde in der Version 2.03 geändert. Diese Version ist nun in der CodeBase hier verfügbar: https://www.mql5.com/de/code/45287.

Aber auch die Zeitumstellungsberechnung wurde komplett geändert, so dass die komplexen Zeitumstellungszeiten von Sydney, Australien zurück in die 70er Jahre nun abgedeckt sind.

Ebenfalls angehängt ist die DST-Tabelle 1975 - 2030.xlsx als zip-Datei mit allen Zeitumstellungen seit den 70er Jahren, damit jeder überprüfen kann, ob die Formeln korrekt funktionieren, hier ein Beispiel für die Tabellenreihe:

1. Januar 1982. - US-Standardzeit (DST == 0), und die nächste Änderung ist am 25. April 1982, dem letzten (25. des Monats) Sonntag im April (4). Die Tabelle ist bereits nach geografischer Zeitzone (Spalte A), dann nach Zeitzone des Jahres (Spalte L, spr=Frühling, aut=Herbst) und schließlich nach dem Datum der Abfrage (Spalte C) sortiert. Die Kalkulationstabelle kann vom aktivierten EA automatisch erstellt werden (das Skript kann nicht im Debug-Modus ausgeführt werden). Test_DST 2.mq5 wenn Sie es im Debug-Modus ausführen und die Protokollzeilen im Debugger kopieren und in die Kalkulationstabelle einfügen; das Zellentrennzeichen ist ein Leerzeichen.

Außerdem gibt es jetzt eine neue einfache Funktion SecTillClose(), die Ihnen die verbleibende Zeit in Sekunden (MQ-Zeitwährung) bis zur Schließung des Devisenmarktes angibt - ohne CopyTime(). Dies ist für diejenigen interessant, die ihre Positionen vor dem Wochenende schließen wollen oder in einem bestimmten Zeitraum vor dem Wochenende keine neue Position eröffnen wollen.

Der mitgelieferte Indikator DealingWithTime_TestIndi.mq5 zeigt als Kommentar zum Chart nicht nur die Sommerzeit in Europa, USA und Australien (Sydney) an, sondern auch die aktuelle Zeit und Zeitdifferenz verschiedener Städte. Hier finden Sie eine Tabelle mit verschiedenen Ortszeiten von Großstädten zum Vergleich: https://www.timeanddate.com/worldclock/. Auf diese Weise können Sie die Werte jederzeit überprüfen. Dieser Indikator zeigt auch, wie diese Werte definiert und verwendet werden (was wird wovon subtrahiert oder addiert), was es einfach macht, ihn selbst zu verwenden - Kopieren und Einfügen, die schnellste Form der Programmierung.

Die letzten beiden Zeilen zeigen auch die letzte Sekunde der aktuellen Devisensitzung und die verbleibende Zeit in Stunden (was leichter zu beurteilen ist) und Sekunden. Wenn in New York die Devisensitzung am Freitag um 17:00 Uhr Ortszeit schließt, ist um 17:00 Uhr New Yorker Zeit kein gültiger Barren geöffnet. Daher subtrahiert diese Funktion 1 Sekunde, um die letzte gültige Öffnungszeit des letzten Balkens in der Zeit des Brokers zu erhalten. Einige Broker beenden ihre Devisensitzung jedoch einige Minuten früher und stellen keine Kurse mehr zur Verfügung oder nehmen keine Handelsaufträge mehr an.

Dealing with Time (Part 2): The Functions
Dealing with Time (Part 2): The Functions
  • www.mql5.com
Determing the broker offset and GMT automatically. Instead of asking the support of your broker, from whom you will probably receive an insufficient answer (who would be willing to explain a missing hour), we simply look ourselves how they time their prices in the weeks of the time changes — but not cumbersome by hand, we let a program do it — why do we have a PC after all.
 

Hallo @Anil Varma

ich habe den letzten Beitrag des Autors @Carl Schreiber über die CopyTime() Funktion gelesen, aber da ich die 1. Version verständlicher finde, verwende ich immer noch DealingWithTime.mqh v . 1.01.

In meinem Indikator möchte ich:

Weisen Sie jedem Balken die NY-Rohzeit (Sekunden), die NY-Stunde und die NY-Minute zu, indem Sie die folgenden Puffer verwenden, damit sie im Datenfenster angezeigt werden:
double NyRawTimeBuffer[];
double NyHourBuffer[];
double NyMinuteBuffer[];
 void AssignNyTime (const datetime& time[],int rates_total)
   {
      
      MqlDateTime dT_struc;
      
      //--- Zu jeder Kerze zuordnen: NY Rohzeit (in Sekunden), NY Stunde, NY Minute
      ArraySetAsSeries(time,true);
      for(int z=0;z<rates_total;z++)
         { 
            checkTimeOffset(time[z]);                   // Änderungen der Sommerzeit prüfen
            datetime tC, tGMT, tNY;
            tC    = time[z];
            tGMT  = time[z] + OffsetBroker.actOffset;   // GMT
            tNY   = tGMT - (NYShift+DST_USD);           // Zeit in New York
            int j = int (tNY);                          // Umwandlung von datetime in int 
            NyRawTimeBuffer[z]=j;
            
            TimeToStruct(tNY,dT_struc);
            NyHourBuffer[z]=dT_struc.hour;
            NyMinuteBuffer[z]=dT_struc.min;
 
         }        
       
   return;
   }

Die Funktion funktioniert nur, wenn der Zeitrahmen Chart, in dem das Terminal startet, auf H1 eingestellt ist.

Wenn ich das Terminal schließe und der Zeitrahmen auf, sagen wir, M5 eingestellt ist, und dann starte ich das Terminal neu, bekomme ich folgenden Fehler:

2024.02.18 15:33:38.048 MyFractals_V4 (EURUSD,M5) 240: CopyTime() FAILED für EURUSD H1: brauche Zeiten von 2024.02.12 02:00:00, aber es gibt nur von 1970.01.01 00:00:00 Fehler: 4401

Sie haben mir bereits durch eine Nachricht vorgeschlagen, CheckLoadHistory() aus diesem Artikel ( https://www.mql5.com/de/code/1251 ) zu verwenden und es vor der Funktion CopyXXXX() in Ihrer Bibliothek zu platzieren:

//--- Ermittlung des Makler-Offsets
    OffsetBroker.set = false;
    
    CheckLoadHistory("EURUSD",PERIOD_H1,TERMINAL_MAXBARS,true);
      
    b = CopyTime("EURUSD",PERIOD_H1,BegWk+26*3600,5,arrTme);      // Ermittelt die Zeit des letzten 1-Stunden-Balkens vor der Umschaltung in der EU

Aber das Problem ist immer noch da.

In der checkhistory.mqh (Zeile 19) habe ich den folgenden Kommentar gefunden, aber ich verstehe nicht, ob das ein Problem sein könnte. Ich habe versucht, den Kommentar zu löschen und das Programm erneut zu testen, aber es hat nicht funktioniert.

//--- nicht nach dem Laden der eigenen Daten fragen, wenn es sich um einen Indikator handelt
   if(MQL5InfoInteger(MQL5_PROGRAM_TYPE)==PROGRAM_INDICATOR && Period()==period && Symbol()==symbol) return(true);

Gibt es eine Möglichkeit, den Fehler zu beheben, ohne zur aktualisierten Bibliothek DealingWithTimeV2.03.mqh zu wechseln, ohne den gesamten Code neu zu schreiben?




CheckHistory - Check and load history function
CheckHistory - Check and load history function
  • www.mql5.com
Slightly modified history load function from MetaQuotes.
 
Nauris Zukas Strategietester funktionieren, aber das tut sie nicht.


Ist die "Alternative über Input-Variablen" der einzige Weg, um korrekte Zeiten im Strategietester zu erhalten?

Hallo

Ich habe versucht, den Code wie folgt zu ändern, und bisher funktioniert es bei mir. Beachten Sie, dass ich die Klasse mit Konstruktoren konvertiert habe und alle Methoden Teil der Klasse sind. Die Klasse muss in Ihrer EA/Strategieklasse aufgerufen und initialisiert werden.

CDealWithTime.OnTick() sollte in EA/Strategy OnTick() platziert werden

//+-----------------------------------------------------------------------------------------------------------------------------+
//| Funktion zur Bestimmung des Makler-Offsets für die angegebene Zeit (tB)
//+-----------------------------------------------------------------------------------------------------------------------------+
void CDealWithTime::OnTick(void) {

                string vMethod = __FUNCTION__ + " Line[" + (string)__LINE__ + "] ";

                // Stündliche Aktualisierung von TimeH01[] durchführen
                if(IsNewBarH01()) {
      // ... BegWk = BoW(tC), Ursprünglicher Code
                        datetime weekBegin = BoW(TimeCurrent());
                        // Der ursprüngliche Code fügte der WeakBegin-Zeit 5 Takte hinzu.
                        // Die Addition von 5 Tagen * 3600 SekundenInStunde zur schwachen Anfangszeit entspricht nicht fünf Takten, da es möglicherweise keine Takte am
                        // Wochenende/Feiertag. Daher kann WeekBegin+5*3600 einen Zeitpunkt ergeben, an dem es keinen Balken gibt.
                        int                      barShift  = iBarShift(mSymbol,mTimeFrame,weekBegin+(5*3600));
                        // Gibt den ersten verfügbaren Balken zu Time(weekBegin+(5*3600)
                        datetime timeStop        = iTime(mSymbol,mTimeFrame,barShift);          // Letzter Ein-Stunden-Balken des Freitags vor der Umschaltung in der EU.
                        // Ergebnis bei Addition von Sekunden (weekBegin)+(5*3600): CDealWithTime::OnTick Line[229] : GetLastError[0] copiedTime EURUSD-PERIOD_H1 for [0] bars weekBegin[2024.01.01 02:00] to timeStop[2023.12.31 21:00] time5th[2023.12.29 23:00]
                        int bars = Bars(mSymbol,mTimeFrame,weekBegin,timeStop);

                        // Wir brauchen eine while..-Schleife, da IsNewBarH01() nur einmal auf dem Tick geprüft wird, wenn true dann bis zum nächsten neuen Takt keine weitere Prüfung
                        ResetLastError();
                        int attempt = 0;
                        while(CopyTime(mSymbol,mTimeFrame,weekBegin,timeStop,TimeH01) != bars && attempt <= 10) {
                                Sleep(100);
                                attempt++;
                        }
                        if(attempt > 0) {
                                PrintFormat("%s: GetLastError[%i] copiedTime %s-%s for [%i] bars weekBegin[%s] to timeStop[%i][%s]",vMethod,GetLastError(),mSymbol,EnumToString(mTimeFrame),bars,TimeToString(weekBegin),barShift,TimeToString(timeStop));
                        }
                }

                // Wöchentliche Überprüfung, ob sich die Sommerzeit geändert hat
                if(IsNewBarW01()) {
                        checkTimeOffset(TimeCurrent());
                        int  attempt  = 0;
                        bool isOffset = false;
                        do{
                                isOffset = setBokerOffset();
                                attempt++;
                        } while(!isOffset && attempt <= 10);
                }

} // Ende von OnTick()
 
amrali #:

Dieser Code berechnet automatisch die Sommerzeit für europäische und US-Broker:

https://www.mql5.com/de/code/27860

Der obige Code wurde in Forex Market Hours https://www.mql5.com/de/code/27771 verwendet , um die Änderungen der Sommerzeit zu berechnen.

Ähnliche Funktionen können für verschiedene Regionen der Welt erstellt werden.

Hallo Amrali

Schöner und einfacher Code als Alternative zum DealingWithTime v2.03 Artikel. Werde es mir für eine detailliertere Studie ansehen.

 
Daniel K #:
DealingWithTime.mqh v . 1.01.

Hallo Daniel

DealingWithTime.mqh v . 1.01. Dieser Artikel und sein Code funktionieren nicht mehr aufgrund von Änderungen in den MQL-Berechnungsmethoden, wie von Carl im Artikel DealingWithTime.mqh v 2.03 erklärt https://www.mql5.com/de/code/45287

Sie sollten ihn überhaupt nicht mehr verwenden.

Dealing with time (2) functions
  • www.mql5.com
Calculate DST for USA, EUR, AUD and RUB and the offset time of the broker automatically from the 70's until 2030 - even in the Strategy Tester of MQ.