|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Schleife oder Bedingung einbauen
Hallo,
ich möchte in meinem EA eine Schleife oder Bedingung einbauen, weiß aber aktuell nicht wie die richtigen CodeZeilen sind. Grund-Idee: EA soll zB eine BUY-Order (TP 100 / SL 200) eröffnen, gleichzeitig eine SELL-STOP auf halbem Weg vom BUY StopLoss setzen mit doppelter LotSize. Sobald entweder die BUY-Order oder die SELL-Order im TakeProfit landen, ALLE offnen Orders schließen. CodeBsp.: for (int i=0; i<=OrdersHistoryTotal()-1; i++) if(OrderSymbol()==_Symbol) if(OrderMagicNumber()==MagicNumber) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true ) if(OrderProfit()>0) { for (int c=0; c<=OrdersTotal()-1; c++) if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==_Symbol) if(OrderMagicNumber()==MagicNumber) if(OrderType()==OP_BUYSTOP) bool close=OrderDelete(OrderTicket()); if(OrderType()==OP_SELLSTOP) bool close=OrderDelete(OrderTicket()); if(OrderType()==OP_BUY) bool close=OrderClose(OrderTicket(),OrderLots(),Bid,10, clrNONE); if(OrderType()==OP_SELL) bool close=OrderClose(OrderTicket(),OrderLots(),Ask,10, clrNONE); }; Jetzt ist keine Position mehr offen. Sobald ein neues Signal kommt, öffne wieder zB BUY & SELL-STOP Problem Der EA schließt sofort wieder die neuen Positionen, da die Bedingung "History: OrderProfit()>0" ja immer noch erfüllt ist... Lösungssuche Die "neuen" Positionen sollen nicht automatisch geschlossen werden sondern erst dann, wenn eine davon wieder im TP landet... Hat jemand eine Idee oder Lösungsansatz wie ich das Problem umgehen kann? Bisherige Gedankengänge: - dem EA sagen, wenn die letzte Order(History) "delete" ist, überspring den Block - wenn die neue OrderOpenTime() jünger ist als die im TP gelandete Position |
|
|||
Typischer Copy+Pase Fehler... stimmt meine for-loops waren falsch.
Danke, das hab ich jetzt mal angepasst für den History-Loop. Den OrdersTotal-Loop lasse ich immer noch hochzähöen, andernfalls bringt er mir eine Fehlermeldung beim Versuch Orders zu schließen. for (int i=0; i>=OrdersHistoryTotal()-1; i--) if(OrderSymbol()==_Symbol) if(OrderMagicNumber()==MagicNumber) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true ) if(OrderProfit()>0) if(OrdersTotal()>0) { for (int c=0; c<=OrdersTotal()-1; c++) if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==_Symbol) if(OrderMagicNumber()==MagicNumber) if(OrderType()==OP_BUYSTOP) bool close=OrderDelete(OrderTicket()); if(OrderType()==OP_SELLSTOP) bool close=OrderDelete(OrderTicket()); if(OrderType()==OP_BUY) bool close=OrderClose(OrderTicket(),OrderLots(),Bid,10, clrNONE); if(OrderType()==OP_SELL) bool close=OrderClose(OrderTicket(),OrderLots(),Ask,10, clrNONE); }; soweit funktioniert es... d.h. -Öffne Position sowie eine Gegenposition (STOP-Order) - wenn letzte abgeschlossene Order im Profit --> schließe alle anderen - danach warte auf Signal und eröffne wieder eine Position mit einer Gegenposition (STOP-Order) jetzt kommt das nächste Problem. Wenn die 2. Runde los geht, und die Order wieder im TP ist, schließt er die Gegenposition nicht.... echt zum verrückt werden |
|
||||
Du MUSST die Zählweise der For-Schleifen umdrehen, da sonst das Schließen von mehreren Positionen nicht richtig funktionieren wird.
Außerdem kann diese For-Schleife immer nur einmal durchlaufen, da du die i-Variable reduzierst und nicht erhöhst: Code:
for (int i=0; i>=OrdersHistoryTotal()-1; i--) So solltest du die For-Schleifen definieren: Code:
for (int i=OrdersHistoryTotal()-1; i>=0; i--) for (int c=OrdersTotal()-1; c>=0; c--) |
|
|||
was meinst du mit Hashtag Symbol einfügen?
|
|
||||
Wenn du hier was schreibst, kannst du vieles ändern (Schriftgröße, Aufzählung, usw.) Auswählbar über die Symbole. Das Hashtag-Symbol ist für das Einfügen von Code gedacht. Gehe mit der Maus drüber und es sollte dir auch angezeigt werden was wofür ist
|
|
|||
Ok verstanden
Soweit ist jetzt mal mein Code... Aber, wie gesagt, sobald ein TP war, schließt er alle offenen Aufträge. Er öffnet dann beim neuen Signal eine neue Position und löscht sie gleich wieder... ich bin im Moment absolut blind wie ich das umgehen kann Code:
for (int i=OrdersHistoryTotal()-1; i>=0; i--) if(OrderSymbol()==_Symbol) if(OrderMagicNumber()==MagicNumber) if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==true) if(OrderProfit()>0) if(OrdersTotal()>0) { for (int c=OrdersTotal()-1; c>=0; c--) if(OrderSelect(c,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==_Symbol) if(OrderMagicNumber()==MagicNumber) if(OrderType()==OP_BUYSTOP) bool close=OrderDelete(OrderTicket()); if(OrderType()==OP_SELLSTOP) bool close=OrderDelete(OrderTicket()); if(OrderType()==OP_BUY) bool close=OrderClose(OrderTicket(),OrderLots(),Bid,10,clrNONE); if(OrderType()==OP_SELL) bool close=OrderClose(OrderTicket(),OrderLots(),Ask,10,clrNONE); |
|
||||
Es fehlen geschweifte Klammern. Generell ist es so wie du es hier programmiert hast ziemlich schlecht zu lesen. Arbeite mit der Tastenkombination strg-komma, dann bekommt dein Code etwas Struktur.
|
|
|||
Wo fehlen deiner Meinung nach die {}?
sry - bin noch relativ neu bei dem Thema MQL4 Programmierung |
|
||||
Mindestens nach der zweiten magicOrderNumber If Abfrage. Ich lese das hier gerade am Handy. Das macht das debuggen nicht einfacher. Wenn du das hier ernst nimmst, dann lese dir erstmal ein Grundlagen-C Buch durch (muss kein dicker Welzer sein), dann geht alles andere einfacher. Gruß Timo
|
Lesezeichen |
|
|