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)
-   -   SL auf BE ziehen sobald erste Order im TP (http://www.expert-advisor.com/forum/showthread.php?t=6702)

Michael_ 20.06.20 21:29

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

daybyter 21.06.20 04:53

Ich würde mir nach dem Select mal den open price und den sl mit print anzeigen lassen.

Michael_ 21.06.20 09:51

Zitat:

Zitat von daybyter (Beitrag 43924)
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()"

Michael_ 21.06.20 12:23

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!!

traderdoc 21.06.20 14:13

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

daybyter 21.06.20 21:22

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

if(MathAbs(OrderStopLoss() - OrderOpenPrice()) > 0.1) {
// ziehe den Stop nach...

Michael_ 21.06.20 21:49

Zitat:

Zitat von traderdoc (Beitrag 43932)
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

traderdoc 21.06.20 21:55

Ein Fehler im EA.

traderdoc

Michael_ 22.06.20 10:58

Zitat:

Zitat von traderdoc (Beitrag 43938)
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

Michael_ 23.06.20 22:14

Hallo und guten Abend,

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

Lieben Gruß,
Michael


Alle Zeitangaben in WEZ +2. Es ist jetzt 18:58 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