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)
-   -   Trailing Stop setzen (http://www.expert-advisor.com/forum/showthread.php?t=3823)

dieter23 24.08.14 08:57

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

fxdaytrader 24.08.14 09:04

Suche dir eine trailingstop-funktion (bspw. über google) und implementiere sie in dem EA.

dieter23 24.08.14 09:25

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

fxdaytrader 24.08.14 09:31

Zitat:

Zitat von dieter23 (Beitrag 27251)
habe ich schon versucht. Leider ohne Erfolg. (...) Vielleicht kann mir jemand die Routine in das Programm kopieren.

Wo ist sie denn die Routine? Die müsstest Du hier schon mit anhängen.

dieter23 24.08.14 09:40

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

dieter23 24.08.14 10:17

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

traderdoc 24.08.14 11:01

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

dieter23 24.08.14 11:06

vielen Dank für den Tipp, wede es gleich mal testen.
Gruß Dieter

dieter23 24.08.14 11:51

habe die Routine in eine separate Trailing() Funktion gelegt. Was meinst du mit " bei jedem Tick anspringen "

Dieter

traderdoc 24.08.14 14:40

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


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