Discussão do artigo "Expert Advisor Multiplataforma: Stops personalizados, Breakeven e Stop Móveis" - página 2

 
Enrico Lambino:

Seu primeiro código ativa o breakeven, não o trailingstop. Se houvesse qualquer modificação adicional do SL, seria o takeprofit. Mas se o seu TP for de 500 pontos, o trailing não seria ativado em 500 pontos, já que a negociação já saiu do mercado nesse ponto.

Seu segundo código usa o trailingtop, mas não o breakeven. Porque mesmo antes que o ponto de equilíbrio possa ser aplicado, o SL já se moveu acima do preço de equilíbrio.


Olá, Enrico,

Não entendi o que você quis dizer.

Isso é breakeven:

 //--- definindo o ponto de equilíbrio
   CTrail *trail_be=new CTrail();
   //trail_be.Set(BELevel,BEOpenPriceDist,0); 
   trail_be.Set(230,250,0);   
   trails.Add(trail_be);

Isso é trailing:

//--- definindo o trailing stop
   CTrail *trail=new CTrail();
   //trail.Set(trail_value,trail_start,trail_step);
   trail.Set(400,500,10);
   trails.Add(trail);

O ponto de equilíbrio é ativado em 250 pontos, o trailing é ativado em 500 pontos. Como você vê, o trailing não é ativado antes do breakeven.

O SL não foi movido acima (ou abaixo) do preço de equilíbrio. O stop loss foi o mesmo SL inicial abaixo do preço de abertura. O trailing stop moveu o SL pela primeira vez acima do preço de abertura (e do preço de equilíbrio).

O trailing funciona bem. O ponto de equilíbrio não funciona(objeto trail_be). Se eu não usar o trailing stop, o breakeven funciona bem.

 

O problema parece ser apenas para ordens de venda.

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;
  }

Problema neste local

 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;
      }      

Acho que deveria ser alterado para:

 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;
      }      
 

Obrigado por explicar melhor o problema e desculpe-me por ter entendido errado antes. Com relação a essa alteração:

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;
      }   

Normalmente, eu apenas coloco o ponto de equilíbrio do CTrail como o último índice para que ele seja avaliado por último, mas o código acima é uma solução mais permanente para o rastreamento do stoploss de negociações de venda.

 

Como faço para vincular um stop específico a um sinal específico? Devido à lógica da minha estratégia, cada sinal de entrada tem seu próprio stop.

O mesmo acontece com o sinal de saída.

 

Olá, estou com um problema com o especialista, você pode me ajudar?


'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