|
Startseite | Registrieren | Hilfe | Benutzerliste | Kalender | Suchen | Heutige Beiträge | Alle Foren als gelesen markieren |
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
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 ?
|
|
|||
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); } } } } 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 |
|
|||
Danke dir für den Code.
Und wie füge ich nun einen TrailingStop zu eben dieser Order hinzu ? |
|
||||
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
__________________
das "mql-leicht-gemacht.de.vu"-Programm ist fürs erste aus Zeitgründen erstmal "auf's Eis gelegt"... Sobald es wieder online ist, meld ich mich Mein REAL Konto mit WSFR und MegaDroid bei FxPro |
|
|||
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 |
|
|||
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); } } } } Aber das überlasse ich mal dir Gruß naranjoe |
|
|||
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);
}
}
}
|
|
|||
Zitat:
Häng doch mal deinen kompletten Code hier dran, dann lässt sich der Fehler ganz leicht herausfinden und erklären. Gruß naranjoe |
|
|||
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); } //+------------------------------------------------------------------+ |
Lesezeichen |
Stichworte |
breakeven, mql4, programmierung, sl, stoploss, trailingstop |
Themen-Optionen | Thema durchsuchen |
Ansicht | |
|
|