Indicadores personalizados

Grupo de funciones que se usan para crear los indicadores personalizados. No se puede usarlas para crear los Asesores Expertos y los scripts.

Función

Acción

SetIndexBuffer

Enlaza el búfer de indicadores especificado con el array dinámico unidimensional del tipo double

IndicatorSetDouble

Establece el valor de una propiedad del indicador que tiene el tipo double

IndicatorSetInteger

Establece el valor de una propiedad del indicador que tiene el tipo int

IndicatorSetString

Establece el valor de una propiedad del indicador que tiene el tipo string

PlotIndexSetDouble

Establece el valor de propiedad de línea del indicador que tiene el tipo double

PlotIndexSetInteger

Establece el valor de propiedad de línea del indicador que tiene el tipo int

PlotIndexSetString

Establece el valor de propiedad de línea del indicador que tiene el tipo string

PlotIndexGetInteger

Devuelve el valor de propiedad de línea del indicador que tiene el tipo entero

Las propiedades de los indicadores se puede establecer tanto utilizando las directivas del compilador, como a través de las funciones. Para el mejor entendimiento del asunto, se recomienda estudiar los estilos de los indicadores en los ejemplos.

Todos los cálculos necesarios de los indicadores personalizados hay que colocar en la función predeterminada OnCalculate(). Si se usa la forma breve de la llamada a la función OnCalculate() del tipo

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

entonces la variable rates_total contiene el valor de la cantidad total de elementos del array price[], que ha sido pasado como parámetro input para calcular valores del indicador.

El parámetro prev_calculated  es el resultado de ejecución de la función OnCalculate() en la llamada anterior, permite organizar un algoritmo económico para calcular valores del indicador. Por ejemplo, si el valor actual rates_total=1000, y prev_calculated=999, entonces es posible que sea suficiente hacer los cálculos sólo para un valor de cada búfer de indicadores.

Si la información sobre el tamaño del array de entrada price no estuviera disponible, sería necesario hacer los cálculos para 1000 valores de cada búfer de indicador. Con la primera llamada a la función OnCalculate() el valor prev_calculated=0. Si de alguna manera el array price[] ha sido cambiado, en este caso prev_calculated también es igual a 0.

El parámetro begin dice el número de valores iniciales del array price que no contienen los datos para el cálculo. Por ejemplo, si los valores del indicador Accelerator Oscillator (para el que los primeros 37 valores no se calculan) han sido usados como un parámetro de entrada, entonces begin=37. Como ejemplo vamos a ver un indicador simple:

#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
//--- indicator buffers
double         Label1Buffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Label1Buffer,INDICATOR_DATA);
//---
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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);
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Vamos a arrastrarlo desde la ventana "Navegador" a la ventana del indicador Accelerator Oscillator e indiquemos que los cálculos serán realizados a base de los valores del indicador anterior:

Cálculo de un indicador a base de los valores del otro indicador previamente adjuntado

Como resultado, con la primera llamada a la función OnCalculate() el valor prev_calculated va a ser igual a cero, y con las siguientes llamadas será igual al valor rates_total (hasta que el número de barras en el gráfico de precios no se aumente).

El parámetro begin muestra la cantidad de barras iniciales cuyos valores están omitidos

El valor del parámetro begin será exactamente igual al número de barras iniciales para las que los valores del indicador Accelerator no se calculan conforme a la lógica de este indicador. Si nos fijamos en el código fuente del indicador personalizado Accelerator.mq5, veremos en la función OnInit() estas líneas:

//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,37);

Precisamente usando la función PlotIndexSetInteger(0, PLOT_DRAW_BEGIN, empty_first_values) comunicamos el número de primeros valores inexistentes en el array de indicador nulo del indicador personalizado, los que no tenemos que considerar para el cálculo (empty_first_values). De esta manera, disponemos de mecanismos para:

  1. comunicar sobre el número de valores iniciales de un indicador los que no hay que usar para los cálculos en otro indicador personalizado;
  2. obtener la información sobre el número de primeros valores iniciales los que hay que ignorar a la hora de llamar a otro indicador personalizado sin entrar en la lógica de sus cálculos.