Zeit berechnen und als Printausgabe im StringFormat ausgeben

 

Liebe Community,

ich habe ein Problem.

Wie in der Kopie der Quelldatei (siehe Anhang) ersichtlich, möchte ich auf vielerlei Arten Zeiten verwenden.

So werden im EA Tradingzeiten angegeben (Zeit, wo TradingIsAllowed), es werden in verschiedenen Zeitblöcken die Highest- und Lowestwerte der Ranges berechnet.

posHigh 1 etc. gibt mir allerdings als Ergebnis "nur" die Position des Höchstkurses in der Range aus. Zum Beispiel 22,00000.

Ich kann natürlich jetzt händisch berechnen, welche Uhrzeit die Candle an dieser position hat:

Timefrasme M5; Position 22; Startzeit der "Range" 1:00h; 22 x 5 Minuten == 110 Minuten;

Position 22 hat eine Serverzeit von 02:50h. Zwische 1:00 und 4:00h war der Kurs in der Kerze von 2:50h am höchsten.

Diese Information möchte  ich gerne im Stringformat über eine Printausgabe vom EA erhalten.

Print(timePosHigh1 xxxxxxxxxxxx);

Dafür sind sicher in der CalcTradingTimes() einige Berechnungen erforderlich und die Print-Statements in der OnTick müssen da auch ergänzt werden.

Bisher bin ich mit meinen Versuchen, das so hinzubekommen grandios gescheitert, so dass ich keine Idee mehr habe, wie ich das hinbekomme.

Vielleicht kann mir da jemand weiterhelfen?

Herzlichen Dank.

Franz

Dateien:
 

Ich habe zwei Artikel geschrieben mit Code über Zeitberechnungen:

https://www.mql5.com/de/articles/9926

https://www.mql5.com/de/articles/9929

Ich denke, damit kannst Du Dir alles basteln, was Du brauchst.

Umgang mit Zeit (Teil 1): Die Grundlagen
Umgang mit Zeit (Teil 1): Die Grundlagen
  • www.mql5.com
Funktionen und Codeschnipsel, die den Umgang mit der Zeit, dem Broker-Offset und der Umstellung auf Sommer- oder Winterzeit vereinfachen und verdeutlichen. Genaues Timing kann ein entscheidendes Element beim Handel sein. Ist die Börse in London oder New York zur aktuellen Stunde bereits geöffnet oder noch nicht, wann beginnt und endet die Handelszeit für den Forex-Handel? Für einen Händler, der manuell und live handelt, ist dies kein großes Problem.
 
Carl Schreiber #:

Ich habe zwei Artikel geschrieben mit Code über Zeitberechnungen:

https://www.mql5.com/de/articles/9926

https://www.mql5.com/de/articles/9929

Ich denke, damit kannst Du Dir alles basteln, was Du brauchst.

Danke für den Hinweis.
Ich habe diese Artikel bei Erscheinen schon mal gelesen und soweit ich sie verstanden habe, geht es darin um die Behandlung der verschiedenen Zeitzonen, Lokalzeiten und der Serverzeit, damit der EA checkt, ob Börsenticker ist oder nicht. Das ist nicht das Problem, das sich mir stellt.
Ich habe ein Array mit Daten von z.B. Highs und kann die Position des höchsten Kurses in diesem speziellen Array auslesen. Aber was ich nicht kann ist, die Zeit dieses HöchstBars auslesen. 
Ein Array vom Typ MqlRates könnte Zeitabgaben machen, aber ich habe ein doubleArray, das die Werte über iHigh von z.B 1:00 bis 4:00 speichert. Mit ArrayMaximum erhalte ich dann die Position im Array, aber es ist mir nicht möglich, die Zeit des Bars an dieser Position zu erhalten. Leider.
 
ForexmailkontoFrLeLa #:
Danke für den Hinweis.
Ich habe diese Artikel bei Erscheinen schon mal gelesen und soweit ich sie verstanden habe, geht es darin um die Behandlung der verschiedenen Zeitzonen, Lokalzeiten und der Serverzeit, damit der EA checkt, ob Börsenticker ist oder nicht. Das ist nicht das Problem, das sich mir stellt.
Ich habe ein Array mit Daten von z.B. Highs und kann die Position des höchsten Kurses in diesem speziellen Array auslesen. Aber was ich nicht kann ist, die Zeit dieses HöchstBars auslesen. 
Ein Array vom Typ MqlRates könnte Zeitabgaben machen, aber ich habe ein doubleArray, das die Werte über iHigh von z.B 1:00 bis 4:00 speichert. Mit ArrayMaximum erhalte ich dann die Position im Array, aber es ist mir nicht möglich, die Zeit des Bars an dieser Position zu erhalten. Leider.
Mit: " .. ich habe ein doubleArray, das die Werte über iHigh von z.B 1:00 bis 4:00 speichert" machst Du Dir das Leben unnötig schwer. Nimm für den Indikator und den die Zeit- und Kurswerte gleiches _Symbol, gleiche _Periode und gleicher Zeitraum, dann sollten die Indexwerte übereinstimmen, sodass Du damit finden kannst, was Du suchst.
 
