O Trailingstop EA não funciona

 

Olá a todos. Não consigo fazer com que meu EA funcione corretamente. Estou executando-o em 10 pares/cartas diferentes simultaneamente. Parece haver dois problemas:

1. não aciona o Trailingstop na maioria das vezes, mas às vezes funciona. Acho que o problema está na minha OrderSelect, mas não consigo resolvê-lo.

2. às vezes me dá o erro 130, mas não consigo ver como meu SL/TP pode ser inválido. Todos os valores que estou imprimindo estão acima do rolo para todos os pares. E mesmo que eu receba o erro 130, às vezes ele de fato modifica a ordem como se nada estivesse errado.

Aqui está todo o EA. Você poderia, por favor, dar uma olhada e me informar qual pode ser o problema?

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=11;
extern string Label_TrailingStop="Pips trailing behind";
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop-1;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop+1)+" Pips");
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+1;
   
   Print("stoplevel = ",stoplevel);
   Print("TrailingStart = ",TrailingStart);
   Print("TrailingStop = ",TrailingStop);
   Print("TS = ",TS);
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS)){
         if(OrderSymbol()!=Symbol()) continue;{
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if(Bid-OrderOpenPrice()>TrailingStart*Pip){
                     if(OrderStopLoss()<Bid-TrailingStop*Pip){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-TrailingStop*Pip,OrderTakeProfit(),Blue))
                        Print("Buy = ",GetLastError());
                        Print("Bid = ",Bid);
                        Print("Bid-TrailingStop*Pip = ",Bid-TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if(OrderOpenPrice()-Ask>TrailingStart*Pip){
                     if(OrderStopLoss()>Ask+TrailingStop*Pip){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+TrailingStop*Pip,OrderTakeProfit(),Red))
                        Print("Sell = ",GetLastError());
                        Print("Ask = ",Ask);
                        Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        }
                    }
                }  
            }
         }
      }   
  return(0);
}
//+------------------------------------------------------------------+
 
  1. Você tem vários blocos de código desalinhados devido a parênteses que estão faltando. Embora equilibrados, eles estão faltando, como no início do "para" e alguns dos blocos do "se".
  2. A linha"if(OrderSymbol()!=Symbol()) continua;{" é muito suspeita e torna difícil ver como o fluxo do código deve ser. Basta fazer"if(OrderSymbol()==_Symbol()) {". Ao invés de"Symbol()", você também pode usar"_Symbol()".
  3. Use"OrderClosePrice()" e não"Ask" ou"Bid".
  4. Adicione parênteses ao fazer comparações para facilitar a leitura, assim como garantir a ordem das coisas. Por exemplo, em vez de"if(Bid-OrderOpenPrice()>TrailingStart*Pip)" use"if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip )".
  5. Tente fundir os blocos de código Comprar e Vender em um único bloco de código que lide com ambos. Isso tornará menos código para depuração e mais fácil de ler e modificar no futuro.

PS! NB! Também faça uso de um Número Mágico para as Ordens!

PS! Lembre-se também de levar em conta o escorregamento que pode causar os 130 erros. Um mínimo de StopLevel por si só não é suficiente. Torne-o ligeiramente maior para contabilizar um possível deslizamento, como a adição de um fator do spread atual. Também pode haver um FreezeLevel no lugar pelo Corretor!

 
FMIC:
  1. Você tem vários blocos de código desalinhados devido a parênteses que estão faltando. Embora equilibrados, eles estão faltando, como no início do "para" e alguns dos blocos de "se".
  2. A linha"if(OrderSymbol()!=Symbol()) continua;{" é muito suspeita e torna difícil ver como o fluxo do código deve ser.
    Basta fazer"if(OrderSymbol()==_Symbol()) {". Ao invés de"Symbol()", você também pode usar"_Symbol()".
  3. Use"OrderClosePrice()" e não"Ask" ou"Bid".
  4. Adicione parênteses ao fazer comparações para facilitar a leitura, bem como garantir a ordem das coisas:
    Por exemplo, ao invés de"if(Bid-OrderOpenPrice()>TrailingStart*Pip)" use"if( ( OrderClosePrice()- OrderOpenPrice() ) > ( TrailingStart * Pip )".
  5. Tente fundir os blocos de código Comprar e Vender em um único bloco de código que lide com ambos. Isso tornará menos código para depuração e mais fácil de ler e modificar no futuro.

