Custom Indicators

Questo è il gruppo funziona utilizzati nella creazione di indicatori personalizzati. Queste funzioni non possono essere utilizzate durante la scrittura di Expert Advisors e Script.

Funzione

Azione

SetIndexBuffer

Associa il buffer indicatore specificato con l' array dinamico uni-dimensionale di tipo double

IndicatorSetDouble

Imposta il valore della proprietà dell' indicatore di tipo double

IndicatorSetInteger

Imposta il valore di una proprietà dell'indicatore di tipo int

IndicatorSetString

Imposta il valore della proprietà dell' indicatore di tipo string

PlotIndexSetDouble

Imposta il valore della proprietà dell' indicatore di tipo double

PlotIndexSetInteger

Imposta il valore di una proprietà dell'indicatore di tipo int

PlotIndexSetString

Imposta il valore di una proprietà dell'indicatore di tipo string

PlotIndexGetInteger

Restituisce il valore della proprietà della linea dell'indicatore di tipo integer

La proprietà dell'indicatore può essere impostata utilizzando le direttive del compilatore o utilizzando le funzioni. Per capire meglio ciò, si consiglia di studiare gli stili indicatore negli esempi.

Tutti i calcoli necessari di un indicatore personalizzato devono essere messi nella funzione predeterminata OnCalculate(). Se si utilizza una forma breve della chiamata di funzione OnCalculate(), come

int OnCalculate (const int rates_total, const int prev_calculated, const int begin, const double& price[])

allora la variabile rates_total contiene il valore del numero totale di elementi dell'array prezzo[] passato come parametro di input per il calcolo dei valori degli indicatori.

Il parametro prev_calculated è il risultato dell'esecuzione di OnCalculate() alla chiamata precedente, ma permette di organizzare un algoritmo risparmiante risorse, per calcolare i valori degli indicatori. Ad esempio, se il valore corrente rates_total = 1000, prev_calculated = 999, allora forse è sufficiente per fare calcoli solo per un valore di ciascun buffer indicatore.

Se le informazioni rigardo la grandezza dell'array di input prezzi sarebbe stato non-disponibile, allora avrebbe portato alla necessità di fare calcoli per 1000 valori di ogni buffer indicatore. Alla prima chiamata di OnCalculate() Valore prev_calculated = 0. Se l'array prezzo[] è cambiato in qualche modo, allora in questo caso prev_calculated è anche uguale a 0.

Il parametro begin mostra il numero di valori iniziali dell'array prezzo, che non contengono dati per il calcolo. Per esempio, se i valori di Oscillator Accelerator (per cui i primi 37 valori non vengono calcolati) sono stati utilizzati come parametro di input, allora begin = 37. Ad esempio, consideriamo un semplice indicatore:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//---- plot Label1
#property indicator_label1  "Label1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- buffers indicatore
double         Label1Buffer[];
//+--------------------------------------------------------------------------------+
//| Funzione di inizializzazione Indicatore Personalizzato  |
//+--------------------------------------------------------------------------------+
void OnInit()
  {
//--- mappatura buffers indicatore
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
  }
//+--------------------------------------------------------------------------------+
//| Funzione di iterazione indicatore personalizato |
//+--------------------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[])
 
  {
//---
   Print("begin = ",begin,"  prev_calculated = ",prev_calculated,"  rates_total = ",rates_total);
//--- restituisce il valore di prev_calculated per la prossima chiamata
   return(rates_total);
  }

Trascinandolo dalla finestra "Navigatore" alla finestra dell'indicatore Accelerator Oscillator, indicheremo che i calcoli saranno effettuati in base ai valori dell'indicatore precedente:

Calcolo di un indicatore sui valori dell'indicatore precedentemente allegato

Come risultato, la prima chiamata di OnCalculate() avrà il valore di prev_calculated uguale a zero, e con ulteriori chiamate sarà uguale al valore rates_total (finché il numero di barre sul grafico dei prezzi aumenti).

Il parametro begin mostra il numero di barre iniziali, sulle quali i valori vengono omessi

Il valore del parametro begin sarà esattamente uguale al numero di barre iniziali, per cui i valori dell'indicatore Accelerator non vengono calcolati secondo la logica di questo indicatore. Se guardiamo il codice sorgente del indicatore personalizzato Accelerator.mq5, vedremo le seguenti linee nella funzione OnInit():

//--- imposta la prima barra da quell' indice sarà disegnato
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,37);

Utilizzando la funzione PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, Empty_first_values), abbiamo impostato il numero di primi-valori non esistenti nell'array indicatore zero di un indicatore personalizzato, che non abbiamo bisogno di accettare per il calcolo (empty_first_values). Così, abbiamo meccanismi per:

  1. impostare il numero di valori iniziali di un indicatore, che non dovrebbe essere utilizzato per i calcoli in un altro indicatore personalizzato;
  2. ottenere informazioni sul numero dei primi valori per essere ignorati quando si chiama un altro indicatore personalizzato, senza entrare nella logica dei suoi calcoli.