TrailingStop Move

 

Boa tarde, estou desenvolvendo um EA e nele estou colocando a funçao de TrailingStop quando abre uma ordem.

Peguei um modelo nas comunidades e adequei ao meu EA, porém ele entra no  no for normal.O problema é que ele entra no primeiro If quando é compra  e vice versa

"if((NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-Point*(TrailingStop+TrailingStep),Digits))||(OrderStopLoss()==0))" e já modica a ordem e fecha antes mesmo de o Trailing stop começar a se mover.
void MoveTrailingStop()
{
   int cnt,total=OrdersTotal();
   int stop = OrderStopLoss();
   for(cnt=0;cnt<total;cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL&&OrderSymbol()==Symbol())
      {
         if(OrderType()==OP_BUY)
         {
            if(TrailingStop>0)  
            {                 
                    if((NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-Point*(TrailingStop+TrailingStep),Digits))||(OrderStopLoss()==0))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Green);
                  return(0);
               }
            }
         }
         else 
         {
            if(TrailingStop>0)  // &&
            {                 
                  if((NormalizeDouble(OrderStopLoss(),Digits)>(NormalizeDouble(Ask+Point*(TrailingStop+TrailingStep),Digits)))||(OrderStopLoss()==0))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Point*TrailingStop,Digits),OrderTakeProfit(),0,Red);
                  return(0);
               }
            }
         }
      }
   }
}
 
lorran.dba:

Boa tarde, estou desenvolvendo um EA e nele estou colocando a funçao de TrailingStop quando abre uma ordem.

Peguei um modelo nas comunidades e adequei ao meu EA, porém ele entra no  no for normal.O problema é que ele entra no primeiro If quando é compra  e vice versa

Olá lorran.dba,

Por favor, quando for postar trechos de código, por favor utilize o botão SRC !!!

 

Abraços,
Malacarne 

 
lorran.dba:

Boa tarde, estou desenvolvendo um EA e nele estou colocando a funçao de TrailingStop quando abre uma ordem.

Peguei um modelo nas comunidades e adequei ao meu EA, porém ele entra no  no for normal.O problema é que ele entra no primeiro If quando é compra  e vice versa

Olá lorran.dba,

O código que você postou é referente à linguagem MQL4...

Você está mesmo querendo desenvolver para MetaTrader 4 ???

Abraços,
Malacarne 

 
Malacarne:

Olá lorran.dba,

O código que você postou é referente à linguagem MQL4...

Você está mesmo querendo desenvolver para MetaTrader 4 ???

Abraços,
Malacarne

 

 Sim é MQL4.

 
Estou no inicio e estou aprendendo sim MQL, porém senti essa dificuldade e postei aqui no grupo.
 
lorran.dba:

Boa tarde, estou desenvolvendo um EA e nele estou colocando a funçao de TrailingStop quando abre uma ordem.

Peguei um modelo nas comunidades e adequei ao meu EA, porém ele entra no  no for normal.O problema é que ele entra no primeiro If quando é compra  e vice versa


Oi Lorran, eu não entendi bem qual o seu problema. 

O primeiro if apenas filtra o tipo da ordem/posição, pois o que interessa para o trailing são as duas primeiras das 6 enumerações possíveis, a OP_BUY e OP_SELL.

if(OrderType()<=OP_SELL&&OrderSymbol()==Symbol())


O segundo if verifica se você está em uma posição comprada, se sim, ele aplica a rotina de trailing para a posição comprada.

if(OrderType()==OP_BUY)


Se não foi satisfeito a condição para comprado, então ele vai para o else, que só pode ser uma posição vendida.

else

Eu posso estar enganado, mas pra mim o código está correto.


Abraço,

Romeu.

 

Obrigado por responder, 

 

Deixar eu tentar explicar,

 

Até essa parte esta ok. O Problema é que quando uma ordem é executada, não é movido o TrailingStop como é meu objetivo.Ele cai dentro do "for" entra no if e modifica a ordem com o trailing do momento e da return 0, o meu objetivo é que ele acompanhe a ordem até o fechamento dela.

 

 

Atte,

 

Lorran 

 
lorran.dba:

Obrigado por responder,

Deixar eu tentar explicar,

Até essa parte esta ok. O Problema é que quando uma ordem é executada, não é movido o TrailingStop como é meu objetivo.Ele cai dentro do "for" entra no if e modifica a ordem com o trailing do momento e da return 0, o meu objetivo é que ele acompanhe a ordem até o fechamento dela

Atte,

Lorran 

E você já experimentou debugar o teu código?

Abraços,
Malacarne 

 
Malacarne:

E você já experimentou debugar o teu código?

Abraços,
Malacarne 

 

Será que eu não poderia usar um while ao inves do for? 

 
lorran.dba:

 

Será que eu não poderia usar um while ao inves do for? 

Aparentemente não é uma questão de qual operador utilizar, e sim, qual valor está sendo atribuído para cada variável durante o seu loop.

Por isso a importância de debugar o seu código.

Abraços,
Malacarne 

 
Malacarne:

Aparentemente não é uma questão de qual operador utilizar, e sim, qual valor está sendo atribuído para cada variável durante o seu loop.

Por isso a importância de debugar o seu código.

Abraços,
Malacarne 

 

Me expressei mal e a galera não entendeu minha ideia, o que eu quero é que assim que ele execute uma ordem ele fique alterando o TrailingStop, assim que a ordem fique positiva, fiz um trecho do código e na primeira vez que ele entra no while funciona perfeitamente.O problema é que quando ele volta para o While novamente ele nao atualiza a variavel Bid aí fica num loop infinito.Gostaria de saber se tenho que fazer alguma coisa a mais pra ele fica alterando essa variavel conforme o preço.

 

while(Bid<OrderTakeProfit()||Bid>OrderStopLoss())
        { 
                   
           OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop*10,Digits),OrderTakeProfit(),0,Green);
                                  
        }
                                                
          OrderClose(cnt, OrderLots(), OrderClosePrice(), Slippage);
            return(0);
Razão: