Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Programmierung MQL4 (http://www.expert-advisor.com/forum/forumdisplay.php?f=220)
-   -   Jeden Tag um 9 Uhr einen Trade öffnen - programmiertechnisch wie umsetzen? (http://www.expert-advisor.com/forum/showthread.php?t=6680)

LQK 03.06.20 16:24

Jeden Tag um 9 Uhr einen Trade öffnen - programmiertechnisch wie umsetzen?
 
Hallo,

ich arbeite zu Übungszwecken derzeit an der Umsetzung eins ganz einfachen EA. Der EA soll erstmal nicht viel mehr machen als jeden morgen um 9 Uhr einen Trade zu öffnen.

So weit, so einfach.

Die Uhrzeit frage ich so ab:

Code:

Uhrzeit = TimeHour(TimeCurrent())
Demnach bekomme ich jedesmal wenn zwischen 9:00 Uhr und 09:59 Uhr die o.g. Codezeile abläuft, als Wert für "Uhrzeit" den Wert 9.

Jetzt ist es aber so:

Die o.g. Funktion läuft jedes mal ab, wenn es einen neuen Tick gibt (vermute ich jedenfalls). Der Zeitpunkt, wann der nächste Tick auftritt, ist dabei jedoch offen. Das heißt, der erste Tick ab 9:00:00 kann genau um 9:00:00 auftreten, jedoch auch um 9:00:01, um 9:00:18, um 9:13:00 , um 9:27:01 usw. usf.

Allerdings soll jeweils nur für den ersten Tick ab 9:00:00 ein Trade eröffnet werden, nicht stumpf für jeden Trade, der zwischen 9:00:00 und 09:59:59 auftritt.

---

Meine Frage ist also:

Wie bewerkstellige ich es am besten, dass jeweils nur der erste Tick ab 9:00:00 Uhr zur Eröffnung eines Trades führt, jeder weitere Tick jedoch nicht?

Ich habe bereits eine Idee zur Umsetzung. Würde mich aber mal interessieren, wie andere über meine Idee denken. Oder vielleicht ist meine Idee ja unsinnig, und es gibt noch bessere Möglichkeiten oder andere Konventionen.

Also, meine Idee ist diese:

Ich verwende eine binäre Flag-Variable. um 8:59:59 ist der Wert dieser Flag-Variablen zunächst Null. Sobald ein Trade eröffnet wird, wird der Wert der Trade Variablen auf 1 gesetzt. Ein neuer Trade wird jedoch nur dann eröffnet, wenn der Wert der Flag-Variablen 0 beträgt. Beträgt der Wert der Flag-Variablen 1, wird kein weiterer Trade eröffnet. So wir verhindert, dass zwischen 9:00:00 und 09:59:59 mehr als ein Trade eröffnet wird.

Die Flag-Variable muss dann nach Ablauf der "heißen" Stunde (die heiße Stunde liegt zwischen 09:00:00 und 09:59:59 Uhr) wieder auf 0 gesetzt werden, dass am nächsten Tag wieder ein neuer Trade eröffnet werden kann. Z.B. könnte ich mir vorstellen, dass ab 10:00 geprüft wird, ob die Flag-Variable auf Null steht, und wenn das nicht der Fall ist, diese auf 0 gesetzt wird.

In Pseudocode ausgedrückt also etwa so:

Code:

if (Uhrzeit >= 10:00 Uhr)
    if (Flagvariable = 1)
    then (Flagvariable = 0),
else (Mache nichts)

Der Nachteil der o.g. Methode (ab 10 Uhr bei jedem Tick prüfen ob die Flag-Variable den Wert 0 hat) ist halt, dass bei jedem Tick Rechenzeit für eine in den meisten Fällen obsolete If-Anweisung "verbraten" wird.

Am besten wäre es, die Flagvariable wird einfach um 10 Uhr wieder auf Null gesetzt. Allerdings ginge das nur, ich den folgenden Pseudocode um 10:00 Uhr fix durchführen könnte (also jeden Tag haargenau um jeweils 10:00 Uhr), unabhängig davon, ob gerade ein Tick auftritt oder nicht:

Code:

if (Uhrzeit = 10 Uhr) Flagvariable = 0.
Gibt es dafür eine Möglichkeit, die Prüfung der Uhrzeit im EA so umzusetzen, dass die Prüfung der Uhrzeit unabhängig davon erfolgt, ob gerade ein Tick auftritt oder nicht?


Wenn das ginge, bräuchte ich allerdings vielleicht gar keine Flag-Variable mehr, da ich dann ja genausogut um 9 Uhr fix einen Trade öffnen kann, unabhängig vom auftreten eines Ticks, fällt mir gerade ein. ;)

Vielleicht gibt es aber auch nochmal ganz andere oder sogar bessere Möglichkeiten, die ich derzeit noch gar nicht kenne?


Ich freue mich über jeden konstruktiven Hinweis! :)

