so könnte man es machen:
Erstmal die ordersend-routine ändern sodaß sl/tp erst nach der erfolgreichen Orderaufgabe gesetzt werden. Weiter sollte man die pips/point-Anpassung nicht vergessen.
im header (bei den externen inputs):
extern int Slippage=3;
int slippagepips;
im init(): slippagepips=Slippage;
hier für BUY:
Code:
BrokerDigitAdjust(Symbol());
double sl = Ask-SLpips*pips2dbl;
double tp = Ask+TPpips*pips2dbl;
bool result=OrderSend2Stage(symb,OP_BUY,lt,ask,Slippage,sl,tp,com,magic,0,Lime);
Code:
bool OrderSend2Stage(string symbol,int type,double lots,double price,int slippage,double sl,double tp,string ocomment,int magic,datetime expiry,color col) {
bool result=true;
int ticket;
RefreshRates();
while (IsTradeContextBusy()) Sleep(100);
ticket=OrderSend(symbol,type,lots,price,slippage,0,0,ocomment,magic,expiry,col);
while (IsTradeContextBusy()) Sleep(100);
if (!OrderSelect(ticket, SELECT_BY_TICKET)) return(false);
if (sl!=0.00000 && tp!=0.00000) result = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizePrice(OrderSymbol(),sl),NormalizePrice(OrderSymbol(),tp),OrderExpiration(),CLR_NONE);
if (sl!=0.00000 && tp==0.00000) result = OrderModify(OrderTicket(),OrderOpenPrice(),NormalizePrice(OrderSymbol(),sl),OrderTakeProfit(),OrderExpiration(),CLR_NONE);
if (sl==0.00000 && tp!=0.00000) result = OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),NormalizePrice(OrderSymbol(),tp),OrderExpiration(),CLR_NONE);
return(result);
}
void BrokerDigitAdjust(string symbol) {
int Multiplier = 1;
int digits=MarketInfo(symbol,MODE_DIGITS);
if (digits==3 || digits==5) Multiplier = 10;
if (digits==6) Multiplier = 100;
if (digits==7) Multiplier = 1000;
pips2dbl = Multiplier*MarketInfo(symbol,MODE_POINT);
Slippage=slippagepips*Multiplier;
}
it build 509 syntax, mögliich daß für die neuesten versionen etwas geändert werden muß. Man könnte sich jetzt auch eine Funktion schreiben welche den sl und tp zurückgibt, bspw. sl = GetSL(Symbol(),Ask,OP_BUY); usw.