Обсуждение статьи "Кроссплатформенный торговый советник: Пользовательские стопы, Безубыток и Трейлинг" - страница 2

 
Enrico Lambino:

Ваш первый код активирует безубыток, а не трейлингстоп. Если и будет дальнейшая модификация SL, то это будет takeprofit. Но если ваш TP равен 500 пунктам, то трейлинг вообще не активируется при 500 пунктах, так как в этот момент сделка уже покинула рынок.

Ваш второй код использует трейлингстоп, но не безубыток. Потому что еще до того, как будет применен безубыток, SL уже переместился выше цены безубытка.


Привет, Энрико,

Я не понял вашу мысль.

Это безубыток:

 //--- установление безубыточности
   CTrail *trail_be=new CTrail();
   //trail_be.Set(BELevel,BEOpenPriceDist,0); 
   trail_be.Set(230,250,0);   
   trails.Add(trail_be);

Это трейлинг:

//--- установка трейлинг-стопа
   CTrail *trail=new CTrail();
   //trail.Set(trail_value,trail_start,trail_step);
   trail.Set(400,500,10);
   trails.Add(trail);

Безубыток активируется при 250 пунктах, трейлинг активируется при 500 пунктах. Как видите, трейлинг активируется не раньше, чем безубыток.

SL не был перемещен выше (или ниже) цены безубытка. Стоп-лосс был тем же первоначальным SL ниже цены открытия. Трейлинг-стоп в первый раз переместил SL выше цены открытия (и безубытка).

Трейлинг работает отлично. Безубыток не работает(объект trail_be). Если я не использую трейлинг-стоп, безубыток работает нормально.

 

Проблема, похоже, существует только для ордеров на продажу.

double CTrailsBase::Check(const string symbol,const ENUM_ORDER_TYPE type,const double entry_price,const double price,const ENUM_TRAIL_TARGET mode)
  {
   if(!Active())
      return 0;   
   double val=0.0,ret=0.0;
   MqlDateTime time_curr;
   TimeCurrent(time_curr);
   if(time_curr.day==3 && time_curr.hour==11 && time_curr.min>=30)
      Print("");
   for(int i=0;i<Total();i++)
     {
      CTrail *trail=At(i);
      if(!CheckPointer(trail))
         continue;
      if(!trail.Active())
         continue;
      int trail_target=trail.TrailTarget();
      if(mode!=trail_target)
         continue;
      val=trail.Check(symbol,type,entry_price,price,mode);
      if((type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if(val>ret || ret==0.0)
            ret=val;
      }      
      else if((type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if(val<ret || ret==0.0)
            ret=val;
      }      
     }
   return ret;
  }

Проблема в этом месте

 else if((type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if(val<ret || ret==0.0)
            ret=val;
      }      

Думаю, это следует изменить на:

 else if((type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if( (val>0 && val<ret) || ret==0.0)
            ret=val;
      }      
 

Спасибо, что объяснили суть вопроса, и извините, что я неправильно понял вас. Что касается этого изменения:

else if((type==ORDER_TYPE_SELL && trail_target==TRAIL_TARGET_STOPLOSS) || (type==ORDER_TYPE_BUY && trail_target==TRAIL_TARGET_TAKEPROFIT))
      {
         if( (val>0 && val<ret) || ret==0.0)
            ret=val;
      }   

Обычно я просто помещаю безубыточный CTrail в качестве последнего индекса, чтобы он оценивался последним, но приведенный выше код является более постоянным решением для трейлинга стоплосса сделок на продажу.

 

Как привязать определенный стоп к определенному сигналу? В соответствии с логикой моей стратегии каждый сигнал входа имеет свой собственный стоп.

То же самое с сигналом выхода.

 

Здравствуйте, у меня проблема с экспертом, можете ли вы мне помочь?


'SetContainer' - unexpected token, probably type is missing?	SymbolManagerBase.mqh	55	21
'SetContainer' - function already defined and has different type	SymbolManagerBase.mqh	55	21
'Deinit' - unexpected token, probably type is missing?	SymbolManagerBase.mqh	62	21
'Deinit' - function already defined and has different type	SymbolManagerBase.mqh	62	21