Discussão do artigo "Criação de Indicadores complexos de maneira fácil usando objetos"

 

Novo artigo Criação de Indicadores complexos de maneira fácil usando objetos foi publicado:

Este artigo fornece um método para criar os indicadores complexos e, ao mesmo tempo, evitar os problemas que surgem ao lidar com vários gráficos, buffers e/ou combinar dados de várias fontes.

O resultado final do indicador fica assim:


Autor: Manuel Alejandro Cercos Perez

 

Seu artigo ficou muito BOM 😁 ... mas como você mencionou, existe sim um leve problema envolvido na questão de performance. Na maior parte das vezes, não irá influenciar em nada, podendo conviver com isto sem problemas. Mas em momentos de grande volatilidade, o sistema pode vim a travar, ou ficar muito lento, isto por conta da quantidade de chamadas que OnCalculate  poderá vim a receber. Mas o problema não está na função, e sim nas interações que acontecem nela. Já que a cada chamada, o MetaTrader será forçado a ler o buffer dos indicadores, e se a quantidade for grande, pode haver problemas. Uma forma de resolver isto seria usar uma chamada a OnTime, de maneira a aliviar um pouco a carga, já que as chamadas seriam executada não a cada evento de calculo, mas sim em um espaço de tempo predefinido. Se a ideia é operar manualmente, ou de forma semi automática, isto não seria problema, pois cada calculo poderia ser executado em um espaço de 200 milissegundos por exemplo. Mas não é muito adequado usar eventos OnTime em indicadores, devido a possibilidade dele influir no Thread de calculo, principalmente quando o mercado se encontra com muita volatilidade. Uma forma de fazer isto, seria forçando os cálculos na própria OnCalculate, de maneira a não precisar fazer chamadas de a CopyBuffer. Uma outra coisa que irá reduzir em alguns ciclos de máquina o consumo do processador é você modificar na função OnCalculate, a seguinte linha:

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 daqui:

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);

Pode parecer pouco, mas usar o operador ternário, neste caso, irá ser mais eficiente do que fazer uma chamada a função. Estes pequenos detalhes, fazem bastante diferença em momentos de alta volatilidade ... 😁👍

Razão: