OnCalculate

La funzione è chiamata negli indicatori quando si verifica l'evento Calculate per l'elaborazione delle modifiche dei dati di prezzo. Ci sono due tipi di funzione. Solo uno di esse può essere utilizzata all'interno di un singolo indicatore.

Calcolo basato su matrice di dati

int  OnCalculate(
   const int        rates_total,       // grandezza array price[ ]
   const int        prev_calculated,   // numero di barre gestite alla precedente chiamata
   const int        begin,             // numero indice nell'array price[ ] da cui partono i dati significativi
   const double&    price[]            // array di valori per il calcolo
   );

Calcoli basati sulle timeseries del corrente timeframe

int  OnCalculate(
   const int        rates_total,       // grandezza delle timeseries input
   const int        prev_calculated,   // numero di barre gestite alla precedente chiamata
   const datetime&  time[],            // array Time
   const double&    open[],            // array Open
   const double&    high[],            // array High
   const double&    low[],             // array Low
   const double&    close[],           // array Close
   const long&      tick_volume[],     // array Tick Volume
   const long&      volume[],          // array Real Volume
   const int&       spread[]           // array Spread
   );

Parametri

rates_total

[in] Gradenzza della serie di prezzi[ ] o serie di input disponibili per l'indicatore per il calcolo. Nel secondo tipo di funzione, il valore del parametro corrisponde al numero di barre sul grafico-chart su cui è stato lanciato.

prev_calculated

[in] Contiene il valore restituito dalla funzione OnCalculate() durante la chiamata precedente. È progettato per saltare le barre che non sono state modificate dal lancio precedente di questa funzione.

begin

[in] Il valore dell'indice nell'array price[] da cui partono i dati significativi. Permette di saltare i dati mancanti o iniziali, per i quali non ci sono valori corretti.

price[]

[in] Array di valori per i calcoli. Una delle timeseries prezzo o un buffer indicatore calcolato può essere passato come array price[ ]. Il tipo di dati passati per il calcolo può essere definito usando la variabile predefinita _AppliedTo.

time{}

[in] Array con valori di tempo della barra aperta.

open[]

[in] Array con valori di prezzo Open.

high[]

[in] Array con valori di prezzo High.

low[]

[in] Array con valori di prezzo Low.

close[]

[in] Array con valori di prezzo Close.

tick_volume[]

[in] Array con valori di volume tick.

volume[]

[in] Array con valori di volume trade.

spread[]

[in] Array di valori spread per le barre.

Valore di ritorno

tipo int di valore da passare come parametro prev_calculated durante la prossima chiamata di funzione.

Nota

Se la funzione OnCalculate() è uguale a zero, nessun valore dell'indicatore viene visualizzato nel DataWindow del terminale client.

Se i dati del prezzo sono stati modificati dall'ultima chiamata della funzione OnCalculate() (è stato caricato uno storico più profondo o sono stati riempiti spazi vuoti nello storico), il valore del parametro di input prev_calculated è impostato a zero dal terminale stesso.

Per definire la direzione di indicizzazione negli array time[], open[], high[], low[], close[], tick_volume[], volume[] e spread[], chiamare la funzione ArrayGetAsSeries(). Per non dipendere dai valori predefiniti, chiamare la funzione ArraySetAsSeries() per gli array con cui lavorare.

Quando si utilizza il primo tipo di funzione, un indicatore o timeseries necessari viene selezionato da un utente come array price[ ] nella scheda Parametri quando si avvia l'indicatore. Per fare ciò, specificare l'elemento necessario nell'elenco a discesa del campo "Applica a".

Per ottenere i valori dell'indicatore personalizzato da altri programmi mql5, viene usata la funzione iCustom(). Restituisce l'handle dell'indicatore per le operazioni successive. È anche possibile specificare l'array price[ ] richiesto o l'handle di un altro indicatore. Questo parametro deve essere passato per ultimo nell'elenco delle variabili di input di un indicatore personalizzato.

È necessario utilizzare la connessione tra il valore restituito dalla funzione OnCalculate() e il secondo parametro di input prev_calculated. Quando si chiama la funzione, il parametro prev_calculated contiene il valore restituito dalla funzione OnCalculate() durante la chiamata precedente. Ciò consente di implementare algoritmi di risparmio delle risorse per il calcolo di un indicatore personalizzato al fine di evitare calcoli ripetitivi per le barre che non sono state modificate dal lancio precedente di questa funzione.

 

Indicatore di esempio

//+------------------------------------------------------------------+
//|                                           OnCalculate_Sample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2000-2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property description "Calcolo dell'indicatore Momentum di esempio"
 
//---- Impostazioni dell'indicatore
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_type1   DRAW_LINE
#property indicator_color1  Blue
//---- input
input int MomentumPeriod=14; // periodo di Calcolo
//---- buffer indicatore
double    MomentumBuffer[];
//--- variabile globale per la memorizzazione del periodo di calcolo
int       IntPeriod;
//+------------------------------------------------------------------+
//| Funzione di inizializzazione dell'indicatore personalizzato      |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- controlla il parametro di input
   if(MomentumPeriod<0)
     {
      IntPeriod=14;
      Print("Il parametro Period ha un valore errato. Il seguente valore deve essere utilizzato per i calcoli ",IntPeriod);
     }
   else
      IntPeriod=MomentumPeriod;
//---- buffers  
   SetIndexBuffer(0,MomentumBuffer,INDICATOR_DATA);
//---- nome dell'indicatore da visualizzare in DataWindow e sottofinestra
   IndicatorSetString(INDICATOR_SHORTNAME,"Momentum"+"("+string(IntPeriod)+")");
//--- imposta l'indice della barra da cui inizia il disegno
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,IntPeriod-1);
//--- imposta 0.0 come valore vuoto che non è disegnato
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0.0);
//--- precisione dell'indicatore da visualizzare
   IndicatorSetInteger(INDICATOR_DIGITS,2);
  }
//+------------------------------------------------------------------+
//| Calcolo indicatore Momentum                                      |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,     // grandezza arrat price[ ] 
                const int prev_calculated, // numero di barre precedentemente gestite
                const int begin,           // da dove partono i dati significativi 
                const double &price[])     // array di valori per la gestione
  {
//--- posizione iniziale per i calcoli
   int StartCalcPosition=(IntPeriod-1)+begin;
// ---- se i dati di calcolo sono insufficienti
   if(rates_total<StartCalcPosition)
      return(0);  // esce con un valore zero - l'indicatore non viene calcolato
//--- inizia il disegno corretto
   if(begin>0)
      PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,StartCalcPosition+(IntPeriod-1));
//--- avvio calcoli, definisce la posizione di partenza
   int pos=prev_calculated-1;
   if(pos<StartCalcPosition)
      pos=begin+IntPeriod;
//--- ciclo di calcolo principale
   for(int i=pos;i<rates_total && !IsStopped();i++)
      MomentumBuffer[i]=price[i]*100/price[i-IntPeriod];
//--- l'esecuzione OnCalcolate è completa. Restituisce il nuovo valore prev_calculated per la chiamata successiva
   return(rates_total);
  }

Guarda anche

ArrayGetAsSeries, ArraySetAsSeries, iCustom, Funzioni di event handling, Avvio programmi, Eventi del terminale client, Accesso a timeseries ed indicatori