Inhalte aufrufen

  • Über WindowsLive anmelden Log In with Google Anmelden
  • Mitglied werden
Profilbild

EA Neustart - Bestehende Orders erkennen

- - - - -

Best Answer traderdoc , 20 October 2019 - 14:37 Uhr

Vielen Dank für deinen Code ;)

 

Um for Schleifen hatte ich mich bisher immer etwas gedrückt, aber verkürzt den Code ja ungemein. 

 

Ich hoffe, dass ich die Logik des Zählers richtig verstanden habe:

 

  • Angenommen eine Buy-Order ist geöffnet.
  • OrdersTotal() hat dann den Wert 1. 
  • i (die Zähler-Variable) = 1. Es wird jedoch der Wert 1 substrahiert. i = 0 (OrdersTotal()-1)
  • Da i jetzt größer oder gleich 0 ist, ist die Bedingung für die Schleife erfüllt und es wird gezählt.
  • Es wird anhand von OrderSelect() geprüft, ob im OrderPool (SELECT_BY_POS) eine Order geöffnet ist bzw. eine Pending Order gesetzt wurde (MODE_TRADES). 
  • Da eine Buy-Order geöffnet ist, ist OrderSeclect() wahr (true) und gibt den Wert 1 zurück. i = 1. eine 1 für true, weil das Ergebnis der OrderSelect() bool ist, aber nicht i = 1
  • Von i wird der Wert 1 subtrahiert (i--). Jetzt ist i = 0. nein, i ist zwar 0, aber dieses i = 0 resultiert aus der for-Schleife
  • Die for Schleife beginnt beim nächsten Tick wieder von vorne, da i größer gleich 0 ist. ja, sofern mindestens eine Order offen ist

So korrekt, oder?

 

Ich kann doch auch die Abfrage von flag wie folgt coden, richtig?

if (flag = false) //das geht nicht, sondern wenn, dann nur if(flag == false) oder wie bereits von mir geschrieben: if(!false)
   {
      OpenTrades = OrderSend(Symbol(), OP_BUY, 0.01, Ask, 0, 0, 0, "", EAMagicNumber, 0, clrBlue);
   }

Finde ich für mich etwas übersichtlicher :)

 

Kann ich bei einer anderen for Schleife wieder die Variable i als Zähler nehmen, so lange die Variable i in der for Schleife deklariert wird (for (int i = OrdersTotal()-1; i >= 0; i--) oder ist das eher "unsauberes" Programmieren? Weil i ist doch jetzt nur innerhalb der Schleife "gültig", richtig?Ja, man kann dann wieder i als Schleifenindex benutzen.

 

Noch einmal vielen Dank für deine Hilfe! 

 

traderdoc

Go to the full post »


  • Du kannst leider keine neuen Themen eröffnen
  • Please log in to reply
5 Antworten zu diesem Thema

  #1
OFFLINE   Caligola

Hallo zusammen,

 

vor ca. einem Monat habe ich mich an die MQL4 Programmierung gewagt.

Der erste kleinere EA ist fertig und die ein oder andere Hürde die sich beim Programmieren so ergibt, ist bereits erfolgreich gemeistert.

 

Ein Problem, an dem ich aber schon etwas länger sitze und ich leider nicht so recht weiterkomme, ist der Fall, dass z.B. MT4 abstürzt oder der EA aus anderen Gründen neustartet und dann erkennen soll, dass evtl. schon Orders geöffnet sind. Momentan werden nach einem Neustart fleißig neue Orders eröffnet, zusätzlich zu den bereits bestehenden. 

 

Was ich probiert hatte, war eine Filterung nach Magic Number. Klappt an sich, aber ich möchte ungern für jedes Währungspaar / Timeframe eine eigenständige Magic Number vergeben.

 

Gibt es noch andere Möglichkeiten? 

 

Über was ich gestolpert bin, wären globale Variablen? Könnte man über OrderSelect und OrderTicket die Ticketnummer in einer globalen Variable speichern und beim Neustart abfragen? 

Müsste solch eine Abfrage in den int OnInit() Teil des Codes? 

 

Über Hinweise, Artikel, Tutorials etc. dazu wäre ich sehr dankbar! :)

 

