Cuando un programador crea un asesor que recibe señales de los indicadores, siempre se enfrenta a la pregunta: ¿debo utilizar una referencia al indicador o transferir el código del indicador al asesor? Los motivos para ello pueden ser diferentes: el deseo de mantener los indicadores y la estrategia utilizados en secreto, la necesidad de distribuir el asesor en un solo archivo, el deseo de reducir el número de operaciones realizadas cuando no se utilizan todas las señales/búferes de indicador, etcétera. Por supuesto, no somos los primeros ni los últimos en hacernos esta pregunta. Nikolay Kositsin ya analizó un tema semejante para MetaTrader 4. Vamos a ver cómo podemos hacerlo en la plataforma MetaTrader 5.

vamos a analizar las diferencias entre el funcionamiento de los indicadores y los asesores. Veamos una plantilla de indicador vacía.

//+------------------------------------------------------------------+
//| Blanc.mq5 |
//| Copyright 2018, DNG® |
//| http://www.mql5.com/ru/users/dng |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, DNG®"
#property link "http://www.mql5.com/ru/users/dng"
#property version "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
//--- plot Buffer
#property indicator_label1 "Buffer"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrRed
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- indicator buffers
double BufferBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
SetIndexBuffer(0,BufferBuffer,INDICATOR_DATA);

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
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[])
{
//---

//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+

Al comienzo del código del indicador, se declaran las matrices de búfer para intercambiar datos con otros programas. Estas matrices son series temporales, y sus elementos tienen una vinculación con las barras de precios. Esta conexión es compatible directamente con el terminal. El indicador guarda los resultados de los cálculos en estas matrices, sin ocuparse de cambiar su tamaño, ni de transferir los datos cuando aparece una nueva vela. En el asesor no existen estas matrices, por lo que al trasladar el código del indicador al asesor, tendrá que crearlas. Además de los cálculos propiamente dichos, también necesitamos organizar la vinculación entre los elementos de la matriz y las barras en el gráfico del instrumento. La otra cara de la moneda es que dentro del asesor existe la posibilidad de no hacer cálculos con toda la historia existente (lo que sucede en el indicador). Basta con recalcular la profundidad de los datos utilizados.

Por lo tanto, en el asesor se deben crear búferes de indicador. En esta caso, además, debemos recordar que el indicador puede tener no solo búferes para mostrar información en el gráfico, sino también búferes auxiliares para los cálculos intermedios. También tenemos que crearlos. En lo que respecta a los búferes del color de dibujado, podemos ignorarlos si en la estrategia del asesor no se contempla un cambio de color en las líneas de indicador.

Otra diferencia en la arquitectura de indicadores y asesores es la función de procesamiento de ticks. A diferencia de MetaTrader 4, en MetaTrader 5 los procesadores de los ticks entrantes para indicadores y asesores están separados. Al llegar un nuevo tick, en el indicador se llama la función OnCalculate. En los parámetros, esta obtiene el número total de barras en el gráfico, el número de barras en la llamada anterior y las series temporales necesarias para calcular el indicador. En el propio asesor los nuevos ticks se procesan en la función OnTick, que no dispone de parámetros. Por ello, tendremos que crear de forma independiente el acceso a las series temporales y garantizar el monitoreo de los cambios en el gráfico.