Prova questo nel tuo EA, all'inizio della funzione OnTick.
// Useremo la variabile statica Old_Time per servire il tempo della barra.
// Ad ogni esecuzione OnTick controlleremo il tempo della barra corrente con quello salvato.
// Se il tempo della barra non è uguale al tempo salvato, indica che abbiamo un nuovo tick.
statico datetime Old_Time;
datetime New_Time[1];
bool IsNewBar=false;
// copiando il tempo dell'ultima barra nell'elemento New_Time[0]
int copied=CopyTime(_Symbol,_Period,0,1,New_Time);
if(copied>0) // ok, i dati sono stati copiati con successo
{
if(Old_Time!=New_Time[0]) // se il vecchio tempo non è uguale al nuovo tempo della barra
{
IsNewBar=true; // se non è una prima chiamata, la nuova barra è apparsa
if(MQL5InfoInteger(MQL5_DEBUGGING)) Print("Abbiamo una nuova barra qui ",New_Time[0]," il vecchio tempo era ",Old_Time);
Old_Time=New_Time[0]; // salvare il tempo della barra
}
}
else
{
Alert("Errore nella copia dei dati storici, errore =",GetLastError());
ResetLastError();
return;
}
//--- L'EA dovrebbe controllare la presenza di un nuovo trade solo se abbiamo una nuova barra
if(IsNewBar==false)
{
return;
}
//--- Abbiamo abbastanza barre con cui lavorare
int Mybars=Bars(_Symbol,_Period);
if(Mybars<60) // se il totale delle barre è inferiore a 60 barre
{
Alert("Abbiamo meno di 60 barre, l'EA uscirà ora!)
ritorna;
}
Ciao oneillj,
Pensavo di averti già risposto, ma sembra che sia svanito nell'etere di internet.
Il frammento di codice che hai fornito è più o meno quello di cui mi stavo lamentando all'inizio. Perché così complesso? Ho solo pensato che ci doveva essere un modo più semplice. Ho trovato questo, che sembra funzionare. Per favore correggetemi se sbaglio. (Ho anche provato a usare BarsCalculated, ma era sempre uguale a Bars, quindi il test ha sempre valutato falso).
statico int LastBarCount = 0;
se (Bars(_Symbol, _Period) > LastBarCount)
LastBarCount = Bars(_Symbol, _Period);
altrimenti
ritorna;
- 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
Io uso questo...
Puoi anche provare questo:
// 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. }
Io uso questo...
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
Ciao a tutti,
Sono un principiante assoluto di MQL5 ma ho fatto un bel po' di codifica per altre piattaforme.
Mi sto chiedendo perché è così difficile per un EA eseguire solo su una nuova barra. Ho dato un'occhiata ad alcuni articoli, compreso il gestore dell'evento "nuova barra", e sembra molto difficile.
Se questo non funziona e devo usare il gestore dell'evento "nuova barra", è possibile semplicemente scaricare i file rilevanti e copiarli nella cartella Files(?), e poi #includerli? C'è da qualche parte dove questo è documentato per persone come me che fondamentalmente non hanno idea di cosa stanno facendo?
Sto lavorando attraverso il tutorial in https://www.mql5.com/en/articles/100, e la prima cosa che ho notato è che la funzione "Bars" è usata per assicurarsi che ci siano abbastanza barre su cui eseguire i calcoli, ma il prossimo pezzo di codice è apparentemente progettato per rilevare una nuova barra ed è (per la mia comprensione comunque) un pezzo di codice molto complesso. Non si potrebbe usare la funzione Bars per rilevare una nuova barra? Qualcosa come if(Bars > int LastBarCount) {bool IsNewBar = true; LastBarCount = Bars;} else {IsNewBar = false;}. Funzionerebbe qualcosa del genere?
Uno per la lista dei desideri. Non sarebbe bello se ci fosse un evento OnNewBar che potremmo sovrascrivere, invece di OnTick? Dal momento che ogni indicatore che ho visto funziona su barre, non tick, penso che renderebbe la vita di tutti molto più facile.
Ho appena trovato un'altra possibilità: "BarsCalculated". Ancora una volta non sono del tutto sicuro di cosa significhi dalla descrizione, ma sembra il numero di barre che l'EA ha già elaborato. Se questo fosse vero, allora tutto quello che dovrei controllare è if(Bars > BarsCalculated), se è vero allora vado a fare la mia elaborazione, altrimenti ritorno? Mi manca qualcosa?
Grazie,
Ian