Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4973
Beiträge: 44345
Benutzer: 7.220
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: JosephTK
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 10 Stunden
- JosephTK
vor 2 Tagen
- Hopfen&Mal...
vor 3 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 768
Gesamt: 768
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 18.09.20
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 64
MarkusWilhelm89 befindet sich auf einem aufstrebenden Ast
Standard 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
  #2 (permalink)  
Alt 18.09.20
Benutzerbild von Indikator-Trading
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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.
  #3 (permalink)  
Alt 18.09.20
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 64
MarkusWilhelm89 befindet sich auf einem aufstrebenden Ast
Standard

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
  #4 (permalink)  
Alt 18.09.20
Benutzerbild von Indikator-Trading
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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--)
  #5 (permalink)  
Alt 18.09.20
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 64
MarkusWilhelm89 befindet sich auf einem aufstrebenden Ast
Standard

was meinst du mit Hashtag Symbol einfügen?
  #6 (permalink)  
Alt 18.09.20
Benutzerbild von Indikator-Trading
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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
  #7 (permalink)  
Alt 18.09.20
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 64
MarkusWilhelm89 befindet sich auf einem aufstrebenden Ast
Standard

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);
  #8 (permalink)  
Alt 18.09.20
Benutzerbild von Indikator-Trading
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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.
  #9 (permalink)  
Alt 18.09.20
Mitglied
 
Registriert seit: Aug 2020
Beiträge: 64
MarkusWilhelm89 befindet sich auf einem aufstrebenden Ast
Standard

Wo fehlen deiner Meinung nach die {}?

sry - bin noch relativ neu bei dem Thema MQL4 Programmierung
  #10 (permalink)  
Alt 18.09.20
Benutzerbild von Indikator-Trading
Premium Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 345
Indikator-Trading befindet sich auf einem aufstrebenden Ast
Standard

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
Thema geschlossen

Lesezeichen

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +1. Es ist jetzt 08:45 Uhr.





Suchmaschine - Reisen - Wavesnode - Facebook Forum - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------