Carl Schreiber #:
Mit: " .. ich habe ein doubleArray, das die Werte über iHigh von z.B 1:00 bis 4:00 speichert" machst Du Dir das Leben unnötig schwer. Nimm für den Indikator und den die Zeit- und Kurswerte gleiches _Symbol, gleiche _Periode und gleicher Zeitraum, dann sollten die Indexwerte übereinstimmen, sodass Du damit finden kannst, was Du suchst.
Ich habe keinen Indikator; ich verwende 5 x 2 Arrays, wovon eines die highWerte und das Andere die lowWerte der verschiedenen Zeitblöcke speichert.
Mit ArrayMaximum und ArrayMinimum wird die Position des highestHigh und lowestLow im jeweiligen Array ermittelt und auch der Wert des jeweiligen Hochs und Tiefs wird berechnet. Dann wird die Differenz zwischen highest High und lowestLow als ArraySize ausgegeben. Das sind von 4 benötigten Parametern 3 die ich erhalte. Jetzt fehlt mir als 4  Parameter noch die Serverzeit des highestHighs bzw  lowestLow. Und an dem scheitere ich bislang.
Wenn das alles mittels Indikator zu bewerkstelligen geht,  dann kenne ich diesen Indikator leider kicht
 
ForexmailkontoFrLeLa #:
Ich habe keinen Indikator; ich verwende 5 x 2 Arrays, wovon eines die highWerte und das Andere die lowWerte der verschiedenen Zeitblöcke speichert.
Mit ArrayMaximum und ArrayMinimum wird die Position des highestHigh und lowestLow im jeweiligen Array ermittelt und auch der Wert des jeweiligen Hochs und Tiefs wird berechnet. Dann wird die Differenz zwischen highest High und lowestLow als ArraySize ausgegeben. Das sind von 4 benötigten Parametern 3 die ich erhalte. Jetzt fehlt mir als 4  Parameter noch die Serverzeit des highestHighs bzw  lowestLow. Und an dem scheitere ich bislang.
Wenn das alles mittels Indikator zu bewerkstelligen geht,  dann kenne ich diesen Indikator leider kicht

Dann nimm ein Array einer Struktur als Datenbasis, aus der Du die Werte der Strategie ausliest. Eine Struktur kann unterschiedliche Datentypen speichern, wie (mehrere) Zeitstempel (datetime) und reelle Werte (double) und ganze Zahlen (int).

Also ermittelst Du erst die relevanten Werte und trägst sie in die Struktur ein. Jetzt ist der Zugriff durch die Strategie viel einfacher, als wenn die Strategieentscheidungen und die Datenabfrage vermischt werden.

 
Du liest die Werte mit iHigh und iLow aus, richtig?

Dann kannst du mit iTime einfach das zugehörige Array mit den Zeiten erstellen.

Dann sind die Index Werte von ArrayMaximum auch die Indexe für das Zeit-Array.


 
Dominik Egert #:
Du liest die Werte mit iHigh und iLow aus, richtig?

Dann kannst du mit iTime einfach das zugehörige Array mit den Zeiten erstellen.

Dann sind die Index Werte von ArrayMaximum auch die Indexe für das Zeit-Array.


Ich lese die Werte über CopyHigh und CopyLow aus. Ich ermittle das HighestHigh und highestLow aus einer 3 - 4 StundenRange. Das geht glaub ich mit iHigh und iLow nicht.

Ich hab versucht, bei iTime als Shiftwert den Index des HighestHigh vom ArrayMaximum zu übergeben, bekomme allerdings als Ergebnis einen falschen Wert.

Leider funktioniert das so nicht.

 
Carl Schreiber #:

Dann nimm ein Array einer Struktur als Datenbasis, aus der Du die Werte der Strategie ausliest. Eine Struktur kann unterschiedliche Datentypen speichern, wie (mehrere) Zeitstempel (datetime) und reelle Werte (double) und ganze Zahlen (int).

Also ermittelst Du erst die relevanten Werte und trägst sie in die Struktur ein. Jetzt ist der Zugriff durch die Strategie viel einfacher, als wenn die Strategieentscheidungen und die Datenabfrage vermischt werden.

Danke für den Tipp!

Kann ich da einfach ein MqlRates Array erstellen? MqlRates speichert ja automatisch high-low und auch time im array und mit CopyRates kann ich ja  auch mein Zeitfenster definieren (TimeStart und TimeEnd). Dann das Array mit ArrayMaximum bzw. ArrayMinimum durchsuchen; und die Variable. die mir die Position des Höchstwertes und des Niedrigstwertes ausgibt einfach als Index übernehmen.

Das wäre dann z. B mrate[posHigh1].high.

Erhalte ich so den gesuchten Zeitpunkt in der printausgabe?