PS! NB! Também faça uso de um Número Mágico para as Encomendas!

PS! Lembre-se também de levar em conta o escorregamento que pode causar os 130 erros. Um mínimo de StopLevel por si só não é suficiente. Torne-o ligeiramente maior para contabilizar um possível deslizamento, como a adição de um fator do spread atual. Também pode haver um FreezeLevel no lugar pelo Corretor!

Muito obrigado por sua resposta e por tentar me ajudar. Tenho algumas perguntas/comentários:

1. no número 1 você sugeriu que eu acrescentasse parênteses (), o que fiz conforme sua sugestão no número 4. mas não vejo como posso acrescentar parênteses () no início do "para". Você poderia explicar isto ou quis dizer parênteses encaracolados {}?

2. eu mudei para _Symbol, mas para melhorar meu conhecimento eu estava me perguntando se você pode explicar qual é o benefício/vantagem de usar _Symbol sobre Symbol()?

3. mudei todos os Pedidos e Licitações para OrderClosePrice(), entretanto, você poderia explicar qual é o benefício/vantagem disto?

4. eu fiz isto

5. tentarei ver como posso simplificar mais isto.

6. como entro em meus negócios manualmente, é meu entendimento que não posso usar MagicNumbers. Isto não é verdade?

7. não vejo como ou onde posso contabilizar o deslizamento. Por favor, me diga onde ou como adicionar isto. Para OrderModify, só permite os seguintes parâmetros:

bool  OrderModify(
   int        ticket,      // ticket
   double     price,       // price
   double     stoploss,    // stop loss
   double     takeprofit,  // take profit
   datetime   expiration,  // expiration
   color      arrow_color  // color
   );

8. em meu código já acrescentei 1 pip (10 pontos) ao mínimo de barulho, o que deve levar em conta a dispersão na maioria dos casos.

9. imprimi o Freezelevel para todos os pares e todos eles são 0,0, portanto, não parece ser um problema.

10. embora eu ainda esteja recebendo o erro 130 e o erro um, quando o EA funciona, ele ainda modifica e fecha a ordem. Portanto, de acordo com estes resultados, estou recebendo o erro, pois a ordem está sendo modificada ao mesmo tempo. Como se fosse um problema de partime:

2016.04.15 13:11:06.183 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28598 tp: 0.00000 ok

2016.04.15 13:11:05.860 Trailing_v18 USDCAD,M15: Compra = 130

2016.04.15 13:10:58.939 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28597 tp: 0.00000 ok

2016.04.15 13:10:57.835 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28596 tp: 0.00000 ok

2016.04.15 13:10:56.974 Trailing_v18 USDCAD,M15: Compra = 130

2016.04.15 13:10:56.531 Trailing_v18 USDCAD,M15: Compra = 130

2016.04.15 13:10:56.263 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28590 tp: 0.00000 ok

2016.04.15 13:10:54.318 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28582 tp: 0.00000 ok

2016.04.15 13:10:53.175 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28581 tp: 0.00000 ok

2016.04.15 13:10:52.879 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28577 tp: 0.00000 ok

2016.04.15 13:10:51.810 Trailing_v18 USDCAD,M15: Compra = 130

2016.04.15 13:10:51.085 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28575 tp: 0.00000 ok

2016.04.15 13:10:50.744 Trailing_v18 USDCAD,M15: Compra = 130

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: Compra = 1

2016.04.15 13:10:50.020 Trailing_v18 USDCAD,M15: modificar #50202284 comprar 0.01 USDCAD a 1.28477 sl: 1.28571 tp: 0.00000 ok

Aqui está outro exemplo de onde o Trailingstop está claramente acima do rochedo (em 10 pips/100 pontos) e ainda assim produz erro 130:

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: Erro de compra = 130

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TS = 20

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStop = 5

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: TrailingStart = 25

