Перед тем как ставить стоп в без убыток проверяйте находится он уже в без убытке или нет.
Например для ордеров OP_BUY алгоритм такой если стоп больше цены открытия ордера значит тралим (он уже в без убытке), если стоп меньше цены открытия и текущая цена выше (условия перевода стопа в без убыток выполняются) то переводим стоп в без убыток.
Для ордеров на продажу аналогично. Только стоп если он не в без убытке выше цены открытия ордера, а если в без убытке то он ниже цены открытия.
Перед тем как ставить стоп в без убыток проверяйте находится он уже в без убытке или нет.
Например для ордеров OP_BUY алгоритм такой если стоп больше цены открытия ордера значит тралим (он уже в без убытке), если стоп меньше цены открытия и текущая цена выше (условия перевода стопа в без убыток выполняются) то переводим стоп в без убыток.
Для ордеров на продажу аналогично. Только стоп если он не в без убытке выше цены открытия ордера, а если в без убытке то он ниже цены открытия.
спасибо
помогло
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Коллеги, сейчас, когда у меня срабатывает трейлинг стоп, видно как стоп начинает прыгать от значения безубытка к трейлингу..как сделать так, что бы если сделка начала трейлиться, стоп безубытка на использовался?
init (){
if(D1_Breakout==true) TimeCandle = 1440;
TimeCandle = next_period(TimeCandle);
STOPLEVEL = MarketInfo(Symbol(),MODE_STOPLEVEL);
if (SL < STOPLEVEL) SL = STOPLEVEL;
if (TP < STOPLEVEL) TP = STOPLEVEL;
if (NoLoss < STOPLEVEL && NoLoss != 0) NoLoss = STOPLEVEL;
if (trailing < STOPLEVEL && trailing != 0) trailing = STOPLEVEL;
}
void TrailingStop(int trailing)
{
double StLo,OSL,OOP;
int tip;
bool error=true;
color col;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS))
{
tip = OrderType();
if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
{
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
if (tip==0)
{
StLo = NormalizeDouble(Bid - trailing*Point,Digits);
if (StLo < OOP) continue;
if (StLo > OSL)
error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);
}
if (tip==1)
{
StLo = NormalizeDouble(Ask + trailing*Point,Digits);
if (StLo > OOP) continue;
if (StLo < OSL || OSL==0 )
error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);
}
if (!error) Alert("Error TrailingStop ",GetLastError()," ",Symbol()," SL ",StLo);
}
}
}
}
//------------------------------------------------------------------+
void No_Loss(int NoLoss)
{
double StLo,OSL,OOP;
int tip;
bool error=true;
color col;
int STOPLEVEL = (MarketInfo(Symbol(),MODE_STOPLEVEL))*2;
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i, SELECT_BY_POS))
{
tip = OrderType();
if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==magic)
{
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
if (tip==0)
{
StLo = NormalizeDouble(OrderOpenPrice()+ NoLoss*Point,Digits);
if (Bid > OrderOpenPrice()+(NoLoss*Point)+ STOPLEVEL && !CompareDoubles(OrderStopLoss(),StLo))
error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);
}
if (tip==1)
{
StLo = NormalizeDouble(OrderOpenPrice() - NoLoss*Point,Digits);
if (Ask < OrderOpenPrice()-(Point*NoLoss)-STOPLEVEL && !CompareDoubles(OrderStopLoss(),StLo))
error=OrderModify(OrderTicket(),OrderOpenPrice(),StLo,OrderTakeProfit(),0,White);
}
if (!error) Alert("Error NoLoss ",GetLastError()," ",Symbol()," Bid ", Bid, " Order Type ", tip," OrderOpenPrice ", OrderOpenPrice(), " OrderStopLoss ", OrderStopLoss(), " NoLoss ",StLo);
}
}
}
}