Grüße,
LQK

traderdoc 03.06.20 19:06

Code:

if (!Flag && Uhrzeit >= 10:00 Uhr) {
  //Action!
  Flag = true;
}

Wenn der Tageswechsel stattfand, wird wieder

Flag = false;

gesetzt.

traderdoc

LQK 04.06.20 15:17

Zitat:

Zitat von traderdoc (Beitrag 43816)
Code:

if (!Flag && Uhrzeit >= 10:00 Uhr) {
  //Action!
  Flag = true;
}

Wenn der Tageswechsel stattfand, wird wieder

Flag = false;

gesetzt.

traderdoc

Danke für diese kurze und pointierte Antwort! :)

Also, in Pseudocode ausgedrückt:

Code:

if (neuertaghatangefangen = true) FlagVariable = 0;
Aber woher beziehe ich dann die Information, dass ein neuer Tag angefangen hat?

Oder kurz ausgedrückt: Woher bekomme ich neuertaghatangefangen?



Beste Grüße,
LQK

LQK 04.06.20 18:12

Zitat:

Zitat von traderdoc (Beitrag 43816)
Code:

if (!Flag && Uhrzeit >= 10:00 Uhr) {
  //Action!
  Flag = true;
}

Wenn der Tageswechsel stattfand, wird wieder

Flag = false;

gesetzt.

traderdoc


Ich Trottel. Mit dem posten dieses Code-Schnippsels hast Du mir ja bereits eine (weitere) Lösung gepostet. Hatte das beim ersten Lesen nur übersehen, da ich nicht richtig hingeschaut hatte und dachte, Du hättest mich nur rezitiert. Stattdessen hast Du mir ja eine Lösung auf dem Silbertablett serviert! ;) Besten Dank, dafür! :)

Die Lösung ist ähnlich wie die erste von mir in Pseudocode verwendete Lösung. Du hast es mit einer if-Anweisung gemacht und mit einer && Verknüpfung, ich mit zwei if-Anweisungen. Ich denke mal, im Rechenaufwand nehmen sich die beiden Lösungen nicht viel. Auf jeden Fall sind zwei Rechenoperationen erforderlich (zwei mal if oder einmal if und &&).

Dachte gar nicht daran, dass man es auch mit && lösen kann, anstelle mit zwei if-Anweisungen. Wobei mir die Lösung mit && (also die von Dir gepostete Lösung) besser gefällt als meine, Verschachtelung von mehreren if-Anweisungen mag ich eigentlich nicht so besonders.

Eine weitere Interessante Info die ich aus Deinem Beitrag ableite, ist dass ich offenbar nicht völlig unsinnig in die falsche Richtung gedacht habe, was für mich schon mal eine sehr erfreuliche Nachricht ist und mir zeigt, dass ich manchmal anscheinend auf dem richtigen Weg bin! :)

Besten Dank noch mal und Grüße,
LQK

traderdoc 04.06.20 18:13

So wie bei jedem Kerzenwechsel das gemacht wird ist das auch hier:

Z.B.

if (DayOld != DayOfYear()) {
Flag = false;
DayOld = DayOfYear();
}

Fertig!

traderdoc


Alle Zeitangaben in WEZ +2. Es ist jetzt 06:57 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum