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)
-   -   StopLoss auf Break Even nachziehen (http://www.expert-advisor.com/forum/showthread.php?t=1809)

Biatsch 05.01.12 01:24

StopLoss auf Break Even nachziehen
 
Kann mir jemand in Code-Form aufschreiben, wie ich den StopLoss einer bestehenden Order auf Break Even ziehe, sobald ich 20 Pips im Plus bin und die Order anschließend mit einem TrailingStop versehe ?

Seroleashed 05.01.12 07:36

Joa das wäre cool!!

Aber nur So nebenbei: Breakeven bedeutet, dass man gerade an die Stelle kommt, an der man keinen Verlust mehr macht (aber auch noch keinen Gewinn). Man geht also +-0 aus dem Trade (bzw setzt den Stoploss so, dass man +-0 ausgehen würde). Der Breakeven wäre meiner Meinung nach also nicht der Einstiegskurs sondern wenn überhaupt der Einstiegskurs Plus Spread... als sicherheitsfanatiker oder "ganz genauer" könnte man auch noch Plus ein paar Pips als Ausgleich für die Evtl anfallende Kommission dazu rechnen;-p
Nur fürs allgemeine Verständnis, damit keine Missverstände auftreten!!:p

naranjoe 05.01.12 08:52

Hallo,

das ist kein Problem.

Code:


void UpdateBE()
{
 if(UpdateToBE <= 0) return;

 for(int i = OrdersTotal() - 1; i >= 0; i--)
  {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
      if(OrderType() == OP_BUY && OrderOpenPrice() > OrderStopLoss() && Bid - OrderOpenPrice() >= UpdateToBE * Point)
          {
            OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0);
          }
                 
          if(OrderType() == OP_SELL && OrderOpenPrice() < OrderStopLoss() && OrderOpenPrice() - Ask >= UpdateToBE * Point)
          {
            OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0);
          }
      }
    }
}

Definiere UpdateToBE als externe Variable und setzte sie z.B. auf 20 Pips (bei 0 wird kein Update to BE ausgeführt).
Das void UpdateBE() rufst du aus der void Start() auf (also bei jedem Tick).
Fertig!
Spread wird berücksichtigt.
Läuft die Order nach dem Break Even Update ins SL wird sie exakt mit 0 geschlossen.

Gruß
naranjoe

Biatsch 05.01.12 16:16

Danke dir für den Code.
Und wie füge ich nun einen TrailingStop zu eben dieser Order hinzu ?

Seroleashed 05.01.12 16:57

Wenn ich den Code richtig verstehe, IST das der Training Stopp.
Bei jedem Tick, also jeder Kursänderung wird überprüft, ob der Kurs gestiegen ist. Wenn er gestiegen sein sollte wird der aktuelle StopLoss gelöscht und ein neuer mit dem vorgegebenen Abstand wird erstellt.
Nichts anderes ist ein TrailingStop vom Broker;-p

naranjoe 05.01.12 17:16

Diese Funktion beinhaltet keinen Trailing Stop.
Es funktioniert so:
Wenn deine Order einen bestimmten Wert (UpdateToBE) im Plus ist, dann wird der Stop Loss auf den Eröffnungspreis der Order gesetzt. Läuft jetzt der Kurs zurück und der Stop Loss wird erreicht, (welcher ja jetzt mit dem Eröffnungspreis übereinstimmt) wird die Order genau bei 0 geschlossen.

Code für den Trailling Stop folgt.

Gruß
naranjoe

naranjoe 05.01.12 18:01

Trailing Stop
 
Eröffne deine Order mit TrailingStop Pips als Stop Loss (also z.B. 20).
Das SL wird dann immer mit dem Abstand von 20 Pips der Order nachgezogen oder halt eben ausgelöst (wenn der Kurs dreht). Dafür solltest du auch ein Take Profit wählen das etwas größer ist z.B. 50.
Aufruf von void UpdateTS erfolgt wie beim void UpdateBE.

Code:

void UpdateTS()
{
  for(int i = OrdersTotal() - 1; i >= 0; i--)
        {
        if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
            {
              if(OrderType() == OP_BUY && NormalizeDouble(Bid - OrderStopLoss(), Digits) > NormalizeDouble(TrailingStop * Point, Digits))
                {
                OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TrailingStop * Point, OrderTakeProfit(), 0);
                }
              if(OrderType() == OP_SELL && NormalizeDouble(OrderStopLoss() - Ask, Digits) > NormalizeDouble(TrailingStop * Point, Digits))
                  {
                  OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TrailingStop * Point, OrderTakeProfit(), 0);
                  }
              }
        }
}

Das hier stellt nur ein Grundgerüst dar, um die Funktionsweise zu erläutern. Du solltest den Code aber noch erweitern. z.B.müsste der EA auch feststellen ob die ausgewählte Order auch die Richtige ist, Stichwort Symbol() oder MagicNumber.
Aber das überlasse ich mal dir ;)

Gruß
naranjoe

Biatsch 20.01.12 00:10

Und wie weise ich diese 2 Funktionen einer bestimmten Order zu ?
Sorry, aber ich bin halt noch Anfänger.

Ich habe gerade erst das visuelle Backtesting ausprobiert und festgestellt, dass die BreakEven-Funktion nichts tut.

Zur Info:
Ich habe die genannte Funktion innerhalb der Start-Funktion eingefügt aber ohne die letzte und die ersten 3 Zeilen, also folgendermaßen:

HTML-Code:

for(int i = OrdersTotal() - 1; i >= 0; i--)
  {
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
      {
      if(OrderType() == OP_BUY && OrderOpenPrice() > OrderStopLoss() && Bid - OrderOpenPrice() >= UpdateToBE * Point)
          {
            OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0);
          }
                 
          if(OrderType() == OP_SELL && OrderOpenPrice() < OrderStopLoss() && OrderOpenPrice() - Ask >= UpdateToBE * Point)
          {
            OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0);
          }
      }
    }

Wo liegt mein Denkfehler ?

naranjoe 20.01.12 07:29

Zitat:

Und wie weise ich diese 2 Funktionen einer bestimmten Order zu ?
Gar nicht, die Funktionen finden die Order selbst wenn die Bedingungen zutreffen.
Häng doch mal deinen kompletten Code hier dran, dann lässt sich der Fehler
ganz leicht herausfinden und erklären.

Gruß
naranjoe

Biatsch 20.01.12 08:54

HTML-Code:

extern double dLots=0.1;
extern int iStopLoss=6500;
extern int iTakeProfit=500;
extern int iSlippage=30;
extern int iMaxTrades=1;
extern int iMagicNumber=11111;
extern int UpdateToBE=30;


int iTradeSignal=0;
int iOpenBuySignal=10;
int iCloseBuySignal=-10;
int iOpenSellSignal=20;
int iCloseSellSignal=-20;
int iNoSignal=-1;

int iTotalTrades;
int iOrderOpenStatus;
int iErrorNumber;

string strErrorMessage;

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {

  double MAshort1 = iMA(NULL,15,20,0,MODE_EMA, PRICE_CLOSE,1);
  double MAshort0 = iMA(NULL,15,20,0,MODE_EMA, PRICE_CLOSE,0);
  double MAmiddle = iMA(NULL,60,20,0,MODE_EMA, PRICE_CLOSE,0);
  double MAlong  = iMA(NULL,240,20,0,MODE_EMA, PRICE_CLOSE,0);
  double Close1  = iClose(NULL,0,1);
  double Close2  = iClose(NULL,0,2);
  double Close3  = iClose(NULL,0,3);
  double SAR0    = iSAR(NULL,15,0.02,0.2,0);    // Unbenutzt
  double SAR1    = iSAR(NULL,15,0.02,0.2,1);
  double SAR2    = iSAR(NULL,15,0.02,0.2,2);
  double SAR3    = iSAR(NULL,15,0.02,0.2,3);
 
//-------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------BUY_LOGIK-------------------------------------------------------------------------------
if((Ask<MAlong) && (Ask<MAmiddle) && (Ask>MAshort0) && (Close1<MAshort1)){
  if((Close3>
SAR3) && (Close2>SAR2) && (Close1>SAR1))
      iTradeSignal = iOpenBuySignal;
  }
 
//-------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------SELL_LOGIK------------------------------------------------------------------------------
if((Bid>MAlong) && (Bid>MAmiddle) && (Bid<MAshort0) && (Close1>MAshort1)){
  if((Close3<SAR3) && (Close2<SAR2) && (Close1<SAR1))
      iTradeSignal = iOpenSellSignal;
}

//--------------------------------------------------------------------------------------------------------------------------------
//----------------------------------MONEY_MANAGEMENT------------------------------------------------------------------------------
for(int i = OrdersTotal(); i >
= 1; i--)
{
    if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
      if(OrderType() == OP_BUY && OrderOpenPrice() > OrderStopLoss() && Bid - OrderOpenPrice() >= UpdateToBE * Point)
              {
                OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0);
              }
                 
      if(OrderType() == OP_SELL && OrderOpenPrice() < OrderStopLoss() && OrderOpenPrice() - Ask >= UpdateToBE * Point)
              {
                OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice(), OrderTakeProfit(), 0);
              }
    }
}
//--------------------------------------------------------------------------------------------------------------------------------
//---------------------------------------------BUY_ORDER--------------------------------------------------------------------------
iTotalTrades=OrdersTotal();

if ((iTradeSignal == iOpenBuySignal) && (iTotalTrades < iMaxTrades))

{
double dBuyStopLoss=Ask-(iStopLoss*Point);
double dBuyTakeProfit=Ask+(iTakeProfit*Point);


iOrderOpenStatus=OrderSend (Symbol(), OP_BUY,dLots, Ask, iSlippage, dBuyStopLoss, dBuyTakeProfit, "EA",iMagicNumber,0,Green);
  if (iOrderOpenStatus<0)
      {
      iErrorNumber=GetLastError();
      Print ("Order fehlgeschlagen!: ", iErrorNumber);
      return;
      }
}
//--------------------------------------------------------------------------------------------------------------------------------
//----------------------------------------------SELL_ORDER------------------------------------------------------------------------

iTotalTrades=OrdersTotal();

if ((iTradeSignal == iOpenSellSignal) && (iTotalTrades < iMaxTrades))

  {
  double dSellStopLoss=Bid+(iStopLoss*Point);
  double dSellTakeProfit=Bid-(iTakeProfit*Point);
 
 
iOrderOpenStatus=OrderSend (Symbol(), OP_SELL,dLots, Bid, iSlippage, dSellStopLoss, dSellTakeProfit, "EA",iMagicNumber,0,Red);
  if (iOrderOpenStatus<0)
      {
      iErrorNumber=GetLastError();
      Print ("Order fehlgeschlagen!: ", iErrorNumber);
      return;
      }
}


  return(0);
  }
//+------------------------------------------------------------------+



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