Desenvolvimento do Oscilador Pivô Médio: um novo Indicador para a Média Móvel Acumulada

Marco Calabrese | 16 janeiro, 2020

Conteúdo


Introdução: por que outro oscilador?

Os osciladores representam uma subclasse de indicadores que flutuam acima e abaixo de uma linha central ou dentro de níveis predefinidos. Eles são amplamente utilizados na análise técnica como geradores de eventos de negociação, por exemplo, quando a linha central é cruzada ou um determinado limiar é ultrapassado. Os osciladores populares são MACD, RSI, CCI, cada um com características específicas, como tentar antecipar reversões observando a taxa de variação do preço (também conhecida como momento) ou buscando a tendência principal.

Em geral, os osciladores cuja fórmula calcula a divergência de preços entre dois instantes mostram um comportamento antecipado do preço (por exemplo, RSI, CCI), enquanto os osciladores baseados em médias mostram um comportamento atrasado. Para citar um exemplo relevante, o MACD pode ser considerado um indicador que apresenta características de antecipação e atraso, pois é calculado sobre a diferença entre duas médias. O gráfico dessa diferença é descrito como um histograma, facilitando a localização dos cruzamentos e divergências da linha central.

No entanto, existem prós e contras no uso de todos os osciladores, pois pode haver condições de mercado que aumentam os sinais falso positivos (especialmente para os principais osciladores) ou divergências rápidas que podem distorcer a maior parte da relação risco/retorno (como geralmente ocorre nos osciladores que atrasam). Como regra geral, pode ser mais sensato para um trader examinar vários osciladores de uma só vez, apenas para ter possíveis confirmações independentes de um sinal de negociação.

Neste artigo, o Oscilador Pivô Médio é apresentado como uma tentativa de trazer em meio ao vasto panorama de osciladores alguns novos recursos derivados diretamente do uso da Média Móvel Cumulativa (CMA).


Aspectos do CMA

Em estatística, a média móvel (MA), também conhecida como MA simples, é um cálculo que calcula a média dos últimos n dados da série temporal. Quando aparece um novo valor, o mais antigo é eliminado de acordo com a política de fila first-in-first-out (FIFO). Os níveis da MA são úteis em contextos financeiros, pois podem ser interpretados como suporte em um mercado em queda ou resistência em um mercado em alta.

A nível conceitual, a MA trabalha com um buffer de memória fixa, descartando os dados (e, consequentemente, traços de informações) mais antigos que o último dado disponível. Se idealmente nós permitirmos que esse buffer se estenda ao infinito, para que todos os dados até o ponto de referência atual sejam considerados no cálculo, temos o CMA.

Felizmente, na aplicação prática, não precisamos alocar memória infinita para armazenar cada dado! De fato, o CMA pode ser calculado com poucas variáveis (se usado uma formulação recursiva, consulte a próxima figura para obter detalhes). 

Tabela 1

Tabela 1: Duas formulações do CMA.


O segundo aspecto interessante da fórmula CMA é a presença de um contador que aumenta em uma unidade de cada vez. Isso significa que o próximo valor de CMA será composto, em parte, por um elemento totalmente previsível e, complementado com outras informações, pode ser usado para fins de previsão. Por exemplo, nas condições de mercado lateralizado, o preço tenderá a desviar-se para o valor do CMA.   

O CMA é o ingrediente base do PMO, que é apresentado a seguir.


Definições de PM & PMO

O PMO é construído sobre um índice de normalização que chamamos de Pivô Médio (PM), que é calculado como a fração entre o último dado e o CMA.

O PM fornece uma compreensão numérica rápida da distância de preço do CMA. Isso significa que o PM pode ser considerado como uma medida de propagação. Por exemplo, um valor de PM igual a 1,0035 significa simplesmente que o valor atual é 0,35% superior ao CMA, enquanto um PM igual a 1 significaria que o valor atual é perfeitamente coincidente com o CMA.

Como o cálculo da PM pode ser repetido para cada ponto de dados, isso implica que todas as séries temporais podem ser convertidas em um sinal de PM. Eventualmente, nós definimos o PMO como a diferença entre duas MAs aplicadas aos sinais de PM. Em resumo, o PMO fornece uma medida de divergência entre dois spreads, portanto, é útil examinar suas aplicações nas configurações de negociação.

As duas médias de PMO podem ser calculadas no mesmo sinal de PM ou em dois diferentes. Neste artigo, nós consideramos as MAs simples aplicadas aos sinais de PM, que foram obtidos de dados de preços de fechamento e abertura, respectivamente.

Tabela 2

Tabela 2: Fórmulas de PM & PMO.


Embora existam semelhanças, a formulação do PMO apresentada aqui é diferente do MACD em alguns aspectos. O MACD é geralmente aplicado aos sinais de preço, enquanto os sinais subjacentes do PMO são aos PM. Além disso, enquanto no MACD são consideradas as MAs exponenciais, aqui nos concentramos nas MAs simples, deixando as variantes mais sofisticadas do PMO para trabalhos futuros sobre esse assunto.


Design Básico & Código

O PMO requer poucas entradas derivadas diretamente de sua formulação: 

//--- input parameters
input datetime startingTime;
input int      MA_close=3;
input int      MA_open=21;

No total, nós usaremos três buffers:

//--- buffers dos indicador
double   PMOBuffer[];
double   closeBuffer[];
double   openBuffer[];  

Quanto às variáveis globais, é necessário ter um contador e duas variáveis para armazenar os valores dos preços de fechamento e de abertura que permitem o cálculo do PMO. Nós também adicionamos algumas outras variáveis de suporte para acompanhar o primeiro índice usado em todos os buffers desde o horário de entrada.

//----global vars---
int counter=1;
double sum_close=0;
double sum_open=0;
bool first_val_checked;
int first_valid_index;

Para dar suporte ao cálculo das duas médias do PMO, é necessário implementar uma função que implemente a MA. O único obstáculo que deve ser evitado é o caso em que o cálculo é realizado no início dos buffers na proximidade do horário de início. Nesse caso, não há elementos suficientes disponíveis para o cálculo. No entanto, devido à definição do PM, nós podemos assumir que os valores anteriores aos horários de início são definidos como um, permitindo assim o cálculo da MA sem nenhum atraso. Portanto, a função de suporte se torna a seguinte:

double simpleMA(const int pos, const int avg_positions, const double &data[],int arr_tail_pos){
   double _local_sum = 0;
   for(int i=pos+avg_positions-1; i >= pos;i--){
      if(i > arr_tail_pos){
         _local_sum += 1;  // when requested data exceed buffer limit set trailing 1s
      }else{
         _local_sum += data[i];
      }
           
   }
   return _local_sum/avg_positions; 
}

Com tudo isso, nós podemos finalmente dar uma olhada no núcleo do programa:

//+------------------------------------------------------------------+
//| 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[])
  {
//---
   ArraySetAsSeries(PMOBuffer,true);
   ArraySetAsSeries(closeBuffer,true);
   ArraySetAsSeries(openBuffer,true);
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(time,true);
   
   
   
//--- return value of prev_calculated for next call
   int total = rates_total - prev_calculated;
   double _tmp_sum_close,_tmp_sum_open;
    if(total > 0){
     
      for(int i=total-1;i>=0;i--){  
         if(time[i] >= startingTime){
            if(first_val_checked == false){
               first_val_checked = true;
               first_valid_index = i;
            }
            
            sum_close += close[i];
            sum_open += open[i];
            
            closeBuffer[i] = close[i] *counter / sum_close;
            openBuffer[i] = open[i]*counter / sum_open;
            
            PMOBuffer[i] = simpleMA(i,MA_close,closeBuffer,first_valid_index)-simpleMA(i,MA_open,openBuffer,first_valid_index);
 
            counter++;         
         }   
         else{
            PMOBuffer[i] = 0;
         }    
         
       
      }
 
   }else{
      _tmp_sum_close = sum_close +close[0];
      _tmp_sum_open = sum_open + open[0];
      closeBuffer[0] = close[0] *counter / _tmp_sum_close;
     
      openBuffer[0] = open[0] *counter / _tmp_sum_open;
  
      PMOBuffer[0] = simpleMA(0,MA_close,closeBuffer,first_valid_index)-simpleMA(0,MA_open,openBuffer,first_valid_index);
   }
   return(rates_total);
  }
//+------------------------------------------------------------------+


Experimentos com o EURUSD

Aqui, nós fornecemos alguns resultados e comentários sobre os experimentos obtidas com a execução do PMO no gráfico EURUSD. Dois tópicos principais serão discutidos:

  1. Aspectos de negociação relacionados ao uso do PMO
  2. Análise do valor do PMO

Aspectos de negociação

Como a figura exibe, há uma forte semelhança entre o PMO e o RSI: os dois sinais quase se coincidem. No entanto, também existem algumas diferenças. Nas proximidades das principais reviravoltas de setembro. No dia 12 de setembro de 2019 (em conjunto com algumas comunicações oficiais do Banco Central Europeu), o leitor atento pode observar um "M" Padrão de Merril no PMO com o ombro esquerdo mais alto que o direito, exatamente o oposto do que acontece no sinal RSI e no preço subjacente ao EURUSD. Isso se deve ao fato de que o aumento de preço ocorreu em setembro, no dia 12, sendo relativamente superior ao valor de CMA observado no dia seguinte. Essa informação pode ter sido útil para assumir uma posição vendida após o segundo topo.

A semelhança com o RSI nos permite considerar reversões em torno de topos e fundos como condições de sobrecompra e sobrevenda, e, portanto, como um sinal inicial da estratégia de negociação. Embora o PMO não seja delimitado como o RSI, o cruzamento direto da linha central zero pode ser considerado como uma confirmação adicional da tendência. Como dito na introdução, o uso combinado de vários sinais ao mesmo tempo pode ser uma boa prática para o sucesso da negociação.


Fig. 1

Fig. 1: Semelhanças entre o PMO(3,21) e RSI(14).


Agora, nós podemos esboçar um conjunto muito básico e simplificado de regras IF THEN para negociação com o PMO, deixando as estratégias mais sofisticadas para o desenvolvimento futuro de experts baseados no PMO.

  • SE reversão positiva abaixo da linha zero, ENTÃO aviso antecipado de COMPRA
  • SE reversão negativa acima da linha zero ENTÃO aviso antecipado de VENDA
  • SE cruzamento para cima da linha zero ENTÃO recomendação de COMPRA
  • SE cruzamento para baixo da linha zero ENTÃO recomendação de VENDA

A resposta rápida às condições de mudança do mercado é um fator-chave para o sucesso da negociação: quando uma MA é usada, quanto mais suave o sinal, maior o atraso. Ao usar o PMO(m, n), m é responsável pelo atraso do oscilador, enquanto n está relacionado ao atraso no cruzamento da linha central. Obviamente, a resposta mais rápida com o PMO é obtida com o PMO(1,1), o que significa que calculamos a diferença entre os dois PMs sem nenhuma média. Uma boa configuração seria usar o PMO(1, n), com n pequeno (por exemplo, 5), que garante a resposta mais rápida e cruzamentos a partir da linha zero não muito atrasados.


Análise dos valores do PMO

Agora é interessante examinar a distribuição dos valores do PMO em torno da linha central zero. O PMO, conforme definido neste artigo, não é delimitado como o RSI; portanto, pode ser interessante analisar a probabilidade do valor de PM estar acima ou abaixo de certos limites.

A figura abaixo mostra os resultados obtidos com a execução do PMO(3,21) no gráfico EURUSD com o período gráfico H1 nos primeiros 8 meses de 2019. Os valores do PMO são centralizados em torno de zero, de acordo com uma distribuição em forma de sino. A ligeira inclinação à esquerda deve-se provavelmente ao excesso de condições vendidas acumuladas pelo EURUSD nos últimos meses. No entanto, a predominância de simetrias em torno de zero permite inferir que existe um equilíbrio geral entre movimentos vendidos e comprados.


Fig. 2

Fig. 2: Distribuição dos valores de PMO(3,21) semelhantes a uma curva em forma de sino. Suponhamos um modelo estatístico quasi-gaussiano que possa ser útil para fins de previsão.


Outro aspecto a ser levado em consideração é a relação entre o PMO e as médias móveis calculadas diretamente nos sinais de preço de fechamento e de abertura, em vez de suas contrapartes do PM. Conforme relatado na figura abaixo, foi encontrada uma forte correlação com o coeficiente de determinação R² próximo à unidade. Isso significa que trabalhar com os sinais de PM não distorce os sinais subjacentes. Ao mesmo tempo, trabalhar com os sinais de PM tem a vantagem de comparar resultados provenientes de diferentes fontes (por exemplo, outros pares de moedas) devido à normalização operada pelo cálculo de PM.

Fig. 3

Fig. 3: Correlação observada entre o PMO(3,21) e sua versão não normalizada. A forma quase linear obtida sugere que a normalização empregada no PMO não fornece grande distorção na interpretação dos sinais subjacentes ao preço de abertura e fechamento. 


Conclusão & trabalhos adicionais


Neste artigo, eu apresentei o Oscilador Pivô Médio (PMO), uma implementação da média móvel cumulativa (CMA) como um indicador de negociação para as plataformas MetaTrader, com base no novo conceito de Pivô Médio (PM). O oscilador proposto mostrou-se semelhante a outros osciladores conhecidos como o RSI ou MACD, mas com algumas peculiaridades derivadas do uso do CMA. Muito trabalho ainda precisa ser realizado em termos de desenvolvimento adicional, como: variantes baseadas em outros tipos de médias ou, por exemplo, experts que usam informações provenientes dos valores da distribuição estatística em torno da linha central zero do PMO.

O leitor é incentivado a realizar seus próprios experimentos usando os arquivos anexados.


Arquivos anexados

Arquivo Descrição
 PMO.mq4  Código fonte em MQL4 do PMO, conforme usado neste artigo.
 PMO_logger.mq4  Código fonte em MQL4 do PMO com recurso de função de log para análise de dados. Dois parâmetros de entrada adicionais são implementados: data_logging (flag true/false) e filename (string).
 PMO.mq5  Código fonte em MQL5 do PMO.
 PMO_logger.mq5  Código fonte em MQL5 do PMO com recurso de função logarítmica para análise dos dados. Dois parâmetros de entrada adicionais são implementados: data_logging (flag true/false) e filename (string).