Especialistas: TrailingStopAndTake

 

TrailingStopAndTake:

Trailing simples de ordens stop-loss e take-profit de posições abertas.


Autor: Scriptor

 
//+------------------------------------------------------------------+
//| Retorna o StopLoss correto em relação ao 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)
     );
}
//+------------------------------------------------------------------+
//| Verifica se o StopLoss está correto em relação ao 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
     );
  }

Erros destacados.

 
fxsaber:

Os erros são destacados.

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

Qual é o erro?

 
Artyom Trishkin:

Qual é o erro?

É usado o preço errado.

 
fxsaber:

O preço está sendo usado incorretamente.

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

Ele funcionará quando StopLevel == 0.

 
Existe uma versão para o MT4?
 

Excelente trabalho! Muito obrigado!

 
Fácil de usar. Excelente. Excelente.
 

Hello there.


I am trying to use your EA, but it get out of with code 1. 

It´s brazilian IBOV market. covered contracts and real account

 
Os trailing stops não parecem se ajustar à medida que o preço se afasta. Há algo que eu esteja perdendo?