Не работает трейлинг-стоп. Т.е. вверх работает, а вниз нет.

 

Вот алгоритм трейлинг-стопа открытой позиции:

if (OrderType()==OP_SELL)
{
if (TrailingStop>0)
{
if (OrderOpenPrice()-Ask<=(TrailingStop+Pips)*Point)
{
if (OrderStopLoss()>(Ask+Point*TrailingStop))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderClosePrice()-TakeProfit*Point-TrailingStop*Point,800);
return(0);
}
}
}
}

if (OrderType()==OP_BUY)
{
if (TrailingStop>0)
{
if (Bid-OrderOpenPrice()>=(TrailingStop+Pips)*Point)
{
if (OrderStopLoss()<(Bid-Point*TrailingStop))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderClosePrice()+TakeProfit*Point+TrailingStop*Point,800);
return(0);
}
}
}
}

Так вот, вверх трейлится (если бай), а вниз нет (если селл)...

Ошибок вроде тоже не выдаёт...

 

Попробуйте вставить в эксперт вот этот. Проверен временем и реалом!

//---- input parameters---------
extern int       Magic=8976; 

extern bool      UseTrailing = true;//Выключатель трейлинг стопа
extern string   _____= "Параметры трала Длинных позиций";
extern int    lMinProfit = 35;//порог включения трейлин стопа
extern int    lTrailingStop = 35;// величина трейлинг стопа
extern int    lTrailingStep = 5; // шаг трейлинг стопа

extern string   ____= "Параметры трала Коротких позиций";
extern int    sMinProfit = 35;//порог включения трейлин стопа
extern int    sTrailingStop = 35;// величина трейлинг стопа
extern int    sTrailingStep = 5;// шаг трейлинг стопа
//----------------------------------------------------------------


int start()
  {
if (UseTrailing) TrailPositions(); // задаем работу(выключатель) трейлинг стопа

.... ... .... ....
    
//ВНЕ ФУНКЦИИ int start() располагаем :

//-------------------------------------------------------------------------------+
void TrailPositions() // трейлинг стоп
{ int Orders = OrdersTotal();
  for (int i=0; i<Orders; i++) {
    if (!(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))) continue;
    if (OrderSymbol() != Symbol()) continue;  
     if (OrderType() == OP_BUY && OrderMagicNumber()==Magic)  {
      if (Bid-OrderOpenPrice() > lMinProfit*Point)                   {
        if (OrderStopLoss() < Bid-(lTrailingStop+lTrailingStep-1)*Point) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Bid-lTrailingStop*Point,
                                                    OrderTakeProfit(), 0, Blue);
      }}}
    if (OrderType() == OP_SELL && OrderMagicNumber()==Magic)  {
      if (OrderOpenPrice()-Ask > sMinProfit*Point)                    {
        if (OrderStopLoss() > Ask+(sTrailingStop+sTrailingStep-1)*Point ||
                                                         OrderStopLoss() == 0) {
          OrderModify(OrderTicket(), OrderOpenPrice(), Ask+sTrailingStop*Point,
                                                      OrderTakeProfit(), 0, Blue);
        }}}}}
//-----------------------------------------------------------------------
 
Swetten писал (а) >>

Вот алгоритм трейлинг-стопа открытой позиции:

if (OrderType()==OP_SELL)
{
if (TrailingStop>0)
{
if (OrderOpenPrice()-Ask>(TrailingStop+Pips)*Point)
{
if (OrderStopLoss()>(Ask+Point*TrailingStop))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderClosePrice()-TakeProfit*Point-TrailingStop*Point,800);
return(0);
}
}
}
}

if (OrderType()==OP_BUY)
{
if (TrailingStop>0)
{
if (Bid-OrderOpenPrice()>(TrailingStop+Pips)*Point)
{
if (OrderStopLoss()<(Bid-Point*TrailingStop))
{
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderClosePrice()+TakeProfit*Point+TrailingStop*Point,800);
return(0);
}
}
}
}

Так вот, вверх трейлится (если бай), а вниз нет (если селл)...

Ошибок вроде тоже не выдаёт...

Вот так по идее должно быть

 
StatBars писал (а) >>

Вот так по идее должно быть

Чего-то всё равно нихт арбайт...

Второй код похожий и поинтересней. Попробую его...

 
У открытого ордера нет еще OrderClosePrice().
 
Roger писал (а) >>
У открытого ордера нет еще OrderClosePrice().

Да ладно! Куда делась-то? Есть. Просто равна нулю иногда... или должна быть равна нулю... кароче что-то типа того...

 
Ну, вот в ордере на продажу она и дает ошибочку. Хотя должна в покупке :-)
 
Roger писал (а) >>
Ну, вот в ордере на продажу она и дает ошибочку. Хотя должна в покупке :-)

А поподробней можно? :)

А то я всё просмотрела -- у меня код ведь точно такой же, что на бай, что на селл, только наоборот?

И вроде ничего там не пропущено?

 
У меня тоже такое было, не модифицировался sell, проблема была в том, что у открытого ордера sell небыло стоплосса, тоесть сл=0, и условие трейлинга не выполнялось.
 
disist писал (а) >>
У меня тоже такое было, не модифицировался sell, проблема была в том, что у открытого ордера sell небыло стоплосса, тоесть сл=0, и условие трейлинга не выполнялось.

Да, действительно. Поменяла -- только хуже стало. :)))

 
Swetten писал (а) >>

Да, действительно. Поменяла -- только хуже стало. :)))

Значит не судьба ;)))))))

Причина обращения: