Cómo detectar un nuevo bar

 

Hola a todos,

Soy un completo novato en MQL5 pero he hecho un poco de codificación para otras plataformas.

Me pregunto por qué es tan difícil para un EA para ejecutar sólo en una nueva barra. He echado un vistazo a algunos de los artículos, incluyendo el controlador de eventos "nueva barra", y parece muy difícil.

Si eso no funciona y tengo que usar el manejador de eventos "nueva barra", ¿es posible simplemente donwload los archivos pertinentes y copiarlos a la carpeta Files(?), y luego #incluirlos? ¿Hay algún lugar donde esto esté documentado para gente como yo que básicamente no tiene ni idea de lo que está haciendo?

Estoy trabajando en el tutorial en https://www.mql5.com/en/articles/100, y lo primero que noté fue que la función "Bars" se utiliza para asegurar que hay suficientes barras para realizar los cálculos, pero la siguiente pieza de código está aparentemente diseñada para detectar una nueva barra y es (a mi entender) una pieza de código muy compleja. ¿No se podría utilizar la función Bar s para detectar una nueva barra? Algo como if(Bars > int LastBarCount) {bool IsNewBar = true; LastBarCount = Bars;} else {IsNewBar = false;}. ¿Funcionaría algo así?

Uno para la lista de deseos. ¿No sería bueno si hubiera un evento OnNewBar que pudiéramos anular, en lugar de OnTick? Dado que todos los indicadores que he visto funcionan sobre barras, no sobre ticks, creo que facilitaría mucho la vida de todos.

Acabo de encontrar otra posibilidad: "BarsCalculated". De nuevo, no estoy del todo seguro de lo que significa por la descripción, pero parece el número de barras que el EA ha procesado ya. Si eso fuera cierto, entonces todo lo que tendría que comprobar es if(Bars > BarsCalculated), si es cierto, entonces ir y hacer mi procesamiento, de lo contrario volver? ¿Me estoy perdiendo algo?

Gracias,

Ian

Step-By-Step Guide to writing an Expert Advisor in MQL5 for Beginners
  • 2010.06.09
  • Samuel
  • www.mql5.com
The Expert Advisors programming in MQL5 is simple, and you can learn it easy. In this step by step guide, you will see the basic steps required in writing a simple Expert Advisor based on a developed trading strategy. The structure of an Expert Advisor, the use of built-in technical indicators and trading functions, the details of the Debug mode and use of the Strategy Tester are presented.
 


Pruebe esto en su EA, al principio de la función OnTick.

// Utilizaremos la variable estática Old_Time para servir el tiempo de la barra.

// En cada ejecución de OnTick comprobaremos el tiempo de barra actual con el guardado.

// Si el tiempo de barra no es igual al guardado, indica que tenemos un nuevo tick.


static datetime Old_Time;

datetime Hora_nueva[1];

bool IsNewBar=false;


// copiando la última hora de la barra al elemento Nueva_Hora[0]

int copied=CopyTime(_Symbol,_Period,0,1,New_Time);

if(copied>0) // ok, los datos se han copiado con éxito

{

if(¡Hora_antigua!=Hora_nueva[0]) // si la hora antigua no es igual a la hora de la barra nueva

{

IsNewBar=true; // si no es una primera llamada, la nueva barra ha aparecido

if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Tenemos nueva barra aquí ",New_Time[0]," la hora antigua era ",Old_Time);

Old_Time=New_Time[0]; // guardando la hora de la barra

}

}

else

{

Alert("Error al copiar los datos de tiempos históricos, error =",GetLastError());

ResetLastError();

return;

}


//--- El EA sólo debe comprobar si hay una nueva operación si tenemos una nueva barra

if(IsNewBar==false)

{

return;

}

//--- ¿Tenemos suficientes barras para trabajar?

int Mybars=Barras(_Símbolo,_Periodo);

if(Mybars<60) // si el total de barras es inferior a 60 barras

{

Alert("¡Tenemos menos de 60 barras, el EA saldrá ahora!");

retornar;

}


 

Hola oneillj,

Pensé que ya había respondido, pero parece que se ha desvanecido en el éter de Internet.

El fragmento de código que has proporcionado es más o menos del que me quejaba en primer lugar. ¿Por qué tan complejo? Pensé que tenía que haber una manera más fácil. Se me ocurrió esta, que parece funcionar. Por favor, corregidme si me equivoco. (También intenté usar BarsCalculated, pero siempre era igual a Bars, por lo que la prueba siempre se evaluaba como falsa).

static int LastBarCount = 0;
if (Bars(_Symbol, _Period) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period);
si no
retorna;

;-) Ian
Documentation on MQL5: Timeseries and Indicators Access / BarsCalculated
  • www.mql5.com
Timeseries and Indicators Access / BarsCalculated - Documentation on MQL5
 
Yo uso esto...
static int BARS;
//+------------------------------------------------------------------+
//| NewBar function                                                  |
//+------------------------------------------------------------------+
bool IsNewBar()
   {
      if(BARS!=Bars(_Symbol,_Period))
        {
            BARS=Bars(_Symbol,_Period);
            return(true);
        }
      return(false);
   }
 
"New Bar" Event Handler
  • 2010.10.11
  • Konstantin Gruzdev
  • www.mql5.com
MQL5 programming language is capable of solving problems on a brand new level. Even those tasks, that already have such solutions, thanks to object oriented programming can rise to a higher level. In this article we take a specially simple example of checking new bar on a chart, that was transformed into rather powerful and versatile tool. What tool? Find out in this article.
 
ssn:
Yo uso esto...
El riesgo con este método es que si los datos de precios para su símbolo no comienzan desde el 4 de enero de 1971, entonces cualquier dato histórico cargado mientras el experto está unido al gráfico se leerá como una nueva barra...
 
Los comentarios que no se relacionan con este tema, han sido trasladados a " ¿Se puedeutilizar mql5 en MT4?
 

La función iTime da la hora de la barra.

Cuando cambia es una nueva barra.

 
Nathan5:

La función iTime da la hora de la barra.

Cuando cambia es una nueva barra.

Este tema es sobre mql5. No existe la función iTime().
 

También puedes probar esto:


// Rates structure array for last two bars 
   MqlRates mrate[2];                 
   CopyRates(Symbol(), Period(), 0, 2, mrate);

// NEW BAR CHECK.
//---------------
   static double   dBar_Open;     
   static double   dBar_High;
   static double   dBar_Low;
   static double   dBar_Close;
   static long     lBar_Volume;
   static datetime nBar_Time;

// Boolean for new BAR confirmation. 
   bool bStart_NewBar = false;

// Check if the price data has changed tov the previous bar.   
   if(mrate[0].open != dBar_Open || mrate[0].high != dBar_High || mrate[0].low != dBar_Low || mrate[0].close != dBar_Close || mrate[0].tick_volume != lBar_Volume || mrate[0].time != nBar_Time)
         {
         bStart_NewBar = true; // A new BAR has appeared!        

// Update the new BAR data.     
         dBar_Open   = mrate[0].open;      
         dBar_High   = mrate[0].high;
         dBar_Low    = mrate[0].low;
         dBar_Close  = mrate[0].close;                 
         lBar_Volume = mrate[0].tick_volume;
         nBar_Time   = mrate[0].time;
         }

// Check if a new bar has formed.   
   if(bStart_NewBar == true)
         {
         
// Your code.          
         
         }
 
Stephen Njuki:
Yo uso esto...
Lamentablemente esto no parece funcionar en MQL5.