Danke.

Franz

 
ForexmailkontoFrLeLa #:

Danke für den Tipp!

Kann ich da einfach ein MqlRates Array erstellen? MqlRates speichert ja automatisch high-low und auch time im array und mit CopyRates kann ich ja  auch mein Zeitfenster definieren (TimeStart und TimeEnd). Dann das Array mit ArrayMaximum bzw. ArrayMinimum durchsuchen; und die Variable. die mir die Psition des Höchstwertes und des Niedrigstwertes ausgibt einfach als Index übernehmen.

Das wäre dann z. B mrate[posHigh1].high.

Erhalte ich so den gesuchten Zeitpunkt in der printausgabe?

Danke.

Franz

Du kannst eine eigene Array-Variable erstellen vom Typ MqlRates : https://www.mql5.com/de/docs/constants/structures/mqlrates:

MqlRates myData[];

wie im Beispiel dort. Allerdings (überschreibt) CopyRates(..) alle Daten und verändert die Größe auf die gebrauchte. Du müsstest alle benötigten Werte in Deinen Array copieren - vieleicht geht ArrayCopy().

Du könntest aber auch ein eigene Struktur (angelehnt an MqlRate) definieren und das als Typ eines Array nehmen - wie bei  MqlRates.

Bedenke: Je mehr man übernimmt was schon geht, desto weniger eigene Fehler behindern die eigene Entwicklung.

Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Datenstrukturen / Struktur der historischen Daten
Dokumentation zu MQL5: Konstanten, Enumerationen und Strukturen / Datenstrukturen / Struktur der historischen Daten
  • www.mql5.com
Struktur der historischen Daten - Datenstrukturen - Konstanten, Enumerationen und Strukturen - Nachschlagewerk MQL5 - Nachschlagewerk über die Sprache des algothitmischen/automatischen Handels für MetaTrader 5
 
Carl Schreiber #:

Du kannst eine eigene Array-Variable erstellen vom Typ MqlRates : https://www.mql5.com/de/docs/constants/structures/mqlrates:

wie im Beispiel dort. Allerdings (überschreibt) CopyRates(..) alle Daten und verändert die Größe auf die gebrauchte. Du müsstest alle benötigten Werte in Deinen Array copieren - vieleicht geht ArrayCopy().

Du könntest aber auch ein eigene Struktur (angelehnt an MqlRate) definieren und das als Typ eines Array nehmen - wie bei  MqlRates.

Bedenke: Je mehr man übernimmt was schon geht, desto weniger eigene Fehler behindern die eigene Entwicklung.

Danke Carl!

Ich habe als Array-Variable in der vorigen Frage MqlRates mrate[] angenommen. In dieses Array möchte ich alle Werte zwischen 01:00 und 04:00 h kopieren. Ich glaube, das sollte mit CopyRates funktionieren.

Meine Unsicherheit besteht darin, dass ich mir nicht sicher bin, dass die "Funktionen", die ich bisher in meinen double_Arrays anwende, in der Struktur_Variablen sprich im mrate[] gleichermassen funktionieren.

Im EA verwende ich das Timeframe M5; also werden mittels CopyRates 180 Datrensätze, die nach meinem Verständnis alle Werte wie

   datetime time;         // Anfangszeit der Periode 
   double   open;         // Eroeffnungspreis 
   double   high;         // der hoechste Preis der Periode 
   double   low;          // der niedrigste Preis der Periode 
   double   close;        // Schlusspreis 
   long     tick_volume;  // Tickvolumen
   int      spread;       // Spread
   long     real_volume;  // Lagervolumen  enthalten, in mrate[] kopiert.

Mit CopyRates füge ich die nötigen Angaben

Aufruf nach Anfangs- und Beendigungsdatum des angeforderten Zeitintervals

int  CopyRates(
   string           symbol_name,       // Symbolname
   ENUM_TIMEFRAMES  timeframe,         // Periode
   datetime         start_time,        // Anfangsdatum
   datetime         stop_time,         // Beendigungsdatum
   MqlRates         rates_array[]      // Feld, wohin Daten kopiert werden 
   );

ein.

Danach möchte ich mit ArrayMaximum das Array nach dem höchsten Highwert durchsuchen. Diese Funktion gibt mir ja einen IntegerWert, die Position im Array zurück:

Diesen Rückgabewert speichere ich in einer Variablen posHigh1 ab.

posHigh1 = ArrayMaximum(mrate);

 Erhalte ich dann den "Zeitstempel" der höchsten Kerze im Array über (Variable) TimeHigh = mrate[posHigh1].time???

Gibt mir dann

Print("Time High: ",  TimeToString(TimeHigh)) die Anfangszeit der Periode der Kerze mit dem höchstem Wert im Array aus????

Und mit mrate[posHigh1].high erhalte ich den doubleWert der höchsten Kerze usw.

Funktioniert das so?

Danke für deine Mühe

Franz