Discussão do artigo "Handler de evento "Nova barra"" - página 5

 
tito.vinicius:

Atualemnte me EA abre vários ordens no mesmo candle. Creio que o material divulgado neste artigo me ajudaria.

Como faço para implementá-lo?


Você pode tirar a lógica de entrada no trade do evento OnTick() e colocar dentro da função OnNewBar(). Assim, só será executado quando houver uma nova barra, não entrando mais várias vezes no mesmo candle, pois uma vez executado, só vai executar novamente no próximo candle.

 
Muito obrigado por esse belo documento - seus esforços são muito apreciados!
 

Bom artigo.

Obrigado!

 

Muito bom, obrigado,

Eu estava esperando por uma função de bibliotecas MQL5, mas parece que não há nenhuma? Tenho uma biblioteca de negociação modular e me deparei com um problema em que o módulo de sinal definia seu sinalizador IsNewBar e substituía o prevCandleTime e, quando o módulo TrailingSL precisava avaliar a mesma função, ele retornava falso porque o prevCandleTime era igual ao atual.

Sim, posso armazenar o resultado em um sinalizador central e usá-lo em todos os módulos, e não me depararia com isso. No entanto, os módulos podem ser executados em períodos de tempo diferentes, por isso essa solução é tão perfeita, obrigado.

 
Artigo muito informativo, muito obrigado
 
Obrigado, a melhor maneira de detectar uma nova barra! :)
 
Em minha opinião, às vezes complicamos as coisas de forma desnecessária. Por motivos práticos, nada, mesmo em termos de desempenho, superará o tempo do sistema (tempo do Windows). No início do próximo minuto ou, para ter certeza, após alguns segundos, podemos presumir que haverá uma nova barra para cada símbolo. Digamos que seja um minuto, cinco minutos, quinze minutos ou qualquer que seja seu período de tempo. Para ter certeza, você pode verificar se a hora da barra e a hora do sistema são as mesmas.

Mas não há necessidade de criar várias instâncias dessa classe apenas para verificar se há uma nova barra, quando na verdade todos nós sabemos quando uma nova barra será pintada.


 
double Old_open, New_open;
bool  NewBar = false;

int OnInit()
  {
        //---------- 

        Old_open = iOpen(Symbol(),PERIOD_CURRENT,0);
        
        //---------- 

        return(INIT_SUCCEEDED);
  }
void OnTick()
  {
        //---
        New_open = iOpen(Symbol(),PERIOD_CURRENT,0);
        if (New_open != Old_open)
           {
               Print("Há um novo bar chegando"., TimeCurrent());
               NewBar = true;
               Old_open = New_open;
           }
        else NewBar = false;
         
  }

Olá, estou supondo que, assim que a cotação Open() chega, isso significa que uma nova barra chegou. Na minha opinião, isso é mais fácil ou estou perdendo alguma coisa?

 
Max Go nova barra chegou. Na minha opinião, isso é mais fácil ou estou perdendo alguma coisa?

Imagine uma situação em que o preço de abertura de uma nova barra seja igual ao preço de abertura da barra anterior.... Há uma grande probabilidade de se detectar tal situação em TFs pequenos.

 

Não tenho nenhum método mais simples do que este.
Rastreia o horário de abertura da barra atual e os compara a cada tick.

// Não tenho um método mais simples do que esse.
// Rastreia o tempo de abertura da barra atual e os compara a cada tick.

double lastTime = 0;

void OnTick() {

   if(isNewBar()){

      Print("New Bar");

     }

}



bool isNewBar() {

   double thisTime= NormalizeDouble(iTime(_Symbol, PERIOD_CURRENT, 0), _Digits);

   if(lastTime != thisTime) {

      lastTime = thisTime;

      return true;

     }

   return false;

  }

Документация по MQL5: Преобразование данных / NormalizeDouble
Документация по MQL5: Преобразование данных / NormalizeDouble
  • www.mql5.com
NormalizeDouble - Преобразование данных - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5