Como limitar a abertura de posições no mesmo candle

 

Olá pessoal, tudo bem ?

Preciso de ajuda para limitar a abertura de posições no mesmo candle, meu EA abre várias posições no mesmo candle, eu usava o como paliativo Sleep(); para impedir isso, 

porém com alguns testes descobri que está interferindo no funcionamento do EA, pesquisando no fórum descobri esse código...

//+------------------------------------------------------------------+
//| Verifica se o intervalo para o próximo trade foi cumprido        |
//+------------------------------------------------------------------+
bool CheckTradePause()
  {
   //--- Determina quantas barras até o próximo trade
   datetime time_start = iTime(_Symbol, PERIOD_CURRENT, 1);
//   datetime time_start = iTime(_Symbol, PERIOD_CURRENT, 2);
//   datetime time_start = iTime(_Symbol, PERIOD_CURRENT, 3);

   if(HistorySelect(time_start, TimeCurrent()))
     {
      for(int i = HistoryDealsTotal() - 1; i >= 0; i--)
        {
         const ulong Ticket = HistoryDealGetTicket(i);

         if(HistoryDealGetString(Ticket, DEAL_SYMBOL) == _Symbol && HistoryDealGetInteger(Ticket, DEAL_MAGIC) == MAGICNUM)
           {return(false);}
        }
     }
   else
     {
      Print("Erro ao recuperar o histórico de operações ...");
      return(false);
     }

   //--- Intervalo cumprido
   return(true);
  }

O que agradeço muito o Vinicius de oliveira, tentei implementar no código, mas ainda em alguns candles abre mais de uma posição.

Alguém poderia me ajudar ? 

Desde já obrigado!

 

Coloque esse código aqui, acho mais simples.

Agora basta por um if antes de enviar uma ordem.

if(possonegociar())

{

rotina de abertura...

}

//+------------------------------------------------------------------+
//| Função aut.negociar - www.toolstotrader.com                      |
//+------------------------------------------------------------------+

bool possonegociar()
{
bool liberado = false;
static int trade ;
if(trade== 0 || trade != Bars(_Symbol,PERIOD_CURRENT))
  {
   liberado= true;
   trade =  Bars(_Symbol,PERIOD_CURRENT);
  }
  return(liberado);
}
 
Cesar Afif rezende Oaquim #:

Coloque esse código aqui, acho mais simples.

Agora basta por um if antes de enviar uma ordem.

if(possonegociar())

{

rotina de abertura...

}

Ou colocar um 

possonegociar()

Dentro do if estratégia! 

 
Fabio Rodrigues Araujo #:

Ou colocar um 

Dentro do if estratégia! 

So vou comentar uma coisa uma coisa que aconteceu comigo, eu usava algo parecido com isso de testar usando o Bars, mas quando passei a limitar as barras no historico. Acabou que toda a vela nova ficava com o mesmo numero retornado de Bars e isso me obrigou a mudar...

 

Uma outra solução seria verificar quando possui uma nova vela. Para isso eu utilizo a seguinte função que retorna true quando tem uma nova vela.


bool HasNewBar()
  {
   static datetime horaAntiga = 0;
   datetime horaAtual = (datetime)SeriesInfoInteger(_Symbol, _Period, SERIES_LASTBAR_DATE);

   if(horaAntiga == 0)
     {
      horaAntiga = horaAtual;
      return false;
     }
   else if(horaAntiga != horaAtual)
     {
      horaAntiga = horaAtual;
      return true;
     }
   else
     {
      return false;
     }
  }
 
Ricardo Rodrigues Lucca #:

So vou comentar uma coisa uma coisa que aconteceu comigo, eu usava algo parecido com isso de testar usando o Bars, mas quando passei a limitar as barras no historico. Acabou que toda a vela nova ficava com o mesmo numero retornado de Bars e isso me obrigou a mudar...

Realmente é um problema, afinal nesse caso chega a um numero em que sempre vai ficar limitado, mas tem um jeito fácil de resolver:

//+------------------------------------------------------------------+
//| Função aut.negociar - www.toolstotrader.com                      |
//+------------------------------------------------------------------+
bool possonegociar()
  {
   bool liberado = false;
   static datetime trade ;
   if(trade== 0 || trade != iTime(_Symbol,PERIOD_CURRENT,Bars(_Symbol,PERIOD_CURRENT)))
     {
      liberado= true;
     }
   return(liberado);
  }
//+------------------------------------------------------------------+
a verificação trade ==0 no fundo é irrelevante, já que ela sempre será diferente, nesse caso, do resultado do iTime.
 
Obrigado pessoal, consegui resolver, por isso demorei para responder os comentários, mas muito obrigado pela ajuda.
 
Eliseu #:
Obrigado pessoal, consegui resolver, por isso demorei para responder os comentários, mas muito obrigado pela ajuda.

Quando for assim Eliseu, coloca a solução que você achou aqui que ajuda a quem vir pesquisar o tópico no futuro.

Grande abraço

 
Cesar Afif rezende Oaquim #:

Quando for assim Eliseu, coloca a solução que você achou aqui que ajuda a quem vir pesquisar o tópico no futuro.

Grande abraço

Olá.

//+------------------------------------------------------------------+
//|         VERIFICAR SE JÁ ABRIU OPERAÇÃO NO CANDLE ATUAL           |
//+------------------------------------------------------------------+   
    TIME_Abertura_Ultimo_Candle=TimeToString((SeriesInfoInteger(Symbol(),Period(),SERIES_LASTBAR_DATE)),TIME_SECONDS);
    
       if(Hora_Ultimo_Negocio < TIME_Abertura_Ultimo_Candle)
         {
         Operamos_Nesta_Vela=false;
         }

       if(Hora_Ultimo_Negocio > TIME_Abertura_Ultimo_Candle)
         {
         Operamos_Nesta_Vela=true;
         }  

Na condição vai:

Operamos_Nesta_Vela=false

E se abrir posição nas { } vai:

Operamos_Nesta_Vela=true;
Time_Abertura_Ultimo_Candle

Não esquecer de criar as var's globais.

Espero que ajude!

Forte Abraço.

Razão: