- Estilos de indicadores en ejemplos
- Relación entre propiedades de indicador y funciones
- SetIndexBuffer
- IndicatorSetDouble
- IndicatorSetInteger
- IndicatorSetString
- PlotIndexSetDouble
- PlotIndexSetInteger
- PlotIndexSetString
- PlotIndexGetInteger
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 |
---|---|
Enlaza el búfer de indicadores especificado con el array dinámico unidimensional del tipo double |
|
Establece el valor de una propiedad del indicador que tiene el tipo double |
|
Establece el valor de una propiedad del indicador que tiene el tipo int |
|
Establece el valor de una propiedad del indicador que tiene el tipo string |
|
Establece el valor de propiedad de línea del indicador que tiene el tipo double |
|
Establece el valor de propiedad de línea del indicador que tiene el tipo int |
|
Establece el valor de propiedad de línea del indicador que tiene el tipo string |
|
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
|
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:
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 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
|
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:
- 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;
- 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.