VG

 

 



  #2
OFFLINE   traderdoc

Das regelt man über OrderSelect() und nachgeschalteter Abfrage des Handelsinstrumentes und ggf. der MagicNumber.
Mit OrderSymbol() wird das Symbol() überprüft und ggf. mit OrderMagicNumber() die für diesen EA des entsprechenden Chart
vergebene MagicNumber. Letztere wird allerdings nur benötigt, wenn ein Handelsinstrument auf mehreren Charts gleichzeitig läuft.

Nun benötigt man über die Abfrage evtl. offener Orders (OrderType() == OP_BUY bzw. OrderType() == OP_SELL) die Info, ob es sich um eine Buy- und/oder SellOrder handelt, sofern pro Chart immer nur 1 Buy- und/oder 1 SellOrder offen sein soll.

Oder sind es mehr als 1 Buy- und/oder 1 SellOrder?

 

Wenn ja, dann gäbe es die Möglichkeit über o.g. Abfrage die offenen Orders in Arrays zu speichern oder in der Tat in sog. GlobalVariables.

traderdoc


Bearbeitet von traderdoc, 17 October 2019 - 15:56 Uhr,

  • Caligola gefällt das
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierwünsche.

  #3
OFFLINE   Caligola

Vielen dank TraderDoc für deine Antwort.

 

 

 

Oder sind es mehr als 1 Buy- und/oder 1 SellOrder?

 

Nein, der EA soll nur eine Order eröffnen, je nach vorliegendem Handelssignal (auch keine Buy und Sell zugleich).

 

Habe deine Anmerkungen versucht wie folgt umzusetzen:

Please Login or Register to see this Hidden Content

Ist die Logik der Prüfung, ob der EA auf dem aktuellen Handelsinstrument bereits eine Buy- oder Sell-Order eröffnet hat, soweit ok?

Ich habe das erst einmal nur für eine Buy-Order geschrieben und die Bedingungen weggelassen, wenn denn überhaupt ein Buy-Signal vorliegt.

Ich kann das leider gerade nicht auf meinem Demo Account testen, da Wochenende :)

 

Der Compiler bringt mir jedoch die Fehlermeldung: "'==' - open parenthesis expected abc.mq4 53 59" für folgenden Code-Abschnitt:

Please Login or Register to see this Hidden Content

Zudem erscheint der Hinweis: "implicit conversion from 'number' to 'string' abc.mq4 72 69" für folgende Zeile:

Please Login or Register to see this Hidden Content

OpenTrades und OrderSend sind doch beide als integer deklariert, wieso dann der Hinweis?



  #4
OFFLINE   traderdoc

Please Login or Register to see this Hidden Content

So wären die beiden Zeilen richtig. Vergleiche bitte mit Deinen.

 

Insgesamt wird das aber alles noch nicht funktionieren, weil in Zeile 50 nicht die Ticketnummer sondern der laufende Index der offenen Orders benutzt werden muss.

In Summe aller notwendigen Zeilen reduziert sich der Code auf folgende Kürze:

Please Login or Register to see this Hidden Content

traderdoc


  • Caligola gefällt das
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierwünsche.

  #5
OFFLINE   Caligola

Vielen Dank für deinen Code ;)

 

Um for Schleifen hatte ich mich bisher immer etwas gedrückt, aber verkürzt den Code ja ungemein. 

 

