Buffer Indicatore MQL5: Guida Completa con Esempi Pratici | Manuel Trotta

Buffer Indicatore MQL5 — Guida Completa con Codice da Oracle v78

I buffer sono il meccanismo fondamentale con cui un indicatore MQL5 disegna valori sul grafico e li espone agli EA. Oracle v78 usa 12 buffer nell’indicatore principale: 6 visibili per il grafico e 6 nascosti per i calcoli interni. Questa guida ti mostra come funzionano con codice reale.

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

◆ Template Indicatore MQL5 con Buffer — Struttura Completa
// ============================================================
// 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

◆ OnCalculate con Buffer — Pattern Oracle v78
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

TipoCostante MQL5Visibile sul GraficoAccessibile da CopyBufferUso Tipico in Oracle
Dati VisibiliINDICATOR_DATASìSìScore 0-10, frecce segnale, linee
Calcoli NascostiINDICATOR_CALCULATIONSNoSì (da v-build 815+)Ulcer Index intermedio, EMA raw
Indice ColoreINDICATOR_COLOR_INDEXNo (usato per colori)NoBuffer colore per DRAW_COLOR_LINE

Come Leggere i Buffer da un EA: Pattern Completo

◆ EA che Legge i Buffer di Oracle — Pattern Executor
// 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
   // ...
}
◆ Oracle v78 — Architettura Buffer Reale
12 buffer totali: 6 visibili + 6 nascosti.
Ogni buffer ha uno scopo preciso e documentato.
0
Score 0-10
1
BUY Signal
2
SELL Signal
3-11
Calcoli Interni

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

Cos’è un buffer in MQL5? ▶
Un buffer è un array double globale collegato a un plot del grafico tramite 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.
Quanti buffer può avere un indicatore MQL5? ▶
Fino a 512 buffer totali, dichiarati con 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.
Come leggere il buffer di un indicatore da un EA? ▶
1) Crea handle: 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.
Differenza tra INDICATOR_DATA e INDICATOR_CALCULATIONS? ▶
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.
Manuel Trotta — Trader quantitativo, fondatore MTInvestments, autore Hoepli
◆ Scritto da

Manuel Trotta

Trader quantitativo italiano dal novembre 2007 — 19 anni online. Fondatore MTInvestments, creatore UlcerZenith Oracle v78 con 65.587 trade reali verificati H4 XAUUSD. Autore di 18 libri sul trading e finanza personale: "Fare Trading con Excel" (Hoepli 2019), "Diventa Investitore Profittevole in 15 Minuti al Giorno", "Il Latte con la Mucca" (memoir 2026), più 2 volumi tecnici. Speaker IT Forum Rimini. Online dal 2007 — stesso nome, stessa P.IVA.

P.IVA 14349331000 Dal Novembre 2007 18 Libri su Amazon ↗ 150K+ Follower