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: 4562
Beiträge: 41310
Benutzer: 6.949
Aktive Benutzer: 214
Links: 82
Wir begrüßen unseren neuesten Benutzer: Gingen
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor 3 Tagen
- Gingen
vor 3 Tagen
- Mario9910
vor 4 Tagen
- FunThomas
vor 5 Tagen
- cavaliereg
vor 6 Tagen
- majid_z

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

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 18.09.20
Neues Mitglied
 
Registriert seit: Aug 2020
Beiträge: 24
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
Mit Zitat antworten
  #2 (permalink)  
Alt 18.09.20
Benutzerbild von Indikator-Trading
Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 128
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.
Mit Zitat antworten
  #3 (permalink)  
Alt 18.09.20
Neues Mitglied
 
Registriert seit: Aug 2020
Beiträge: 24
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
Mit Zitat antworten
  #4 (permalink)  
Alt 18.09.20
Benutzerbild von Indikator-Trading
Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 128
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--)
Mit Zitat antworten
  #5 (permalink)  
Alt 18.09.20
Neues Mitglied
 
Registriert seit: Aug 2020
Beiträge: 24
MarkusWilhelm89 befindet sich auf einem aufstrebenden Ast
Standard

was meinst du mit Hashtag Symbol einfügen?
Mit Zitat antworten
  #6 (permalink)  
Alt 18.09.20
Benutzerbild von Indikator-Trading
Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 128
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
Mit Zitat antworten
  #7 (permalink)  
Alt 18.09.20
Neues Mitglied
 
Registriert seit: Aug 2020
Beiträge: 24
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);
Mit Zitat antworten
  #8 (permalink)  
Alt 18.09.20
Benutzerbild von Indikator-Trading
Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 128
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.
Mit Zitat antworten
  #9 (permalink)  
Alt 18.09.20
Neues Mitglied
 
Registriert seit: Aug 2020
Beiträge: 24
MarkusWilhelm89 befindet sich auf einem aufstrebenden Ast
Standard

Wo fehlen deiner Meinung nach die {}?

sry - bin noch relativ neu bei dem Thema MQL4 Programmierung
Mit Zitat antworten
  #10 (permalink)  
Alt 18.09.20
Benutzerbild von Indikator-Trading
Mitglied
 
Registriert seit: May 2020
Ort: Bielefeld
Beiträge: 128
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
Mit Zitat antworten
Antwort

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 01:23 Uhr.





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