Cos’è un Buffer: Concetto Fondamentale
Un buffer in MQL5 è un array di double in cui ogni elemento corrisponde a una barra del grafico. L’elemento [0] è il valore per la barra più recente, [1] per quella precedente, e così via. MetaTrader legge questi array e li visualizza sul grafico come linee, istogrammi, frecce o punti.
Il sistema buffer è il “canale di comunicazione” tra il tuo codice di calcolo e il grafico di MetaTrader — e tra il tuo indicatore e gli EA che lo usano tramite CopyBuffer(). Ogni indicatore MQL5 ha almeno un buffer — senza buffer non c’è niente da visualizzare.
Struttura Obbligatoria: IndicatorBuffers e SetIndexBuffer
// ============================================================ // FILE: MyIndicator.mq5 // Indicatore con 3 buffer: 2 visibili + 1 nascosto // ============================================================ #property indicator_chart_window #property indicator_buffers 3 // totale buffer (visibili + nascosti) #property indicator_plots 2 // solo quelli visibili sul grafico // Plot 0: linea principale (es. score Oracle 0-10) #property indicator_label1 "Score" #property indicator_type1 DRAW_LINE #property indicator_color1 0xC8A84B // gold Ferrari Luce #property indicator_width1 2 // Plot 1: frecce segnale (es. BUY/SELL Oracle) #property indicator_label2 "Signal" #property indicator_type2 DRAW_ARROW #property indicator_color2 0x00D084 // green // Dichiarazione array buffer (globali) double buf_score[]; // buffer 0: score 0-10 (visibile) double buf_signal[]; // buffer 1: frecce segnale (visibile) double buf_ulcer[]; // buffer 2: Ulcer Index intermedio (NASCOSTO) int OnInit() { // OBBLIGATORIO: dichiara il numero totale di buffer IndicatorBuffers(3); // Collega array ai buffer SetIndexBuffer(0, buf_score, INDICATOR_DATA); // visibile SetIndexBuffer(1, buf_signal, INDICATOR_DATA); // visibile SetIndexBuffer(2, buf_ulcer, INDICATOR_CALCULATIONS); // NASCOSTO // Imposta direzione degli array (barra corrente = [0]) ArraySetAsSeries(buf_score, true); ArraySetAsSeries(buf_signal, true); ArraySetAsSeries(buf_ulcer, true); // Codice freccia per il plot DRAW_ARROW PlotIndexSetInteger(1, PLOT_ARROW, 233); // codice carattere freccia return(INIT_SUCCEEDED); }
OnCalculate: Riempire i Buffer con i Valori
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[]) { // Barre da calcolare: solo quelle nuove (efficienza) int start = (prev_calculated > 0) ? prev_calculated - 1 : 0; for(int i = start; i < rates_total; i++) { // Oracle: calcola Ulcer Index e lo salva nel buffer nascosto buf_ulcer[i] = CalcUlcerIndex(i, close, rates_total); // Calcola score 0-10 e lo salva nel buffer visibile buf_score[i] = CalcScore(i, buf_ulcer[i], close, high, low); // Segnale: freccia solo se score >= 4.0 if(buf_score[i] >= 4.0) buf_signal[i] = low[i] - 10 * _Point; // freccia sotto la barra else buf_signal[i] = EMPTY_VALUE; // niente freccia } return(rates_total); }
Tipi di Buffer: INDICATOR_DATA vs INDICATOR_CALCULATIONS
| Tipo | Costante MQL5 | Visibile sul Grafico | Accessibile da CopyBuffer | Uso Tipico in Oracle |
|---|---|---|---|---|
| Dati Visibili | INDICATOR_DATA | Sì | Sì | Score 0-10, frecce segnale, linee |
| Calcoli Nascosti | INDICATOR_CALCULATIONS | No | Sì (da v-build 815+) | Ulcer Index intermedio, EMA raw |
| Indice Colore | INDICATOR_COLOR_INDEX | No (usato per colori) | No | Buffer colore per DRAW_COLOR_LINE |
Come Leggere i Buffer da un EA: Pattern Completo
// In OnInit() dell'EA int h_oracle = INVALID_HANDLE; int OnInit() { // Crea handle all'indicatore Oracle h_oracle = iCustom(_Symbol, PERIOD_H4, "OracleIndicator", // nome file .mq5 14, // parametro Ulcer Period 14); // parametro ATR Period if(h_oracle == INVALID_HANDLE) return(INIT_FAILED); return(INIT_SUCCEEDED); } // In OnTick() dell'EA double score_buf[], signal_buf[]; ArraySetAsSeries(score_buf, true); ArraySetAsSeries(signal_buf, true); // Leggi buffer 0 (score 0-10) if(CopyBuffer(h_oracle, 0, 0, 3, score_buf) < 3) return; // Leggi buffer 1 (frecce segnale) if(CopyBuffer(h_oracle, 1, 0, 3, signal_buf) < 3) return; double current_score = score_buf[0]; // score barra corrente bool has_signal = (signal_buf[1] != EMPTY_VALUE); // segnale su barra chiusa if(has_signal && current_score >= 4.0) { // Condizioni soddisfatte: apri trade // ... }
Ogni buffer ha uno scopo preciso e documentato.
L’Executor EA di Oracle legge i buffer 0 (score), 1 (BUY signal) e 2 (SELL signal) dell’indicatore Oracle tramite CopyBuffer(). Il buffer 0 determina il position sizing (score ≥7 = size piena, score 4-7 = size 60%). I buffer 1 e 2 determinano la direzione e il momento di entrata.
Nell’architettura Oracle, indicatore ed EA comunicano tramite buffer — non tramite GlobalVariables per le decisioni core. Le GV sono usate solo per il bridge multi-istanza dello Scanner.
Vedi l’Architettura Oracle Buffer dal Vivo
Live gratuite: iscriviti alla prossima. Architettura indicatore-EA, buffer e comunicazione in tempo reale.
ENTRA ALLA LIVE GRATUITA → ARRAY MQL5: GUIDA COMPLETA →FAQ — Buffer Indicatore MQL5
SetIndexBuffer(). Ogni elemento corrisponde a una barra: [0] = barra corrente, [1] = precedente. MetaTrader visualizza automaticamente i valori. Senza buffer, un indicatore MQL5 non può visualizzare niente sul grafico.IndicatorBuffers(n). I buffer visibili (collegati a un plot) usano INDICATOR_DATA. I buffer nascosti per calcoli intermedi usano INDICATOR_CALCULATIONS. Oracle v78 usa 12 buffer totali: 6 visibili + 6 nascosti.h = iCustom(_Symbol, TF, "IndicatorName", params). 2) Dichiara array: double buf[]. 3) ArraySetAsSeries(buf, true). 4) CopyBuffer(h, buffer_index, 0, count, buf). Il buffer_index corrisponde all’ordine di SetIndexBuffer() nell’indicatore: 0 = primo buffer, 1 = secondo, ecc.INDICATOR_DATA: buffer visibile sul grafico, accessible da CopyBuffer(). INDICATOR_CALCULATIONS: buffer nascosto per calcoli intermedi — non visibile sul grafico ma accessibile con CopyBuffer() da build MT5 815+. Oracle usa buffer nascosti per stadi intermedi del calcolo Ulcer Index senza ingombrare il grafico.