2016.04.15 14:15:03.432 Trailing_v18 EURAUD,M15: stoplevel = 10.0



 

Forneça o código mais recente com as atualizações que você fez. Caso contrário, não posso comentar as alterações recentes feitas por você para ver se elas estão corretas.

  1. Desculpe, eu quis dizer parênteses encaracolados. Você tem que consertar isso, caso contrário, ele continuará a falhar. Este é o mais importante de todos os pontos.
  2. a) Este ponto não é principalmente sobre o "_Símbolo", mas sobre o "!=" e o "continuar".
    b) "_Symbol" é executado mais rapidamente porque é uma variável, enquanto "Symbol()" seria executado como uma chamada de função que é mais lenta.
  3. OrderClosePrice() é o preço de fechamento atual do pedido. Se ainda estiver aberto, ele informará automaticamente o Bid ou Ask, dependendo do tipo de pedido. Por favor, leia os documentos para esta função.
  4. OK! Vamos ver as mudanças de código que você fez.
  5. OK! Vamos ver as alterações de código que você fez.
  6. Sim, para as trocas manuais, o número mágico é 0. Entretanto, em seu código, defina o número mágico como "externo" ou "input", atribuindo-lhe um "0" como padrão, e então use essa variável em seu código. Dessa forma, você pode facilmente usar o EA para outras situações ou reutilizar seu código para outros EAs.
  7. Eu expliquei como contabilizar o escorregamento. Certifique-se de que o "TrailStop > ( StopLevel + ( CurrentSpread * Factor )" onde o Factor é pelo menos "1.0" (idealmente "1.5" ou "2.0"; maior se você vir que ainda sofre um erro 130 devido a um escorregamento excessivo).
  8. Não há garantia de que 10 pontos seriam responsáveis pelo spread, pois o spread é diferente dependendo do Símbolo e está sempre mudando, especialmente durante eventos noticiosos e quando a liquidez é baixa, como durante as horas de folga.
  9. OK! Se o "FreezeLevel" não for usado, tudo bem, mas sugiro que você ainda o use em seu código, para que, caso você o use com um corretor diferente (que possa tê-lo), o EA ainda funcione.
  10. Fornecer novo código com mudanças para que ele possa ser analisado.
 
FMIC:

Forneça o código mais recente com as atualizações que você fez. Caso contrário, não posso comentar as alterações recentes feitas por você para ver se elas estão corretas.

  1. Desculpe, eu quis dizer parênteses curvos. Você tem que consertar isso, caso contrário, continuará a falhar. Este é o mais importante de todos os pontos.
  2. a) Este ponto não é principalmente sobre o "_Símbolo", mas sobre o "!=" e o "continuar".
    b) "_Symbol" é executado mais rapidamente porque é uma variável, enquanto "Symbol()" seria executado como uma chamada de função que é mais lenta.
  3. OrderClosePrice() é o preço de fechamento atual do pedido. Se ainda estiver aberto, ele informará automaticamente o Bid ou Ask, dependendo do tipo de pedido. Por favor, leia os documentos para esta função.
  4. OK! Vamos ver as mudanças de código que você fez.
  5. OK! Vamos ver as alterações de código que você fez.
  6. Sim, para as trocas manuais, o número mágico é 0. Entretanto, em seu código defina o número mágico como um "externo" ou "input", atribuindo-lhe um "0" como padrão, e então use essa variável em seu código. Dessa forma, você pode facilmente usar o EA para outras situações ou reutilizar seu código para outros EAs.
  7. Eu expliquei como contabilizar o escorregamento. Certifique-se de que o "TrailStop > ( StopLevel + ( CurrentSpread * Factor )" onde o Factor é pelo menos "1.0" (idealmente "1.5" ou "2.0"; maior se você vir que ainda sofre um erro 130 devido a um escorregamento excessivo).
  8. Não há garantia de que 10 pontos seriam responsáveis pelo spread, pois o spread é diferente dependendo do Símbolo e está sempre mudando, especialmente durante eventos noticiosos e quando a liquidez é baixa, como durante as horas de folga.
  9. OK! Se o "FreezeLevel" não for usado, tudo bem, mas sugiro que você ainda o use em seu código, para que, caso você o use com um corretor diferente (que possa tê-lo), o EA ainda funcione.
  10. Fornecer novo código com mudanças para que ele possa ser analisado.


