|
Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Trailing Stop setzen
Hallo Leute,
bin am verzweifeln. Bekomme es nicht gebacken eine Trailing Stop in mein Programm zu integrieren.Meine Programmierkenntnisse sind sehr bescheiden. Wäre sehr dankbar, wenn jemand helfen könnte. Meine Startroutine sieht bisher so aus. Orders werden gesetzt, jedoch ohne Trailing Stops. Gruß Dieter int start() { Comment("Copyright © 2014 *** Robot_Dax ***"+"\n"+ "TimeStart " , TimeStart, "\n", "TimeEnd " , TimeEnd, "\n", "MaxPrice ", Max_Price, "\n", "MinPrice " , Min_Price, "\n", "Akt.Preis ", Ask, "\n"); if (MoneyManagement) { if (Risk<1 || Risk>100) { Comment("Invalid Risk Value."); return(0); } else { Lots=MathFloor((AccountFreeMargin()*AccountLeverag e()*Risk*Point*BrokerMultiplier*100)/(Ask*MarketInfo(Symbol(),MODE_LOTSIZE)*MarketInfo( Symbol(),MODE_MINLOT)))*MarketInfo(Symbol(),MODE_M INLOT); } } datetime Time_Start = StrToTime(StringConcatenate(Day(),".",Month(),".", Year()," ",TimeStart, ":00")); datetime Time_End = StrToTime(StringConcatenate(Day(),".",Month(),".", Year()," ",TimeEnd, ":00")); datetime Time_CloseOrder = StrToTime(StringConcatenate(Day(),".",Month(),".", Year()," ",TimeCloseOrder,":00")); if (Time_CloseOrder>Time_End) if (CurTime()>=Time_CloseOrder) CLOSEORDERS(); int tip; if (Orders>OrdersTotal()) tip=CloseOrder(); Orders=OrdersTotal(); if (ORDERS(0)==0 && tip==0 && (CurTime()<Time_CloseOrder || Time_CloseOrder<=Time_End) && TradeDay!=TimeDay(CurTime())) { int BarStart = iBarShift(NULL,0,Time_Start,false); int BarEnd = iBarShift(NULL,0,Time_End ,false); Max_Price=iHigh(NULL,0,iHighest(NULL,0,MODE_HIGH,B arStart-BarEnd,BarEnd)); Min_Price=iLow (NULL,0,iLowest (NULL,0,MODE_LOW, BarStart-BarEnd,BarEnd)); if (TimeCurrent()>Time_End && ObjectFind("bar0"+Time_End)==-1) { ObjectCreate("bar0"+Time_End, OBJ_RECTANGLE, 0, 0,0, 0,0); ObjectSet ("bar0"+Time_End, OBJPROP_STYLE, STYLE_SOLID); ObjectSet ("bar0"+Time_End, OBJPROP_COLOR, Blue); ObjectSet ("bar0"+Time_End, OBJPROP_BACK, true); ObjectSet ("bar0"+Time_End, OBJPROP_TIME1 ,Time_Start); ObjectSet ("bar0"+Time_End, OBJPROP_PRICE1,Max_Price); ObjectSet ("bar0"+Time_End, OBJPROP_TIME2 ,Time_End); ObjectSet ("bar0"+Time_End, OBJPROP_PRICE2,Min_Price); } if(Bid > Max_Price && order == 0) { OrderSend(Symbol(), OP_BUY, Lots, Ask,Slippage, Ask-SL,Ask+TP, "br", Magic, 0, Green); order=order+1; } if(Ask < Min_Price && order == 0) { OrderSend(Symbol(), OP_SELL, Lots, Bid,Slippage, Bid+SL,Bid-TP, "br", Magic, 0, Green); order=order+1; } return(0); } if (No_Loss) No_Loss(); if (tip==1 && TradeDay!=TimeDay(CurTime())) { Lots=Lots*K_martin; if (tipOrders==0) OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP ,NULL,Magic,Blue); if (tipOrders==1) OrderSend(Symbol(),OP_BUY ,Lots,Ask,Slippage,SL,TP,NULL,Magic,Blue); } return(0); } |
|
||||
Suche dir eine trailingstop-funktion (bspw. über google) und implementiere sie in dem EA.
|
|
|||
habe ich schon versucht. Leider ohne Erfolg. Bekomme einfach nicht die richtige Schleife integriert. Deshalb mein Programmausschnitt. Vielleicht kann mir jemand die Routine in das Programm kopieren.
Danke im voraus. Dieter |
|
||||
Wo ist sie denn die Routine? Die müsstest Du hier schon mit anhängen.
|
|
|||
habe diese Routine versucht einzubauen. Leider funktioniert der Trailing Stop nicht. Keine Ahnung wo der Fehler liegt.
double PointValue; for (int i = 0; i < OrdersTotal(); i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); PointValue = MarketInfo(OrderSymbol(), MODE_POINT); double TSTP = TrailingStop * PointValue; if (OrderType() == OP_BUY) { if ((Bid - OrderOpenPrice()) > TSTP) { if (OrderStopLoss() < (Bid - TSTP)) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSTP, OrderTakeProfit(), Red); }}} else if (OrderType() == OP_SELL) { if ((OrderOpenPrice() - Ask) > TrailingStop * PointValue) { if ((OrderStopLoss() > (Ask + TrailingStop * PointValue)) || (OrderStopLoss() == 0)) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSTP, OrderTakeProfit(), Red); }}}} |
|
|||
habe die Routine eingebaut. Ist aber irgendwo noch ein Fehler drin. Orders werden gesetzt, leider aber kein Trailing Stop ausgeführt.
Bitte um H I L F E ! ! for (int i = 0; i < OrdersTotal(); i++) OrderSend(Symbol(), OP_BUY, Lots, Ask,Slippage, Ask-SL,Ask+TP, "br", Magic, 0, Green); { OrderSelect(i, SELECT_BY_POS, MODE_TRADES); PointValue = MarketInfo(OrderSymbol(), MODE_POINT); double TSTP = TrailingStop * PointValue; if (OrderType() == OP_BUY) { if ((Bid - OrderOpenPrice()) > TSTP) { if (OrderStopLoss() < (Bid - TSTP)) { OrderModify(OrderTicket(), OrderOpenPrice(), Bid - TSTP, OrderTakeProfit(), Red); }}} OrderSend(Symbol(), OP_SELL, Lots, Bid,Slippage, Bid+SL,Bid-TP, "br", Magic, 0, Green); if (OrderType() == OP_SELL) { if ((OrderOpenPrice() - Ask) > TrailingStop * PointValue) { if ((OrderStopLoss() > (Ask + TrailingStop * PointValue)) || (OrderStopLoss() == 0)) { OrderModify(OrderTicket(), OrderOpenPrice(), Ask + TSTP, OrderTakeProfit(), Red); }}}} return(0); } if (No_Loss) No_Loss(); if (tip==1 && TradeDay!=TimeDay(CurTime())) { Lots=Lots*K_martin; if (tipOrders==0) OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP ,NULL,Magic,Blue); if (tipOrders==1) OrderSend(Symbol(),OP_BUY ,Lots,Ask,Slippage,SL,TP,NULL,Magic,Blue); } return(0); |
|
|||
Nicht in die OrderSend-Funktion einbauen, sondern den Code des Trailings in eine separate Funktion packen, z.B. Trailing() und diese mit jedem ankommenden Tick auch separat anspringen.
Desweiteren muß berücksichtigt werden, ob Du einen 5-Digit-Broker hast, dann müßte die Variable TrailingStop mit 10 multipliziert werden. Also über if (Digit == 3 || Digit == 5) Multiplier = 10; traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
|
|||
vielen Dank für den Tipp, wede es gleich mal testen.
Gruß Dieter |
|
|||
habe die Routine in eine separate Trailing() Funktion gelegt. Was meinst du mit " bei jedem Tick anspringen "
Dieter |
|
|||
int start() {
..... Trailing(); ..... } Bei Dir lag der Trailingcode innerhalb der OrderSend-Funktion und die wird eigentlich nur angesprungen, wenn eine Order geöffnet werden soll. Die Trailing-Funktion muß aber zu jeder Zeit die offenen Orders managen. traderdoc
__________________
Ich erfülle Euch gern Eure EA-, Indikator- und Script-Programmierungswünsche auf Honorarbasis. |
Lesezeichen |
Stichworte |
mql4, programmierung, programmierung metatrader, trailing stop, trailingstop |
|
|