|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Probleme bei Breakeven, TP und SL Bestimmung, im Zusammenhang mit ATR
Moin,
mein Code funktionierte noch vorhin, und jetzt irgendwie nicht mehr und ich verstehe nicht wieso. Ziel des ganzen ist folgendes: 1. Take Profit Bestimmung durch 2*ATR Wert + Triggerzone (der Strategie, also einfach ein fester Wert.) 2. Breakeven setzen wenn der Trade 1*ATR im Profit ist. 3. SL Bestimmung durch 1*ATR abgezogen (oder addiert je nachdem obs Buy oder Sell ist ) von der Triggerzone. Code:
bool bResult=false; double EinmalATR = iATR(OrderSymbol(),_Period,14,1); double ZweimalATR = 2*iATR(OrderSymbol(),_Period,14,1); double dBuyTPatr = dZoneHigh + ZweimalATR; double dSellTPatr = dZoneLow - ZweimalATR; double dBuySLatr = dZoneHigh - EinmalATR; double dSellSLatr = dZoneLow + EinmalATR; if (Schritt1 == true && Schritt2 == true && Schritt3 == true && Schritt4 == true && IsNewCandle ()) { int BuyStop = OrderSend ( Symbol(), // currency pair on the chart OP_BUYSTOP, // place a buystop Lotsize, // how much lot dBuyStop, // entry 20, // allow only 3 pips of deviation dBuySLatr, // StopLoss dBuyTPatr, // TakeProfit NULL, // no comment 0, // no ID number ExpirationTime, // expiration date Green // color of the order in the chart ); int SellStop = OrderSend ( Symbol(), // currency pair on the chart OP_SELLSTOP, // place a buystop Lotsize, // how much lot dSellStop, // entry 20, // allow only 3 pips of deviation dSellSLatr, // StopLoss dSellTPatr, // TakeProfit NULL, // no comment 0, // no ID number ExpirationTime, // expiration date Green // color of the order in the chart ); for(int i = OrdersTotal() - 1; i >= 0; i--) { if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) { if(OrderType() == OP_BUY && OrderOpenPrice() > OrderStopLoss() && Bid - OrderOpenPrice() >= EinmalATR) { bResult = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0); } if(OrderType() == OP_SELL && OrderOpenPrice() < OrderStopLoss() && OrderOpenPrice() - Ask >= EinmalATR){ bResult = OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0); } } } } else { return; } Allerdings werden die Takeprofits komisch bestimmt (ich habe das ganze auf GBPJPY getestet, was ein sehr volatiles Währungspaar ist und das auf H1), und die Stoplosse immer clean auf 15 Pips, und das versteh ich nicht. HTML-Code:
13 2019.10.03 04:05 sell stop 6 9.98 (Preis)131.585 (SL)131.736 (TP)131.582 (Gewinn)0.00 (Kontostand)99899.64 das ganze ist übrigens in MQL 4 geschrieben.. |
|
|||
Die OrderModify Funktion sieht komisch aus. Da scheint Alles gleich zu bleiben.
https://docs.mql4.com/trading/ordermodify Edit:Und was ist eigentlich ATR? |
|
|||
ATR ist Average of True Range. Ein Indikator der dir einen Pipwert wiedergibt der der Durchschnitt der letzen 14(das kannst du selber entscheiden kannst zb auch 50 nehmen) Kerzen anzeigt.
Ja das könnte vllt auch sein aber wo ist der Fehler? Order wird modifyed und das SL wird auf OrderOpenPrice gezogen das ergibt doch nur sinn. Leider weiß ich nicht wo der Fehler ist.. |
|
|||
Der Fehler ist vermutlich der Spread. ATR hin oder her, der Spread wird beim Long öffnen und beim Short schließen aufgeschlagen. Der muss mit einkalkuliert werden.
|
|
|||
Es geht hier nicht um den Spread , es geht hier darum das beispielsweise der TP komisch bestimmt wird und die Breakevenfunktion irgendwie nicht so funktioniert wie sie funktionieren sollte, und ich weiß nicht woran das liegt.
HTML-Code:
1 2019.10.01 10:43 buy stop 1 10.00 132.186 132.036 132.187 0.00 100000.00 |
|
|||
Was ist das denn überhaupt für ne SL / TP Berechnung? Der ATR hat doch nen ganz anderen Wert als Bid/Ask. |
|
|||
Wo liegt denn dBuyStop bzw. dSellStop bzgl. dZoneHigh bzw. dZoneLow?
traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
So wie ich die Doks verstanden habe, gilt dieser Slippage/Deviation Wert nur wenn man Signale aus einem Signal-Dienst empfangen will. Für die reale (also wenn man selber seinen eignen EA laufen läßt) nehme ich einen BE erst dann, wenn alle Kosten (Trade im Plus + Kommission) gedeckt sind und dann noch 2* Spread obendrauf. Bei mir kommt reale Slippage zu ca. 50% vor, unterm Strich mehr negativ als positiv - und der doppelte Spread reicht, um im Plus zu bleiben. AVT
|
|
|||
Code:
if (ActCurrPair == "US30" && ActTimeFrame == 15) { //für Doe 20 Pips zum Triggern der Popgun TriggerPips = 20; Lotsize = Equity / 100000; } if (ActCurrPair == "US30" && ActTimeFrame == 30) { TriggerPips = 20; Lotsize = Equity / 100000; } if (ActCurrPair == "US30" && ActTimeFrame == 60) { TriggerPips = 20; Lotsize = Equity / 100000; } if(ActCurrPair == "GER30" && ActTimeFrame == 15) { // für Dax 10 Pips zum Triggern der Popgun TriggerPips = 10; Lotsize = Equity / 100000; } if(ActCurrPair == "GER30" && ActTimeFrame == 30) { TriggerPips = 10; Lotsize = Equity / 100000; } if(ActCurrPair == "GER30" && ActTimeFrame == 60) { TriggerPips = 10; Lotsize = Equity / 100000; } if (ActCurrPair == "XAUUSD" && ActTimeFrame == 15) { // für Gold 1.0 = 10 Pips zum Triggern der Popgun TriggerPips = 1.0; Lotsize = Equity / 10000; } if (ActCurrPair == "XAUUSD" && ActTimeFrame == 30) { TriggerPips = 1.0; Lotsize = Equity / 10000; } if (ActCurrPair == "XAUUSD" && ActTimeFrame == 60) { TriggerPips = 1.0; Lotsize = Equity / 10000; } if(ActTimeFrame == 15 && ActCurrPair == "GBPJPY") { // für die JPY Paare und Öl 0.1 = 10 Pips zum Triggern der PG TriggerPips = 0.1; Lotsize = Equity / 10000; } if(ActTimeFrame == 30 && ActCurrPair == "GBPJPY") { TriggerPips = 0.1; Lotsize = Equity / 10000; } if(ActTimeFrame == 60 && ActCurrPair == "GBPJPY") { TriggerPips = 0.1; Lotsize = Equity / 10000; } if (ActTimeFrame == 15 && ActCurrPair == "GBPAUD") { TriggerPips = 0.001; Lotsize = Equity / 10000; } if (ActTimeFrame == 30 && ActCurrPair == "GBPAUD") { TriggerPips = 0.001; Lotsize = Equity / 10000; } if (ActTimeFrame == 60 && ActCurrPair == "GBPAUD") { TriggerPips = 0.001;; Lotsize = Equity / 10000; } if (ActTimeFrame == 15 && ActCurrPair == "EURAUD") { TriggerPips = 0.001; Lotsize = Equity / 10000; } if (ActTimeFrame == 30 && ActCurrPair == "EURAUD") { TriggerPips = 0.001; Lotsize = Equity / 10000; } if (ActTimeFrame == 60 && ActCurrPair == "EURAUD") { TriggerPips = 0.001; Lotsize = Equity / 10000; } double dZoneLow = NormalizeDouble(Low[1],Digits); double dZoneHigh = NormalizeDouble(High[1],Digits); double dSellStop = dZoneLow-TriggerPips; double dBuyStop = dZoneHigh+TriggerPips; |
Lesezeichen |
Stichworte |
atr auslesen, breakeven berechnen, expert adviosor |
|
|