ciao,
come tutti sapranno, da febbraio 2014 sono state introdotti dei cambiamenti significativi nel linguaggio metaquote langage 4 per Metatrader4.
metatrader_4_market_en[1].png
L'ultima build con la versione precedente del linguaggio è la 509, le successive build di Metatrader 4 dalla 600 in su presentano l'editor aggiornato al nuovo linguaggio, evoluto e potenziato.
In questo thread raccogliamo alcune novità, quelle più interessanti ed utili, nonché dubbi, idee, soluzioni...
Iniziamo da un cambiamento minore ma evidente, i nomi delle funzioni di base di un Expert Advisor, senza che sia cambiato nulla in termini di funzionalità.
Se nel vecchio compilatore si usava
OLD MQL4 - Expert Advisor
... ora si usano questi nuovi nomi
NEW MQL4 - Expert Advisor
°°°°°°°°°°°°°°°°°°°°°°
Anche gli INDICATORI non sono cambiati quasi per niente in MQL4 NEW
Si può continuare a programmarti alla stessa vecchia maniera, anche utilizzando le vecchie funzioni, come anche IndicatorCounted() : il codice viene correttamente compilato ed eseguito sul grafico.
Volendo codificare indicatori con le nuove piccole modifiche introdotte in MQL4 NEW, le lievi differenze sono le seguenti.
viene sostituito da
mentre
viene sostituito da
Inoltre, in Mql4 OLD si usava la funzione int IndicatorCounted() per calcolare il numero di barre che non sono cambiate da quando l'indicatore è stato lanciato: questa funzione serve per evitare di dover ricalcolare ad ogni tick i valori dell'indicatore su tutte quelle barre storiche per le quali è già stato calcolato e per le quali, essendo oramai barre fissate, il valore dell'indicatore è sempre lo stesso ad ogni tick.
Ad ogni tick, dopo il primo, dovrà essere elaborato il valore dell'indicatore soltanto per la barra corrente.
In MQL4 NEW è stata introdotta la funzione int OnCalculate(...) che ha come primi due parametri
e
Facendo stampare da qualsiasi indicatore i valori di rates_total, Bars, prev_calculated e IndicatorCounter()
e leggendo qui: http://docs.mql4.com/basis/function/events
il dettaglio delle variabili della funzione int OnCalculate(...) , risulta che:
- la variabile int rates_total coincide con la variabile di sistema Bars = numero di barre del grafico
quindi si può usare indifferentemente rates_total oppure Bars per riferirsi alla stessa variabile
- la variabile int prev_calculated è una variabile che contiene di default il valore restituito dalla funzione IndicatorCounted()+1
cioè vale const int prev_calculated = IndicatorCounted()+1
Da qui, il codice che si usava per gli indicatori scritti con Mql4 OLD
coincide con quanto si fa ora con gli indicatori con MQL4 NEW
Infine, come riporta la MQL4 Reference
per aggiornare il valore di prev_calculated , che aumenta allo scorrere delle nuove barre che incrementano il numero di barre totali del grafico...
it is usually enough to return the value of the rates_total parameter, which contains the number of bars in the current function call
cioè è sufficiente che la funzione int OnCalculate(...) restituisca il valore di rates_total
ed ecco il perché del return(rates_total) che chiude la funzione OnCalculate(...)
come tutti sapranno, da febbraio 2014 sono state introdotti dei cambiamenti significativi nel linguaggio metaquote langage 4 per Metatrader4.
metatrader_4_market_en[1].png
L'ultima build con la versione precedente del linguaggio è la 509, le successive build di Metatrader 4 dalla 600 in su presentano l'editor aggiornato al nuovo linguaggio, evoluto e potenziato.
In questo thread raccogliamo alcune novità, quelle più interessanti ed utili, nonché dubbi, idee, soluzioni...
Iniziamo da un cambiamento minore ma evidente, i nomi delle funzioni di base di un Expert Advisor, senza che sia cambiato nulla in termini di funzionalità.
Se nel vecchio compilatore si usava
OLD MQL4 - Expert Advisor
Code:
int init() { ... return(0); }
Code:
int deinit() { ... return(0); }
Code:
int start() { ... return(0); }
... ora si usano questi nuovi nomi
NEW MQL4 - Expert Advisor
Code:
int OnInit() { ... return(INIT_SUCCEEDED); }
Code:
void OnDeinit(const int reason) { ... }
Code:
void OnTick() { ... }
°°°°°°°°°°°°°°°°°°°°°°
Anche gli INDICATORI non sono cambiati quasi per niente in MQL4 NEW
Si può continuare a programmarti alla stessa vecchia maniera, anche utilizzando le vecchie funzioni, come anche IndicatorCounted() : il codice viene correttamente compilato ed eseguito sul grafico.
Volendo codificare indicatori con le nuove piccole modifiche introdotte in MQL4 NEW, le lievi differenze sono le seguenti.
Code:
int init() { ... return(0); }
Code:
void OnInit(void) { ... return(INIT_SUCCEEDED); }
mentre
Code:
int start() { ... return(0); }
Code:
int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { ... return(rates_total); }
Inoltre, in Mql4 OLD si usava la funzione int IndicatorCounted() per calcolare il numero di barre che non sono cambiate da quando l'indicatore è stato lanciato: questa funzione serve per evitare di dover ricalcolare ad ogni tick i valori dell'indicatore su tutte quelle barre storiche per le quali è già stato calcolato e per le quali, essendo oramai barre fissate, il valore dell'indicatore è sempre lo stesso ad ogni tick.
Ad ogni tick, dopo il primo, dovrà essere elaborato il valore dell'indicatore soltanto per la barra corrente.
In MQL4 NEW è stata introdotta la funzione int OnCalculate(...) che ha come primi due parametri
PHP Code:
const int rates_total
PHP Code:
const int prev_calculated
Facendo stampare da qualsiasi indicatore i valori di rates_total, Bars, prev_calculated e IndicatorCounter()
PHP Code:
Print ("rates_total="+rates_total+" Bars="+Bars+" prev_calculated="+prev_calculated+" IndicatorCounted()="+IndicatorCounted());
e leggendo qui: http://docs.mql4.com/basis/function/events
il dettaglio delle variabili della funzione int OnCalculate(...) , risulta che:
- la variabile int rates_total coincide con la variabile di sistema Bars = numero di barre del grafico
quindi si può usare indifferentemente rates_total oppure Bars per riferirsi alla stessa variabile
- la variabile int prev_calculated è una variabile che contiene di default il valore restituito dalla funzione IndicatorCounted()+1
cioè vale const int prev_calculated = IndicatorCounted()+1
Da qui, il codice che si usava per gli indicatori scritti con Mql4 OLD
PHP Code:
int limit;
int counted_bars=IndicatorCounted();
//---- last counted bar will be recounted
if(counted_bars>0) counted_bars--;
limit=Bars-counted_bars;
coincide con quanto si fa ora con gli indicatori con MQL4 NEW
PHP Code:
int limit;
//---- last counted bar will be recounted
limit=rates_total-prev_calculated;
if(prev_calculated>0) limit++;
Infine, come riporta la MQL4 Reference
per aggiornare il valore di prev_calculated , che aumenta allo scorrere delle nuove barre che incrementano il numero di barre totali del grafico...
it is usually enough to return the value of the rates_total parameter, which contains the number of bars in the current function call
cioè è sufficiente che la funzione int OnCalculate(...) restituisca il valore di rates_total
ed ecco il perché del return(rates_total) che chiude la funzione OnCalculate(...)
PHP Code:
//--- return value of prev_calculated for next call
return(rates_total);
}
Comment