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... :confused::confused::confused: 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 |
Alternativ kannst du die Orders auch ohne TP und SL öffnen, diese Werte aber in Variablen speichern und dann halt im laufenden Betrieb anfragen ob sie erreicht worden sind. Dann schließt du entsprechend deiner Strategie alle offenen Orders und wartest auf neue Einstiegssignale.
Wenn du das dennoch mit der History machen möchtest, dann ist die OrderOpenTime der letzten History order sinnvoll sein zu speichern, sobald du ein neues Einstiegssignal bekommen hast und im Anschluss die beiden Orders reinsetzt. In deinem Code sind mir aber noch zwei Fehler ausgefallen. Die zweite OrderSelect muss auf die Schleifenvariable c angesetzt werden. Außerdem musst du für die For-schleife die Zahlweise umdrehen. |
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--) |
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--) |
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
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 02:01 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