Trailing Stop Help

 

Здравствуйте!

В мультивалютном советнике реализована система закрытия по TakeProfit и TrailingStop. ТP работает, а вот ТS нет :(

extern double TrailingStop = 30;
---------------------------------+

start()
{ 

total=SymbolOrdersTotal(lSymbol)

      bid   = MarketInfo(lSymbol,MODE_BID);
      ask   = MarketInfo(lSymbol,MODE_ASK);
      point = MarketInfo(lSymbol,MODE_POINT);
-------------------------------------------------------+
 for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // проверяем открытую позицию
         OrderSymbol()==Symbol())  // проверяет валюту
        {
         if(OrderType()==OP_BUY)   // позиция на покупку открыта
           {
            // проверка на Trailing Stop
            if(TrailingStop>0)  
              {                 
               if(bid-OrderOpenPrice()>point*TrailingStop)
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),bid-point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
              }
           }
         else // теперь сделки на продажу
           {
            // проверка на  Еrailing Stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-ask)>(point*TrailingStop))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),ask+point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
              }
           }
        }
     }
   return(0);
  }
Пожалуйста, помогите найти причину!
 
skyjet:

Здравствуйте!

В мультивалютном советнике реализована система закрытия по TakeProfit и TrailingStop. ТP работает, а вот ТS нет :(

Пожалуйста, помогите найти причину!

Почему вы смотрите Bid и Ask некоей валютной пары

lSymbol

, а в цикле исследуете ордера текущего символа:

if(... &&   // проверяем открытую позицию
         OrderSymbol()==Symbol())  // проверяет валюту

?

 
ilunga:

Почему вы смотрите Bid и Ask некоей валютной пары

, а в цикле исследуете ордера текущего символа:

?



extern double TrailingStop = 30;
---------------------------------+

start()
{ 

total=SymbolOrdersTotal(lSymbol)

      bid   = MarketInfo(lSymbol,MODE_BID);
      ask   = MarketInfo(lSymbol,MODE_ASK);
      point = MarketInfo(lSymbol,MODE_POINT);
-------------------------------------------------------+
 for(cnt=0;cnt<total;cnt++)
     {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
      if(OrderType()<=OP_SELL &&   // проверяем открытую позицию
         OrderSymbol()==lSymbol())  // проверяет валюту
        {
         if(OrderType()==OP_BUY)   // позиция на покупку открыта
           {
            // проверка на Trailing Stop
            if(TrailingStop>0)  
              {                 
               if(bid-OrderOpenPrice()>point*TrailingStop)
                  {
                     OrderModify(OrderTicket(),OrderOpenPrice(),bid-point*TrailingStop,OrderTakeProfit(),0,Green);
                     return(0);
                    }
              }
           }
         else // теперь сделки на продажу
           {
            // проверка на  Trailing Stop
            if(TrailingStop>0)  
              {                 
               if((OrderOpenPrice()-ask)>(point*TrailingStop))
                    {
                     OrderModify(OrderTicket(),OrderOpenPrice(),ask+point*TrailingStop,OrderTakeProfit(),0,Red);
                     return(0);
                    }
              }
           }
        }
     }
   return(0);
  }
А теперь правильно?
 
skyjet:


А теперь правильно?

как минимум надо убрать скобки у lSymbol

а во-вторых добавить еще одно условие проверки - чтобы не двигать SL туда-сюда, а только в одну сторону

 
ilunga:

как минимум надо убрать скобки у lSymbol

а во-вторых добавить еще одно условие проверки - чтобы не двигать SL туда-сюда, а только в одну сторону



1- уже изменил :)

2- затрудняюсь написать условие, как определить в зависимости от типа сделки - двигать SL вверх или вниз?

if( OrderType==OP_BUY)

   { 
 
skyjet:



1- уже изменил :)

2- затрудняюсь написать условие, как определить в зависимости от типа сделки - двигать SL вверх или вниз?

проверяйте OrderStopLoss() и сравнивайте с тем, что хотите ему присвоить.

Например для BUY-ордера ваша формула

bid-point*TrailingStop

соответственно это должно быть больше, чем текущий установленный OrderStopLoss()


Для SELL наоборот

 
ilunga:

проверяйте OrderStopLoss() и сравнивайте с тем, что хотите ему присвоить.

Например для BUY-ордера ваша формула

соответственно это должно быть больше, чем текущий установленный OrderStopLoss()


Для SELL наоборот



Огромное Вам спасибо, что удилили время и открыли мне глаза на немаловажные детали!
Причина обращения: