Sólo un buen enfoque de la aplicación en el artículo, nada nuevo, simplemente no es una mala solución al problema.
Su artículo era muy bueno 😁 ... pero como usted ha mencionado, hay un pequeño problema relacionado con el tema del rendimiento. La mayor parte del tiempo, no afectará en nada, y se puede vivir con ello sin problemas. Pero en momentos de gran volatilidad, el sistema puede bloquearse o volverse muy lento, debido al número de llamadas que OnCalculate puede recibir. Pero el problema no está en la función, sino en las interacciones que se producen dentro de ella. Porque con cada llamada, MetaTrader se verá obligado a leer el buffer de los indicadores, y si el número es grande, podría haber problemas. Una forma de solucionarlo sería utilizar una llamada a OnTime, para aligerar un poco la carga, ya que las llamadas se ejecutarían no en cada evento de cálculo, sino a lo largo de un periodo de tiempo predefinido. Si la idea es operar de forma manual, o semiautomática, esto no sería un problema, ya que cada cálculo podría realizarse en 200 milisegundos, por ejemplo. Pero no es muy adecuado utilizar eventos OnTime en indicadores, por la posibilidad de que influyan en el hilo de cálculo, especialmente cuando el mercado es muy volátil. Una forma de hacerlo sería forzar los cálculos en el propio OnCalculate, para no tener que hacer llamadas a CopyBuffer. Otra cosa que reducirá el consumo del procesador en unos cuantos ciclos de máquina es modificar la siguiente línea en la función OnCalculate:
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[]) { //--- int limit = MathMax(0, prev_calculated-1);
por esta otra:
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[]) { //--- int limit = (prev_calculated <= 0 ? 0 : prev_calculated - 1);
Puede no parecer mucho, pero usar el operador ternario en este caso será más eficiente que hacer una llamada a la función. Estos pequeños detalles marcan una gran diferencia en momentos de alta volatilidad... 😁👍
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Usted acepta la política del sitio web y las condiciones de uso
Artículo publicado Creación simple de indicadores complejos usando objetos:
El artículo presenta un método para crear indicadores complejos que nos evitará problemas al trabajar con múltiples gráficos y búferes, así como al combinar datos de varias fuentes.
El resultado final se verá así:
Autor: Manuel Alejandro Cercos Perez