Métodos Simples de Previsão das Direções das Velas Japonesas (Candles)

Evgeniy Logunov | 2 outubro, 2015

Introdução

Velas japoneses representam uma das maneiras de exibir as informações sobre os preços ao longo de um determinado período de tempo, mostrando a correspondência entre abertura, fechamento, mínima e máxima dos preços (Open, Close, High e Low), são usadas principalmente na análise técnica e interpretadas de acordo com os modelos bem conhecidos.

Depois de escrever vários indicadores para prever a direção do movimento do mercado, eu vim com uma idéia de analisar a possibilidade de fazer uma previsão básica da direção da velas japonesas (candles), com base nos dados disponíveis sobre a das velas anteriores.

O artigo trata de alguns métodos de previsão simples e introduz várias EAs para testar as idéias e avaliar a eficácia.

Atenção! Os Expert Advisors anexados ao artigo são destinados para uso apenas no Testador de Estratégia.

O primeiro método baseia-se no pressuposto de que a direção da próxima vela coincide com a direção do antecedente. O segundo método assume que a direção próxima será o contrário da anterior. A vantagem destes métodos residem na sua simplicidade. Vamos analisá-los na seção "Métodos ingênuos".

O terceiro método é uma combinação dos dois primeiros. Em primeiro lugar, nós escolhemos o primeiro ou o segundo método e é então utilizado, a menos que a previsão parece ser diferente da realidade (no caso de um erro ter sido detectado). Neste caso, o método que está em utilização é substituído pelo outro. Este método é mais complexo do que os dois primeiros, uma vez que leva em consideração erros que ocorreram nas fases anteriores. Vamos, portanto, avaliar esse método na seção "Método Adaptativo".


Dados Básicos para Previsão

Todos os métodos em apreço repousam sobre a direção da vela anterior, portanto devemos primeiro pensar numa maneira de obter a informação sobre a direção de qualquer vela.

O termo "direção do candle" será usado para se referir ao valor que caracteriza o sinal da diferença entre a abertura e fechamento de determinado preço da vela. Em vista disso a direção de qualquer vela pode assumir um dos três valores - "direção para cima", "direção para baixo" e "sem direção".

Informações sobre as aberturas e fechamentos dos preços das velas (candles) podem ser acessadas usando os arrays Open e Close, respectivamente. Estes arrays usam deslocamentos como índices, um deslocamento é o número de uma vela contado a partir do lado direito do gráfico, começando com zero, isso significa que o deslocamento da vela é zero, enquanto que o deslocamento da vela anterior anterior é um.

// Obtendo a direção do candle
double GetCandleDirection(int shift) {
   double diff=Close[shift]-Open[shift];
   if (diff>0.0) {
      return (DIRECTION_UP);
   }
   else if (diff<0.0) {
      return (DIRECTION_DOWN);
   }
   else /*if (diff==0.0)*/ {
      return (DIRECTION_NONE);
   }
}

A função recebe o deslocamento da vela e calcula a diferença de sua abertura e as cotações de fechamento. Dependendo, sobre o sinal do valor da figura resultante, a função devolve o valor de uma das três constantes, DIRECTION_UP, DIRECTION_DOWN ou DIRECTION_NONE. Essas constantes correspondem a "direção para cima", "direção para baixo" e "sem direção", respectivamente.

Observe que todos os métodos de previsão sob consideração podem originar uma situação especial: se a direção da vela anterior não pode ser determinada (a GetCandleDirection (1) chamada retorna o valor da DIRECTION_NONE), a direção da próxima vela também será indeterminada como resultado da previsão, nestes casos os Expert Advisors escritos para testar os métodos não entram no mercado.

Note que os valores das constantes utilizadas para indicar as diferentes direções, devem ser definidas de modo a não causar dificuldades ao calcular a direção oposta. A mudança de sinal pode servir como um dos meios de cálculo da direção oposta. Estas constantes podem então ser definidas da seguinte forma:

// Determinar as possíveis direções da vela
#define DIRECTION_NONE 0
#define DIRECTION_UP 1
#define DIRECTION_DOWN -1

Vamos providenciar uma saída separada das instruções da vela no gráfico, usando o indicador CandleColor.mq4 anexado ao artigo. O indicador mostra as direções dos candles (os histogramas azul e vermelho), bem como uma média móvel simples com base nos dados sobre as direções, permitindo ter uma idéia geral das velas prevalecendo ao longo de um determinado período de tempo.


Direções dos Candles: comportamento ao longo do tempo.

Como mostrado pelo indicador, as direções dos candles muitas vezes mudam, alternando ou permanecendo as mesmas por algumas velas numa linha. Claramente, a previsão da direção, mesmo uma única vela, é uma tarefa desafiadora.

Vamos agora avançar para a consideração e análise detalhada dos métodos propostos.


Métodos Ingênuos

Vamos começar com os dois primeiros métodos:

  1. A direção da próxima vela irá coincidir com a direção da anterior.
  2. A direção da próxima vela será oposta a anterior.

Para testar a eficácia de ambos os métodos, um Expert Advisor (o arquivo CandlePredTest_naive.mq4 anexado ao artigo) foi desenvolvido e testado.

O Expert Advisor usado na abertura de preços, a cada nova barra, ele fecha todas as posições que foram abertas mais cedo (Take Profit ou Stop Loss) e abre uma posição de acordo com a direção hipotética da próxima vela (agora aberta). A previsão da próxima vela é realizada pela função ModelPredict:

// Previsão com base no modelo atual
int ModelPredict() {
   if (modelState==STATE_NORMAL) {
      return (GetCandleDirection(1));
   }
   else /*if (modelState==STATE_REVERSE)*/ {
      return (-GetCandleDirection(1));
   }
}

A função implementa dois métodos de previsão, A escolha do método depende do valor da variável ModelState.

Se a variável ModelState assume o valor STATE_NORMAL, a previsão vai seguir o primeiro método, chamando a função GetCandleDirection(1) para a direção da vela anterior e retornando o valor obtido, como a direção da vela posterior.

O segundo método de previsão, a variável ModelState assume o valor STATE_REVERSE, onde o cálculo da direção oposta é feito através da mudança de sinal, ou seja, a função ModelPredict devolve o valor da GetCandleDirection (1).

A função ModelPredict não utiliza a comparação expressa com a constante STATE_REVERSE referente ao segundo método. No código do Expert Advisor, presume-se que os dados inseridos pelo usuário são sempre corretos e a variável ModelState assume sempre um dos dois valores: STATE_NORMAL ou STATE_REVERSE. A comparação expressa pode ser ativada através da remoção dos suportes de comentário "/*" e "*/", a partir do corpo da função, adicionando assim um outro operador de condicional if para o código.

Apesar da variável ModelState está ausente na lista de parâmetros do Expert Advisor, o seu valor é copiado da variável externa initialModelState ao anexar o Expert Advisor:

// estado do modelo
extern int initialModelState=STATE_NORMAL;

Esta complicação adicional do código ocorre porque o número de estados pode aumentar ainda mais, embora nem todos esses estados sejão autorizados no início da operação. Você pode usar quaisquer valores como indicações de estados. Por exemplo, no Expert Advisor analisado, eles são definidos da seguinte forma:

// Definindo os estados do modelos
#define STATE_NORMAL 0
#define STATE_REVERSE 1

O código restante do Expert Advisor é fornecido com observações muito detalhadas e não deve ter qualquer dificuldade ao leitor.

As condições para testar o Expert Advisor são mostradas abaixo:

Os critérios nos quais os resultados foram comparados são: lucro líquido e percentual de negócios rentáveis.

As duas tabelas a seguir demonstram os resultados do teste no modo STATE_NORMAL (primeiro método).

Lucro líquido:


M1 M5 M15 M30 H1 H4 D1
USDCHF -9902 -9900 -9903 -9907 -9901 -9900 -9927
GBPUSD -9868 -9864 -9869 -9887 -9873 -9868 -9924
EURUSD -9921 -9957 -9949 -9941 -9934 -9910 -9879
USDJPY -9900 -9905 -9900 -9905 -9935 -9926 -9904
AUDUSD -9952 -9957 -9966 -9962 -9961 -9956 -10000
USDCAD -9901 -9903 -9901 -9900 -9902 -9904 -8272
EURGBP -9862 -9861 -9864 -9869 -9875 -9871 -5747
EURCHF -9862 -9865 -9865 -9874 -9869 -9862 -5750
EURJPY -9866 -9877 -9964 -9877 -9869 -9867 -10000
GBPJPY -9848 -9841 -9840 -9845 -9848 -9870 -9849
GBPCHF -9891 -9885 -9850 -9844 -9857 -9856 -9891
EURAUD -9865 -9863 -9868 -9874 -9861 -9891 -10000


Percentagem dos negócios rentáveis:


