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: 4978
Beiträge: 44257
Benutzer: 7.222
Aktive Benutzer: 72
Links: 84
Wir begrüßen unseren neuesten Benutzer: Mane
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Mane
vor 2 Wochen
- AlbertZiz
vor 2 Wochen
- michak
vor 2 Wochen
- Amateur
vor 2 Wochen
- infos1982

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

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 20.06.20
Mitglied
 
Registriert seit: Jun 2020
Beiträge: 41
Michael_ befindet sich auf einem aufstrebenden Ast
Standard SL auf BE ziehen sobald erste Order im TP

Hallo und guten Abend zusammen!

Erst mal vorab: Dieses Forum ist echt toll, ich hab mir da schon sehr viele Infos und Hilfen geholt, das hat mir schon sehr geholfen! Ich bin zwar MQL4-Anfänger und hab nur ein wenig Vorwissen aus meiner Studienzeit vom C++ und Matlab Programmieren, aber dieses Forum hilft wirklich sehr.

Eines hab ich aber leider nicht gefunden, und zwar folgendes:

Ich hab einen EA programmiert, bei dem bei einem Signal immer 2 Orders eröffnet werden (LongOrder1 und LongOrder2 bzw. ShortOrder1 und ShortOrder2). Die erste Order hat einen näheren TP als die zweite. Jetzt zur Frage: Sobald der TP der LongOrder1 oder ShortOrder1 erreicht wurde, soll bei der LongOrder2 der TP auf Break-Even gezogen werden. Ich hab das folgendermaßen programmiert:

if(OrderSelect(LongOrder2,SELECT_BY_TICKET)==true)
{
if( OrderOpenPrice() > OrderStopLoss() && Bid - OrderOpenPrice() >= (OrderOpenPrice() - OrderStopLoss()) * TP_Prozent1)
{
bool BE_Long = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0);
}
}

Wenn der TP von LongOrder1 erreicht wird, wird zwar die LongOrder2 sofort auf Break-Even gezogen, aber danach gibt's einige "OrderModify Error 1". Was ich so gelesen habe, passiert das ja meistens, wenn bei der Order "nichts" geändert wird. Aber gerade das verstehe ich hier nicht, da ich ja auch OrderOpenPrice() > OrderStopLoss() definiere und daher die if-Schleife eigentlich gar nicht mehr ausgeführt werden sollte.

Ich hoffe ihr könnt mir hier helfen!
Danke gleich im Voraus dafür!!

Lieben Gruß,
Michael
  #2 (permalink)  
Alt 21.06.20
Mitglied
 
Registriert seit: Apr 2018
Beiträge: 103
daybyter befindet sich auf einem aufstrebenden Ast
Standard

Ich würde mir nach dem Select mal den open price und den sl mit print anzeigen lassen.
  #3 (permalink)  
Alt 21.06.20
Mitglied
 
Registriert seit: Jun 2020
Beiträge: 41
Michael_ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von daybyter Beitrag anzeigen
Ich würde mir nach dem Select mal den open price und den sl mit print anzeigen lassen.
Hey Daybyter,

hab ich mir gerade anzeigen lassen und das passt eigentlich auch. Der SL ist zuerst tiefer, sobald der erste TP erreicht wurde, wird der SL auf den OrderOpenPrice gezogen.

Danach schreibt er ganz normal nochmal die beiden Werte hin (die gleich sind) und danach kommt ja die if-Schleife mit der OrderModify-Funktion. Dort kommt dann auch der OrderModify-Error...

Wie gesagt, ich verstehe nicht, warum er diese if-Schleife überhaupt ausführt, wenn ich doch schreibe "if( OrderOpenPrice() > OrderStopLoss()"
  #4 (permalink)  
Alt 21.06.20
Mitglied
 
Registriert seit: Jun 2020
Beiträge: 41
Michael_ befindet sich auf einem aufstrebenden Ast
Standard

Noch was: Ich hab auch versucht, das Ganze mit einer bool'schen Funktion zu machen:

if(OrderSelect(LongOrder2,SELECT_BY_TICKET)==true)
{
Print("OrderOpenPrice: ", OrderOpenPrice());
Print("OrderStopLoss: ", OrderStopLoss());

bool LongOrder2_BE = true;

if(OrderOpenPrice() > OrderStopLoss()) LongOrder2_BE = true;
if(OrderOpenPrice() == OrderStopLoss()) LongOrder2_BE = false;
Print("LongOrder2_BE: ", LongOrder2_BE);

if(LongOrder2_BE == true && Bid - OrderOpenPrice() >= (OrderOpenPrice() - OrderStopLoss()) * TP_Prozent1)
{
bool BE_Long = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0);
}
}

Das echt komische dabei ist: Obwohl nach dem Nachziehen des SL's auf den Eröffnungspreis der Wert der Gleiche ist (sprich LongOrder2_BE = false sein müsste), zeigt mir der MT4 im Strategietester immer "true" an.

Hat wer eine Lösung für mich? Ich bin auch offen für eine andere Vorgehensweise, wie man die zweite Position auf BE zieht, sobald die erste im TP ist.

Danke gleich im Voraus!!
  #5 (permalink)  
Alt 21.06.20
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.735
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Das Handling mit double-Variablen ist derweil etwas kompliziert, ich würde fast sagen, dass sich da MQL etwas zickig hat und manchmal erst in der 9. oder 10. Stelle nach dem Komma eine Änderung um 1 zeigt, was dann bei einem Vergeich zum einer Nichtgleichheit bzw. eben auch zu einer eben Ungleichheit führen kann.