Ich hoffe, dass ich die Logik des Zählers richtig verstanden habe:

 

  • Angenommen eine Buy-Order ist geöffnet.
  • OrdersTotal() hat dann den Wert 1. 
  • i (die Zähler-Variable) = 1. Es wird jedoch der Wert 1 substrahiert. i = 0 (OrdersTotal()-1)
  • Da i jetzt größer oder gleich 0 ist, ist die Bedingung für die Schleife erfüllt und es wird gezählt.
  • Es wird anhand von OrderSelect() geprüft, ob im OrderPool (SELECT_BY_POS) eine Order geöffnet ist bzw. eine Pending Order gesetzt wurde (MODE_TRADES). 
  • Da eine Buy-Order geöffnet ist, ist OrderSeclect() wahr (true) und gibt den Wert 1 zurück. i = 1.
  • Von i wird der Wert 1 subtrahiert (i--). Jetzt ist i = 0.
  • Die for Schleife beginnt beim nächsten Tick wieder von vorne, da i größer gleich 0 ist.  

So korrekt, oder?

 

Ich kann doch auch die Abfrage von flag wie folgt coden, richtig?

Please Login or Register to see this Hidden Content

Finde ich für mich etwas übersichtlicher :)

 

Kann ich bei einer anderen for Schleife wieder die Variable i als Zähler nehmen, so lange die Variable i in der for Schleife deklariert wird (for (int i = OrdersTotal()-1; i >= 0; i--) oder ist das eher "unsauberes" Programmieren? Weil i ist doch jetzt nur innerhalb der Schleife "gültig", richtig? 

 

Noch einmal vielen Dank für deine Hilfe! 


Bearbeitet von Caligola, 20 October 2019 - 14:13 Uhr,


  #6
OFFLINE   traderdoc

✓  Best Answer

Vielen Dank für deinen Code ;)

 

Um for Schleifen hatte ich mich bisher immer etwas gedrückt, aber verkürzt den Code ja ungemein. 

 

Ich hoffe, dass ich die Logik des Zählers richtig verstanden habe:

 

  • Angenommen eine Buy-Order ist geöffnet.
  • OrdersTotal() hat dann den Wert 1. 
  • i (die Zähler-Variable) = 1. Es wird jedoch der Wert 1 substrahiert. i = 0 (OrdersTotal()-1)
  • Da i jetzt größer oder gleich 0 ist, ist die Bedingung für die Schleife erfüllt und es wird gezählt.
  • Es wird anhand von OrderSelect() geprüft, ob im OrderPool (SELECT_BY_POS) eine Order geöffnet ist bzw. eine Pending Order gesetzt wurde (MODE_TRADES). 
  • Da eine Buy-Order geöffnet ist, ist OrderSeclect() wahr (true) und gibt den Wert 1 zurück. i = 1. eine 1 für true, weil das Ergebnis der OrderSelect() bool ist, aber nicht i = 1
  • Von i wird der Wert 1 subtrahiert (i--). Jetzt ist i = 0. nein, i ist zwar 0, aber dieses i = 0 resultiert aus der for-Schleife
  • Die for Schleife beginnt beim nächsten Tick wieder von vorne, da i größer gleich 0 ist. ja, sofern mindestens eine Order offen ist

So korrekt, oder?

 

Ich kann doch auch die Abfrage von flag wie folgt coden, richtig?

Please Login or Register to see this Hidden Content

Finde ich für mich etwas übersichtlicher :)

 

Kann ich bei einer anderen for Schleife wieder die Variable i als Zähler nehmen, so lange die Variable i in der for Schleife deklariert wird (for (int i = OrdersTotal()-1; i >= 0; i--) oder ist das eher "unsauberes" Programmieren? Weil i ist doch jetzt nur innerhalb der Schleife "gültig", richtig?Ja, man kann dann wieder i als Schleifenindex benutzen.

 

Noch einmal vielen Dank für deine Hilfe! 

 

traderdoc


  • Caligola gefällt das
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierwünsche.



Similar Topics

  Thema Eröffnet von Statistik Letzter Beitrag




0 Benutzer lesen gerade dieses Thema

0 Mitglieder, 0 Gäste, 0 anonyme Nutzer