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)
-   -   Schleife oder Bedingung einbauen (http://www.expert-advisor.com/forum/showthread.php?t=6781)

MarkusWilhelm89 18.09.20 07:47

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

Indikator-Trading 18.09.20 14:44

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.

MarkusWilhelm89 18.09.20 15:29

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

Indikator-Trading 18.09.20 15:42

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--)
Füge am besten Code hier auch entsprechend richtig ein (Hashtag Symbol), dann lässt er sich besser lesen.

So solltest du die For-Schleifen definieren:
Code:

for (int i=OrdersHistoryTotal()-1; i>=0; i--)
for (int c=OrdersTotal()-1; c>=0; c--)


MarkusWilhelm89 18.09.20 15:47

was meinst du mit Hashtag Symbol einfügen?

Indikator-Trading 18.09.20 15:58

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

MarkusWilhelm89 18.09.20 16:10

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);


Indikator-Trading 18.09.20 16:23

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.

MarkusWilhelm89 18.09.20 16:31

Wo fehlen deiner Meinung nach die {}?

sry - bin noch relativ neu bei dem Thema MQL4 Programmierung

Indikator-Trading 18.09.20 16:37

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 07:25 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