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)
-   -   Probleme bei Breakeven, TP und SL Bestimmung, im Zusammenhang mit ATR (http://www.expert-advisor.com/forum/showthread.php?t=6597)

chesstigran 04.02.20 22:17

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;
    }

Mein Problem ist nun folgendes. Die Orders setzt er jeweils nur einmal und sie laufen auch nach der genauen Zeit ab.

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
kann mir da vllt jemand mal erklären was ich falsch gemacht habe?

das ganze ist übrigens in MQL 4 geschrieben..

MA-EA 05.02.20 05:30

Die OrderModify Funktion sieht komisch aus. Da scheint Alles gleich zu bleiben. :confused:

https://docs.mql4.com/trading/ordermodify

Edit:Und was ist eigentlich ATR? :confused:

chesstigran 05.02.20 09:38

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

MA-EA 05.02.20 09:48

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.

chesstigran 05.02.20 10:01

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
Es kann bei einem Einstiegspreis von 132.186 nicht sein das der TP bei 2*ATR 132.187 (also eine Pipette!!) ist. und deswegen oben der Code, also falls jemand weiter weiß wäre ich sehr dankbar <3

MA-EA 05.02.20 10:13

:confused:

Was ist das denn überhaupt für ne SL / TP Berechnung? Der ATR hat doch nen ganz anderen Wert als Bid/Ask.

traderdoc 05.02.20 17:03

Wo liegt denn dBuyStop bzw. dSellStop bzgl. dZoneHigh bzw. dZoneLow?

traderdoc

AVT 05.02.20 21:33

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

chesstigran 05.02.20 21:41

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;

TriggerPips wird je nach Währungspaar und Timeframe unterschiedlich festgelegt.

AVT 05.02.20 22:03

Wenn Du mit Popguns arbeitest, hast Du bedacht, daß Du für die Trigger den Wert der Outside zu der Kerzenzeit der Outside nimmst? AVT


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