Asesores Expertos: TrailingStopAndTake

 

TrailingStopAndTake:

Trailing simple de las órdenes Stop Loss de las posiciones abiertas.

Autor: Scriptor

 
//+------------------------------------------------------------------+
//| Devuelve el StopLoss correcto relativo al StopLevel ||
//+------------------------------------------------------------------+
double CorrectStopLoss(const string symbol_name,const ENUM_POSITION_TYPE position_type,const int stop_loss) {
   if(stop_loss==0) return 0;
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   if(pt==0) return 0;
   double price=(position_type==POSITION_TYPE_BUY ? SymbolInfoDouble(symbol_name,SYMBOL_ASK) : SymbolInfoDouble(symbol_name,SYMBOL_BID));
   int lv=StopLevel(symbol_name),dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   return
     (position_type==POSITION_TYPE_BUY ?
      NormalizeDouble(::fmin(price-lv*pt,price-stop_loss*pt),dg) :
      NormalizeDouble(::fmax(price+lv*pt,price+stop_loss*pt),dg)
     );
}
//+------------------------------------------------------------------+
//| Comprueba si StopLoss es correcto con respecto a StopLevel ||
//+------------------------------------------------------------------+
bool CheckCorrectStopLoss(const string symbol_name,const ENUM_POSITION_TYPE position_type,const double stop_loss)
  {
   if(stop_loss==0) return true;
   double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
   if(pt==0) return false;
   double price=(position_type==POSITION_TYPE_BUY ? SymbolInfoDouble(symbol_name,SYMBOL_ASK) : SymbolInfoDouble(symbol_name,SYMBOL_BID));
   int lv=StopLevel(symbol_name),dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   return
     (
      position_type==POSITION_TYPE_BUY ? 
      NormalizeDouble(stop_loss-price- lv*pt,dg)<0 :
      NormalizeDouble(stop_loss-price+ lv*pt,dg)>0
     );
  }

Errores resaltados.

 
fxsaber:

Los errores aparecen resaltados.

   double price=(position_type==POSITION_TYPE_BUY ? SymbolInfoDouble(symbol_name,SYMBOL_ASK) : SymbolInfoDouble(symbol_name,SYMBOL_BID));
   int lv=StopLevel(symbol_name),dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
   return
     (position_type==POSITION_TYPE_BUY ?
      NormalizeDouble(::fmin(price-lv*pt,price-stop_loss*pt),dg) :
      NormalizeDouble(::fmax(price+lv*pt,price+stop_loss*pt),dg)
     );

¿Cuál es el error?

 
Artyom Trishkin:

¿Cuál es el error?

Se utiliza un precio incorrecto.

 
fxsaber:

El precio se utiliza incorrectamente.

Justifíquelo.
 
Artyom Trishkin:
Justificar.
OrderSend(_Symbol, OP_BUY, 1, Ask, 100, 0, Bid);

Funcionará cuando StopLevel == 0.

 
¿Existe una versión mt4?
 

¡Buen trabajo! ¡Muchas gracias!

 
Fácil de usar. De primera. Genial.
 

Hola que tal.


Estoy tratando de utilizar su EA, pero salir de con el código 1. Es el mercado brasileño IBOV.

Es brasileño IBOV mercado. contratos cubiertos y cuenta real.

 
Los trailing stops no parecen ajustarse a medida que el precio se aleja. ¿Hay algo que me estoy perdiendo?