Come rilevare una nuova barra

 

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

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.
 


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;

;-) Ian
Documentation on MQL5: Timeseries and Indicators Access / BarsCalculated
  • www.mql5.com
Timeseries and Indicators Access / BarsCalculated - Documentation on MQL5
 
Io uso questo...
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:
Io uso questo...
Il rischio con questo metodo è che se i dati di prezzo per il tuo simbolo non iniziano dal 4 gennaio 1971, allora qualsiasi dato storico caricato mentre l'esperto è collegato al grafico sarà letto come una nuova barra...
 
I commenti che non si riferiscono a questo argomento, sono stati spostati in "Può mql5 essere utilizzato in MT4?
 

La funzione iTime dà il tempo della barra.

Quando cambia è una nuova barra.

 
Nathan5:

La funzione iTime dà il tempo della barra.

Quando cambia è una nuova barra.

Questo argomento riguarda mql5. Non esiste una funzione iTime().
 

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.          
         
         }
 
Stephen Njuki:
Io uso questo...
Purtroppo questo non sembra funzionare in MQL5.