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;
- www.mql5.com
static int BARS; //+------------------------------------------------------------------+ //| NewBar function | //+------------------------------------------------------------------+ bool IsNewBar() { if(BARS!=Bars(_Symbol,_Period)) { BARS=Bars(_Symbol,_Period); return(true); } return(false); }
- 2010.10.11
- Konstantin Gruzdev
- www.mql5.com
Yo uso esto...
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. }
Yo uso esto...
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
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