EA Grid

 

Estou criando uma EA com GRID que abre posições com variações do preço até o nível N. Está funcionando em backtest e demo perfeitamente, mas em conta real quando tem alta volatilidade acontece, eventualmente, de abrir mais 2 posições no mesmo preço/nível.

Alguém tem uma sugestão de como deixar a função para evitar isso?



//==================================================================
// VERIFICAR GRID
//==================================================================
void VerificarGrid()
  {
   int total=PositionsTotalByMagic(); if(total==0) return;
   double ultimoPreco=0; ulong ultimoTicket=0;
   for(int i=0;i<PositionsTotal();i++)
     {
      ulong t=PositionGetTicket(i);
      if(PositionSelectByTicket(t) && PositionGetInteger(POSITION_MAGIC) == MagicNumber && t>ultimoTicket)
        { ultimoTicket=t; ultimoPreco=PositionGetDouble(POSITION_PRICE_OPEN); }
     }

   double bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
   double ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
   double intervalo=Grid_Intervalo_Pontos*SymbolInfoDouble(_Symbol,SYMBOL_POINT);

   if(total<Grid_MaxNiveis)
     {
      if(tipoPosicaoAtual==POSITION_TYPE_BUY && ask<=ultimoPreco-intervalo)
         AbrirPosicao(ORDER_TYPE_BUY,ask,"GRID BUY "+(string)(total+1));
      if(tipoPosicaoAtual==POSITION_TYPE_SELL && bid>=ultimoPreco+intervalo)
         AbrirPosicao(ORDER_TYPE_SELL,bid,"GRID SELL "+(string)(total+1));
     }

   if(total>1)
     {
      if(tipoPosicaoAtual==POSITION_TYPE_BUY && bid >= ultimoPreco + intervalo)
         FecharPosicao(ultimoTicket, "GRID CLOSE BUY - Lucro Parcial");
      if(tipoPosicaoAtual==POSITION_TYPE_SELL && ask <= ultimoPreco - intervalo)
         FecharPosicao(ultimoTicket, "GRID CLOSE SELL - Lucro Parcial");
     }
  }
 
Thiago LopesEstou criando uma EA com GRID que abre posições com variações do preço até o nível N. Está funcionando em backtest e demo perfeitamente, mas em conta real quando tem alta volatilidade acontece, eventualmente, de abrir mais 2 posições no mesmo preço/nível. Alguém tem uma sugestão de como deixar a função para evitar isso?

Sei que esta não é a melhor sugestão, mas é uma das mais simples (caso realmente precise manter a chamada da função a cada tick), e acredito que pode resolver o problema:

void VerificarGrid()
{
   static bool processando = false;
   static datetime ultimoProcessamento = 0;
   
   // Timeout de segurança (5 segundos)
   if(processando && TimeCurrent() - ultimoProcessamento > 5)
   {
      Print("Timeout detectado, liberando função");
      processando = false;
   }
   
   if(processando)
   {
      Print("Função já está processando, aguardando...");
      return;
   }
   
   processando = true;
   ultimoProcessamento = TimeCurrent();
   
   // ... seu código ...
   
   processando = false; // Liberar ao final
}
 
Valeu, vou testar!