Ich würde mal testweise den ersten Code so schreiben, dass alle double-Variablen normiert werden:

double norm_var = NormalizeDouble(var, Digits);

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #6 (permalink)  
Alt 21.06.20
Mitglied
 
Registriert seit: Apr 2018
Beiträge: 103
daybyter befindet sich auf einem aufstrebenden Ast
Standard

Oder gib doch ein Limit für den Abstand vor:

if(MathAbs(OrderStopLoss() - OrderOpenPrice()) > 0.1) {
// ziehe den Stop nach...
  #7 (permalink)  
Alt 21.06.20
Mitglied
 
Registriert seit: Jun 2020
Beiträge: 41
Michael_ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
double norm_var = NormalizeDouble(var, Digits);
traderdoc
Guten Abend,

vielen Dank traderdoc, genau das war das Problem! Ist wirklich eine kleine "Zickerei" von MQL4, aber das Nachziehen auf BE funktioniert jetzt.

Eine weitere Frage dazu auch noch: Und zwar mach ich ja parallel zum BE ziehen auch noch eine weitere Funktion "Trailing Stop". Diese Funktion läuft eigentlich einwandfrei im Strategietester, aber nur ein einziges Mal zieht der EA den Stop per Trailing Stop für die LongOrder2 NICHT nach. Wie erwähnt, nur ein einziges Mal nicht, alle anderen Mal (keine Ahnung, vielleicht 50 Orders) schon.

Ist das ein Problem im Strategietester oder dem History Chart oder doch ein Fehler im EA?

Lieben Gruß,
Michael
  #8 (permalink)  
Alt 21.06.20
Elite Mitglied
 
Registriert seit: Apr 2011
Beiträge: 2.735
traderdoc befindet sich auf einem aufstrebenden Ast
Standard

Ein Fehler im EA.

traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis.
  #9 (permalink)  
Alt 22.06.20
Mitglied
 
Registriert seit: Jun 2020
Beiträge: 41
Michael_ befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von traderdoc Beitrag anzeigen
Ein Fehler im EA.

traderdoc
Hallo traderdoc,

mein Code für den Trailing Stop definiert sich derzeit so:

Der SL soll immer abhängig sein vom ursprünglichen SL (in Punkten) und einem Faktor, den ich extern definiere. Als Beispiel: Wenn der SL 50 Punkte ist und ich einen Faktor von 3 definiere, soll der SL nachgezogen werden, sobald der Kurs 150 Punkte über dem aktuellen SL ist. Nachgezogen wird aber nicht bei jedem Tick, sondern bei jedem Close einer M1-Kerze (immer das Hoch, deshalb im Code auch iHigh).

Der Code dazu ist folgender:

//Trailing-Stop für LongOrder2:
static datetime timestamp;
datetime time = iTime(NULL, PERIOD_M1, 0); //Nachziehen des Trailing Stops nur bei jeder neuen M1-Kerze und NICHT jedem Tick!
if(timestamp != time)
{
timestamp = time;

double norm_OOP = NormalizeDouble(OrderOpenPrice(),1);
double norm_OSL = NormalizeDouble(OrderStopLoss(),1);

double Initial_SL_Long = (OrderTakeProfit() - OrderOpenPrice()) * SL_Prozent/TP_Prozent2; //Ursprünglicher SL in Punkten
double TS_Long_Punkte = NormalizeDouble(Initial_SL_Long * TS_Faktor,1); //Trailing Stop in Punkten;

if( iHigh(NULL,0,1) - TS_Long_Punkte >= OrderStopLoss() && OrdersTotal() == 1 && iHigh(NULL,0,1) > norm_OSL + TS_Long_Punkte)
{
//Erklärung:

//iHigh(NULL,0,1) - TS_Long_Punkte >= OrderStopLoss(): Wenn das Hoch der vorherigen Kerze - Trailing Stop Abstand >= aktuellem SL ist, dann weiter hochziehen.
//OrdersTotal() == 1: Nur, wenn eine LongOrder2 vorhanden ist! Musste komischerweise nochmal hinzugefügt werden, OrderSelect-Funktion oben reicht nicht aus.
//iHigh(NULL,0,1) > norm_OSL + TS_Long_Punkte: Nur dann weiter hochziehen, wenn die Kerze wirklich höher ist als alle vorangegangenen Kerzen. Notwendig, falls 2 Mal ein gleiches Hoch vorhanden ist.

bool TS_Long = OrderModify(OrderTicket(), OrderOpenPrice(), iHigh(NULL,0,1) - TS_Long_Punkte, OrderTakeProfit(), 0);
}
}


Wie vorher beschrieben, funktioniert der Trailing Stop eigentlich perfekt, eben nur ein einziges Mal nicht. Warum nicht, das weiß ich nicht. Beinhaltet der Code einen Fehler?

Lieben Gruß,
Michael
  #10 (permalink)  
Alt 23.06.20
Mitglied
 
Registriert seit: Jun 2020
Beiträge: 41
Michael_ befindet sich auf einem aufstrebenden Ast
Standard

Hallo und guten Abend,

hat keiner einen Verbesserungsvorschlag zu dem o.g. Code?
Danke gleich!

Lieben Gruß,
Michael
Thema geschlossen

Lesezeichen

Stichworte
break-even, stop loss nachziehen

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 +2. Es ist jetzt 03:18 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.
-----------------------------------------------------------------------------------------------------------------------------