Muito obrigado. Vou analisar todos os conselhos e sugestões acima. Enquanto isso, aqui está o código mais recente. Também, acho que encontrei um erro nesta linha:

#property strict;
extern string Label_TrailingStart="Pip threshold to activate TrailingStop";
extern int TrailingStart=12;
extern int TrailingStop=5;
double stoplevel=(MarketInfo(Symbol(),MODE_STOPLEVEL))/10;
int TS=TrailingStart-TrailingStop;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init(){
   if(TS<stoplevel){
      MessageBox("Please note: Your inputs for TrailingStart and/or TrailingStop cannot"+
                 "\nbe less than the minimum levels required by your broker and the"+
                 "\nTrailingStart has been increased automatically to "+StringConcatenate(stoplevel+TrailingStop+2)+" Pips");
     } 
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit(){
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start(){
   double Pip=Point*10;
   int ticket=0;
   if(TS<stoplevel) TrailingStart=(int)stoplevel+TrailingStop+2;
   
   /*Print("stoplevel = ",stoplevel);
   Print("TrailingStart = ",TrailingStart);
   Print("TrailingStop = ",TrailingStop);
   Print("TS = ",TS);
   Print("Buy error = ",GetLastError());
                        Print("OrderOpenPrice = ",OrderOpenPrice());
                        Print("OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip = ",
                        OrderClosePrice()-OrderOpenPrice()>TrailingStart*Pip);
                        Print("OrderClosePrice-TrailingStop*Pip = ",OrderClosePrice()-TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);
                        Print("TrailingStop*Pip = ",TrailingStop*Pip);
                        Print("OrderClosePrice = ",OrderClosePrice());
                        Print("OrderStopLoss = ",OrderStopLoss());
                        Print("OrderSymbol = ",OrderSymbol());
                        Print("OrdersTotal = ",OrdersTotal());
                        Print("OrderSelect = ",OrderSelect(OrderTicket(),SELECT_BY_TICKET));
                        Print("ticket = ",ticket);
                        Print("OrderTicket = ",OrderTicket());
                        Print("Selectbyticket = ",SELECT_BY_TICKET);
                        Print("Selectbypos = ",SELECT_BY_POS);
                        Print("Ask = ",Ask);
                        Print("OrderModify = ",OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),
                        OrderTakeProfit(),Blue));*/
   
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS)){
      ticket++;
         if(OrderSymbol()==_Symbol){
            if(OrderType()==OP_BUY){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderClosePrice()-OrderOpenPrice())>(TrailingStart*Pip)){
                     if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()-(TrailingStop*Pip),OrderTakeProfit(),Blue))
                        Print("Buy error = ",GetLastError());
                        }     
                    }  
                }     
            }  
            if(OrderType()==OP_SELL){
               if(OrderSelect(OrderTicket(),SELECT_BY_TICKET)){
                  if((OrderOpenPrice()-OrderClosePrice())>(TrailingStart*Pip)){
                     if(TrailingStop>OrderClosePrice()+(TrailingStop*Pip)){
                        RefreshRates();
                        if(!OrderModify(OrderTicket(),OrderOpenPrice(),OrderClosePrice()+(TrailingStop*Pip),OrderTakeProfit(),Red))
                        Print("Sell error = ",GetLastError());
                        /*Print("Ask = ",Ask);
                        Print("Ask+TrailingStop*Pip = ",Ask+TrailingStop*Pip);
                        Print("TrailingStart*Pip = ",TrailingStart*Pip);*/
                        }
                    }
                }  
            }
         }
      }   
  return(0);
}
//+------------------------------------------------------------------+

