No mundo do trading, muitas vezes nos deparamos com a necessidade de normalizar os valores dos osciladores, ou seja, ajustar as oscilações do indicador para o intervalo de [-1;1]. Isso abre novas possibilidades, sendo a mais simples delas o controle dos valores do indicador por níveis concretos (como 0.5, 0.8, entre outros), ao invés de depender de valores aproximados e aleatórios que variam conforme o mercado. Se o indicador já estiver normalizado, ótimo! Caso contrário, não hesite em utilizar essa técnica, e não me julgue muito severamente pelo código bruto.
Parâmetros:
string Indicador - refere-se ao próprio indicador que será passado para a função icustom(). Infelizmente, as ferramentas de automação MQL4 não são suficientes para adicionar indicadores padrão aqui. Mas quem pode impedir um programador curioso de modificar uma entrada no programa?
int mode - número da linha necessária do indicador inicial...
int param1
int param2 - ... e seus parâmetros. Novamente, a imaginação dos desenvolvedores de MQL parece se limitar a permitir a escrita de funções com um número variável de parâmetros (como Print), e a suportar a aritmética de endereços (na minha opinião, isso é só para fazer os usuários comuns se sentirem inferiores aos deuses do código :)). Então, vamos trabalhar manualmente.
Imagem:

Comentários:
Os cálculos são realizados em duas etapas:
1. Na etapa de inicialização (a função init(), para quem não sabe :)), todo o array de dados do indicador é analisado com o objetivo de calcular o período distintivo, ou seja, o período dentro do qual o valor médio quadrático do indicador pode fornecer uma visão desse valor médio quadrático (MSV) ao longo de toda a história.
Vamos explicar. Suponha que temos um oscilador e calculamos seu valor médio quadrático para vários períodos consecutivos de oscilação. Vamos concordar que deve haver, por exemplo, 3 períodos (como eu tenho - #define PERIODS_CHARACTERISTIC 3, recomendo não usar mais, senão o processador ficará sobrecarregado). A essência do cálculo é determinar quantas barras, em média, dura um período (ou seja, 2 vezes o intervalo médio entre dois zeros do indicador), e multiplicar o valor obtido por 3.
2. Depois, é necessário calcular o MSV para cada barra (como a raiz quadrada da dispersão) nos três períodos obtidos, normalizar o valor do nosso indicador com base nisso e, por fim, ajustar tudo para o intervalo dinâmico [-1;1] através da função compressora f(x)=tanh(x) (tangente hiperbólica, eu tive que escrever a função eu mesmo :)).
Um exemplo técnico. A linha verde na imagem é o meu oscilador bem antigo que caracteriza a atividade do mercado (na verdade, ele é semelhante ao MACD, mas baseado em volumes). A linha azul é outro oscilador, mas que já passou pelo -=Normalizador=-. Os níveis de +-0.75, +-0.5, +-0.25 são claramente visíveis, e também é possível perceber que todos os máximos e mínimos, as regiões de alta e baixa, e os pontos de cruzamento do nível zero mantêm suas posições.
Então, aqui está... Não sou culpado se alguém não gostar.
Publicações relacionadas
- iMFISignAlert: O Indicador para MetaTrader 5 que Gera Alertas
- Calendário Econômico: Monitoramento e Cache para Testes de Estratégia no MetaTrader 5
- Buffers Horários para Coleta de Dados no MetaTrader 5
- Bandas Quantílicas: Entenda Esse Indicador para MetaTrader 5
- AllAverages v4.9 MT5: O Indicador Imperdível para Traders