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](https://c.mql5.com/36/52/umgang-mit-zeit-teil-1-die-grundlag.jpg)
- www.mql5.com
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.
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.
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.
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.
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
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](https://c.mql5.com/36/52/dokumentation-zu-mql5-konstanten__1.png)
- www.mql5.com
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( |
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
![MQL5 - Sprache von Handelsstrategien, eingebaut ins Kundenterminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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