Uma mudança bastante grande que fiz foi mudar a primeira linha abaixo para a segunda, porque acho que deve haver um valor maior que zero para o stoploss. Isso é verdade?

 if(OrderStopLoss()<OrderClosePrice()-(TrailingStop*Pip)){
if(TrailingStop<OrderClosePrice()-(TrailingStop*Pip)){
 

O seguinte exemplo de código serve como uma possível solução/alternativa ao seu código. Observe, entretanto, que o código não foi testado ou depurado (apenas compilado), portanto, use-o apenas como "pseudo" código:

#property strict

extern double
   dblTrailStartPips = 11.0,  // Trailing Start (Pips)
   dblTrailStopPips  = 5.0,   // Trailing Stop (Pips)
   dblPipMultiplier  = 10.0,  // Pips to Points Multiplier
   dblSpreadFactor   = 2.0;   // Spread Factor for Slippage Compensation
   
extern int
   intMagicNumber    = 0;     // Magic Number (0 for Manual Orders)
   
double
   dblTickSizeDelta,          // Size of a Tick (Delta)
   dblStopLevelDelta,         // Market Stop Level (Delta)
   dblTrailStartDelta,        // Trailing Start (Delta)
   dblTrailStopDelta;         // Trailing Stop (Delta)

// Initialisation
int OnInit()
{
   dblTickSizeDelta   = MarketInfo( _Symbol, MODE_TICKSIZE );
   dblStopLevelDelta  = MarketInfo( _Symbol, MODE_STOPLEVEL ) * _Point;
   dblTrailStartDelta = dblTrailStartPips * dblPipMultiplier  * _Point;
   dblTrailStopDelta  = dblTrailStopPips  * dblPipMultiplier  * _Point;
   
   return( INIT_SUCCEEDED );
}

// Process Tick Event
void OnTick()
{
   double
      dblSpreadDelta  = Ask - Bid,
      dblMinStopDelta = dblStopLevelDelta + ( dblSpreadDelta * dblSpreadFactor ),
      dblTrailDelta   = ( dblTrailStopDelta > dblMinStopDelta ) ? dblTrailStopDelta : dblMinStopDelta;
   
   for( int i = OrdersTotal() - 1; i >= 0; i-- )
   {
      if( OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) )
      {
         if( ( OrderSymbol() == _Symbol ) && ( OrderMagicNumber() == intMagicNumber ) )
         {
            int intDirection = 0;
            switch( OrderType() )
            {
               case OP_BUY:  intDirection = +1; break;
               case OP_SELL: intDirection = -1; break;
               default:                         continue;
            }
            
            double
               dblOpenPrice  = OrderOpenPrice(),
               dblCloseDelta = ( OrderClosePrice() - dblOpenPrice ) * intDirection;
               
            if( dblCloseDelta > dblTrailStartDelta )
            {
               double
                  dblStopLossPrice = OrderStopLoss(),
                  dblStopLossDelta = ( dblStopLossPrice  - dblOpenPrice ) * intDirection,
                  dblTrailingDelta = dblCloseDelta - dblTrailDelta;
               
               if( ( dblTrailingDelta > dblStopLossDelta ) || ( dblStopLossPrice == 0 ) )
               {
                  double dblStopLoss = round( ( dblOpenPrice + ( dblTrailingDelta * intDirection ) ) / dblTickSizeDelta ) * dblTickSizeDelta;
                  if( dblStopLoss != dblStopLossPrice )
                  {
                     if( !OrderModify( OrderTicket(), dblOpenPrice, dblStopLoss, OrderTakeProfit(), OrderExpiration() ) )
                     {
                        Print( "Order Modification Failed with Error: ", GetLastError() );
                     }
                  }
               }
            }
         }
      }
   }
}
 

Experimente este Trader3000

Compare este código com o que você já tem... é muito parecido e eu o uso há anos e funciona como uma bomba...

//+------------------------------+
//| TRAILING STOP Function       |
//+------------------------------+
void Trailing_Stop_Function()
{
bool Ticket_TS_Long;
   for(int iTS_Long = OrdersTotal() - 1; iTS_Long >= 0 ; iTS_Long --)  
   {
      
      if(OrderSelect(iTS_Long,SELECT_BY_POS,MODE_TRADES) == true
      && OrderSymbol() == Symbol()
      && OrderType() == OP_BUY
      && OrderMagicNumber() == MagicNumberLong
      && Trailing_Stop_In_Pips > 0
      && Bid - OrderOpenPrice() > Trail_After_Pips_Profit*PipMultiplier
      && OrderStopLoss() < Bid - (Trailing_Stop_In_Pips*PipMultiplier))
      {
      Ticket_TS_Long = (OrderModify(OrderTicket(),OrderOpenPrice(),Bid - (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green));
         if (Ticket_TS_Long != true)
         {
         Print("TS-Order Modify Error ",GetLastError());
         }
      }
    } 
bool Ticket_TS_Short;
   for(int iTS_Short = OrdersTotal() - 1; iTS_Short >= 0 ; iTS_Short --)  
   {
      
   if(OrderSelect(iTS_Short,SELECT_BY_POS,MODE_TRADES) == true
      && OrderSymbol() == Symbol()
      && OrderType() == OP_SELL
      && OrderMagicNumber() == MagicNumberShort
      && Trailing_Stop_In_Pips > 0
      && OrderOpenPrice() - Ask > Trail_After_Pips_Profit*PipMultiplier
      && OrderStopLoss() > Ask + (Trailing_Stop_In_Pips*PipMultiplier))
      {
      Ticket_TS_Short = (OrderModify(OrderTicket(),OrderOpenPrice(),Ask + (Trailing_Stop_In_Pips*PipMultiplier),NULL,0,Green));
         if (Ticket_TS_Short != true)
         {
         Print("TS-Order Modify Error ",GetLastError());
         }
      }
   }
}

Trail_Após_Pips_Profit é uma variável externa dupla que o usuário preenche...e

PipMultiplier é uma função simples que calcula o valor do ponto decimal da moeda...

Se você não usar MagicNumbers, exclua esse critério....

Isto irá... ou melhor, "deve" rastrear qualquer ordem em qualquer gráfico.....

Eu estou sob correção, mas funciona para mim....

//+------------------------------------------+
//| Check for 5 Digits - Pipmultiplier       |
//+------------------------------------------+
   
   if(Digits==5||Digits==3) 
   {
   PipMultiplier = 10*Point;
   }
   else if(Digits==2) 
   {
   PipMultiplier = 100*Point;
   }
   
   else
   {
   PipMultiplier = Point;
   }
   

Estou impressionado com sua ajuda FMIC.... Boa

 

Mike.T:

Estou impressionado com sua ajuda FMIC.... Boa

Obrigado!

Alguns conselhos; não use "Pergunte" ou "Licite" - use "OrderClosePrice()" em seu lugar. É um valor em tempo real, independentemente de ser um pedido de Compra ou Venda.
 

@Mike.T: Algo parece estar errado com seu código PipMulytiplier:

else if(Digits==2) 
{
   PipMultiplier = 100*Point;
}

Isso não parece estar correto! Por que multiplicá-lo por 100 para símbolos de 2 dígitos? Não deve ser multiplicado de forma alguma! Deveria ser a mesma condição que os símbolos de 4 dígitos.

Aqui está um exemplo. Se o preço de USD/JPY passar de 108,65 para 108,77; isto é um aumento de 12 pip, não 1200 pips!
 
FMIC:

Obrigado!

Alguns conselhos; não use "Pergunte" ou "Licite" - use "OrderClosePrice()" em vez disso. É um valor em tempo real, independentemente de ser um pedido de Compra ou Venda.

Do que... não sabia que.... assim... (sem hi-jacking este tópico)... Eu prefiro usar OrderClosePrice() em vez de Bid or Ask...?
 
Mike.T:
Do que... não sabia que.... assim... (sem hi-jacking este fio)... Eu prefiro usar OrderClosePrice() em vez de Bid or Ask...?
Sim! Pelas razões mencionadas (ver docs), bem como permitir que você funda a lógica de Compra e Venda em um bloco de código, como demonstrei no meu exemplo.