M1 M5 M15 M30 H1 H4 D1
USDCHF 19.55 27.82 31.50 38.18 39.86 43.29 43.95
GBPUSD 21.18 27.81 30.29 33.81 35.20 41.39 46.71
EURUSD 26.06 33.20 34.59 37.55 41.64 43.73 44.37
USDJPY 19.28 31.68 34.13 35.48 39.04 42.99 46.85
AUDUSD 19.71 21.30 26.25 27.20 33.15 39.96 44.69
USDCAD 21.88 25.13 27.59 31.79 33.07 39.48 46.40
EURGBP 21.78 28.90 31.49 34.55 35.24 42.11 47.04
EURCHF 28.70 27.86 27.85 31.13 32.90 39.08 47.65
EURJPY 23.69 30.62 35.81 38.89 39.06 44.04 48.16
GBPJPY 10.11 19.47 33.48 37.39 37.75 43.09 47.42
GBPCHF 23.17 23.95 30.84 33.50 36.03 42.43 47.90
EURAUD 1.65 7.35 16.55 22.24 27.65 36.11 44.64

O teste do primeiro método mostrou resultados pobres. Independentemente do período, vemos perda do depósito em todos os instrumentos. O número de negócios rentáveis aumenta em intervalos de tempo maiores, mas nunca superior a 50%.

As duas tabelas a seguir demonstram os resultados do teste do Expert Advisor no modo STATE_REVERSE (segundo método).

Lucro líquido:


M1 M5 M15 M30 H1 H4 D1
USDCHF -9900 -9912 -9902 -9917 -9915 -9901 +83
GBPUSD -9864 -9866 -9869 -9874 -9870 -9911 -5565
EURUSD -9920 -9917 -9923 -9947 -9922 -9886 +4249
USDJPY -9906 -9901 -9906 -9900 -9900 -9928 +2003
AUDUSD -9955 -9956 -9957 -9956 -9969 -9947 +1203
USDCAD -9900 -9900 -9900 -9900 -9901 -9906 -3129
EURGBP -9868 -9862 -9862 -9863 -9867 -9902 -9867
EURCHF -9863 -9861 -9863 -9862 -9869 -9869 -6556
EURJPY -9861 -9864 -9866 -9868 -9897 -9886 -10000
GBPJPY -9850 -9887 -9905 -9857 -9969 -9848 -9964
GBPCHF -9846 -9841 -9842 -9842 -9886 -9914 -9850
EURAUD -9870 -9866 -9874 -9910 -9872 -9872 -2411


Percentagem dos negócios rentáveis:


M1 M5 M15 M30 H1 H4 D1
USDCHF 18.38 27.41 33.76 37.46 42.28 46.71 52.15
GBPUSD 18.59 27.71 34.07 39.01 43.79 47.33 49.39
EURUSD 23.37 33.88 41.05 43.80 43.56 48.16 52.56
USDJPY 16.88 30.39 38.13 40.29 43.94 46.62 49.34
AUDUSD 18.84 22.52 25.39 29.83 36.36 43.51 49.84
USDCAD 22.44 24.04 27.07 31.06 35.69 43.51 49.84
EURGBP 20.52 28.89 35.18 38.82 42.41 45.82 45.55
EURCHF 27.43 31.82 32.80 35.05 36.74 43.89 46.04
EURJPY 18.79 28.15 37.09 39.80 43.05 44.15 46.92
GBPJPY 10.02 19.76 31.92 38.06 41.84 44.32 47.53
GBPCHF 19.87 27.24 33.72 35.70 39.74 47.59 46.11
EURAUD 1.43 7.66 17.24 26.95 34.46 41.29 47.07


Temos resultados mistos ao testar o segundo método. Os resultados em todos os intervalos de tempo, com exceção do D1, foram aproximadamente iguais aos obtidos no primeiro método. A negociação no timeframe D1, teve lucro em quatro instrumentos dos doze. A porcentagem de negociações rentáveis ficou perto de 50%, chegando a 52% em dois casos.

Em geral, os resultados dos testes de Expert Advisor deixam muito a desejar. Vamos tentar usar uma combinação dos métodos ingênuos para cancelar as suas desvantagens.


Método Adaptativo

A essência do terceiro método de previsão é a utilização dos dois métodos ingênuos de previsão, substituindo um pelo outro caso de um erro. Desta forma, este método adapta-se ao comportamento das séries de previsão.

O método foi verificado no Expert Advisor correspondente, arquivo CandlePredTest_adaptive.mq4 anexado ao artigo.

Este Expert Advisor representa uma versão melhorada do Expert Advisor CandlePredTest_naive. Sua principal diferença está que cada previsão anterior é analisada pelos erros em cada nova barra.

// Função de trabalho do Expert Advisor
int start() {
   // posições são abertas uma vez em cada barra
   if (!IsNewBar()) {
      return (0);
   }
   // fechar todas as posições
   TradeClosePositions(DIRECTION_UP);
   TradeClosePositions(DIRECTION_DOWN);
   // atualização do estado de modelo
   if (prediction!=DIRECTION_NONE) {
      ModelUpdate(prediction==GetCandleDirection(1));
   }
   // prever a próxima cor da vela
   prediction=ModelPredict();
   if (prediction==DIRECTION_NONE) {
      return (0);
   }
   // abrir uma posição na posição certa
   TradeOpenPosition(prediction,"");
   return (0);
}

Os erros são analisados somente se o Expert Advisor abriu posições na barra anterior, ou seja, se a previsão não retornou a constante DIRECTION_NONE. Os erros são todos os casos de discrepância entre a previsão e a direção atual da vela fechada, cuja deslocamento torna-se igual abertura da nova barra.

Um método de previsão ingênuo é substituído por um outro que usou a função ModelUpdate e recebe a flag de correção da previsão (prediction == GetCandleDirection (1)) como um parâmetro.

// Atualizar o estado do modelo
void ModelUpdate(bool correct) {
   //Se a previsão estava errada, alterar o estado do modelo
   if (!correct) {
      if (modelState==STATE_NORMAL) {
         modelState=STATE_REVERSE;
      }
      else /*if (modelState==STATE_REVERSE)*/ {
         modelState=STATE_NORMAL;
      }
   }
}

A função analisa a flag de correção da previsão (correct), no caso de um erro substituir o método ingênuo selecionado de previsão, alterando o valor da variável ModelState. O valor inicial da variável ModelState é copiado da variável initialModelState, na inicialização. Não é relevante como o Expert Advisor pode alterar o método de previsão durante o curso da sua operação.

A previsão é de responsabilidade da função ModelPredict, semelhante ao utilizado no Expert Advisor CandlePredTest_naive. Como resultado das mudanças no valor da variável ModelState, a previsão é executada com base nos primeiro e segundo métodos, alternando entre si.

O Expert Advisor foi testado sob as mesmas condições, com uma única exceção, o valor da variável initialModelState que foi fixada como (STATE_NORMAL).

Lucro líquido:


M1 M5 M15 M30 H1 H4 D1
USDCHF -9903 -9905 -9902 -9915 -9902 -9907 -3738
GBPUSD -9866 -9875 -9876 -9864 -9867 -9933 -6404
EURUSD -9924 -9924 -9931 -9920 -9920 -9903 -3779
USDJPY -9904 -9900 -9900 -9904 -9920 -9902 -6493
AUDUSD -9955 -9954 -9955 -9995 -9955 -9965 -8649
USDCAD -9903 -9902 -9901 -9911 -9900 -9904 -1525
EURGBP -9861 -9867 -9865 -9862 -9881 -9877 -9913
EURCHF -9861 -9862 -9872 -9881 -9870 -9875 -9258
EURJPY -9861 -9865 -9866 -9868 -9876 -9905 -9880
GBPJPY -9842 -9844 -9867 -9840 -9919 -10000 -9933
GBPCHF -9841 -9843 -9917 -9840 -9893 -9848 -9895
EURAUD -9866 -9869 -9863 -9872 -9867 -9904 -7656


Percentagem dos negócios rentáveis:


M1 M5 M15 M30 H1 H4 D1
USDCHF 19.22 26.82 32.29 35.71 40.29 44.15 47.93
GBPUSD 20.12 28.16 32.01 34.87 40.05 41.97 49.39
EURUSD 25.24 32.65 38.32 39.48 41.50 45.81 48.88
USDJPY 19.16 29.48 35.02 37.03 40.19 44.45 47.34
AUDUSD 19.63 21.67 25.76 28.16 32.11 41.11 46.76
USDCAD 22.84 24.46 27.39 29.79 34.44 42.26 48.46
EURGBP 21.44 29.45 33.05 36.55 38.19 41.86 46.23
EURCHF 27.51 29.98 30.92 34.44 34.09 40.87 44.27
EURJPY 21.24 28.56 35.58 38.78 40.50 44.23 47.12
GBPJPY 11.30 19.90 31.91 37.15 36.76 41.11 46.24
GBPCHF 22.00 26.81 32.13 34.38 36.99 43.11 47.16
EURAUD 1.50 6.56 15.14 22.25 31.63 37.96 47.70

O teste não apresentou resultados significativamente melhores, comparando o primeiro e o segundo método. O lucro foi negativo para todos os instrumentos em todos os prazos, enquanto o percentual de negócios rentáveis não ultrapassou a 50%.


Conclusão

Os resultados dos testes fornecidos no artigo demonstraram a fraca eficácia dos métodos de avaliação.