Como reduzir os riscos trader

14 fevereiro 2018, 08:21
Aleksandr Masterskikh
1
3 801

Sumário


Introdução

Antes de tudo, este artigo é útil para traders e analistas novatos que trabalham para criar seus próprios sistemas de negociação. Espero que muitas das perguntas também sejam do interesse dos participantes experientes do mercado: classificação dos tipos de risco, aplicação de uma análise de candles para definir áreas de sobrecompra/sobrevenda, relacionamento entre as análises fundamental e técnica, seleção de períodos de cálculo da média móvel, bem como redução de riscos associados a um possível colapso de preços.

O artigo aborda os seguintes tópicos:

  • qual o processo em causa durante a negociação em mercados financeiros e bolsistas em termos de dinâmica;
  • qual a probabilidade de lucro na negociação;
  • formas de reduzir os riscos do trader ao desenvolver um sistema de negociação.

Não tenho a pretensão de realizar uma análise totalmente abrangente ou uma classificação completa dos riscos, na negociação, nos mercados financeiros. Em vez disso, vamos nos concentrar nos principais riscos de mercado associados à dinâmica dos movimentos de preços dos instrumentos financeiros. Além disso, esclareceremos os riscos que não estão diretamente associados à dinâmica do mercado, mas que ainda são importantes para a eficiência comercial. Ao escrever o artigo, usei minha experiência adquirida durante a análise e desenvolvimento de sistemas de negociação.

A versão MQL5 do EA pode ser encontrada aqui.


Quais são os mercados financeiros em termos de dinâmica de processos?

Ao desenvolver estratégias de negociação (tanto para negociação manual quanto automática), devemos entender o processo com o qual estamos lidando. O movimento dos preços nos mercados financeiros é um processo não-estacionário. Ele é influenciado por múltiplos fatores, e muitas vezes é impossível determinar qual deles é que o define.

O caráter não-estacionário do processo é determinado a partir do comportamento dos participantes do mercado - suas reações são multidirecionais. Como resultado, a mudança na amplitude e frequência do mercado não pode ser determinada pelas leis do comportamento determinístico. Por isso, esse processo pode ser considerado aleatório, mas ele não totalmente aleatório.

Contudo, ele tem áreas onde se pode prever o movimento corretamente. Vamos listar os fatores pelos quais essas áreas aparecem.

  • Movimento de preços semelhante a uma onda. Podemos definir o início da onda, por exemplo, pela vela atravessando o grupo de médias móveis ou pelos sinais de indicadores convencionais. Por enquanto, não vamos falar sobre a precisão desta definição. Aqui, só observamos que isso é possível.
  • Surgimento de zonas de consolidação estreitas (o preço sempre as abandona).
  • Algumas regras para responder a certos fatores básicos, fundamentais e técnicos.

Qual a probabilidade de lucrar nos mercados financeiros?

Esta é questão fundamental, uma vez que qualquer trader é de fato um investidor. A probabilidade de lucrar com os mercados financeiros está diretamente relacionada à precisão da previsão quanto à continuação da tendência, uma vez que a principal faixa de movimento está localizada precisamente nas áreas de tendência.

Existem muitos métodos para calcular a continuação ou reversão da tendência. Todos eles têm uma desvantagem geral, já que qualquer sistema de negociação é o modelo que diz respeito ao estado do mercado. Avaliar a precisão de tal modelo é sempre problemático. Porque, em primeiro lugar, o próprio processo é bastante complicado em termos de dinâmica devido ao seu caráter não-estacionário (aleatório). Em segundo lugar, todos os métodos de avaliação da precisão "dentro" do processo aleatório também são complexos e sua eficiência é ambígua.

Portanto, para avaliar a possibilidade de lucro, atravessaremos um outro caminho e usaremos dados reais (em vez de calculados). Para fazer isso, precisamos analisar estatísticas a eficiência da negociação no mercado de moedas e de ações, fornecidas por empresas de investimento e corretagem.

De acordo com os dados fornecidos no artigo "Eficiência do trading privado de moedas na Rússia e nos EUA" (Результативность частного трейдинга на Форекс в России и США), a participação dos traders privados bem-sucedidos ​​na Rússia era de 28%, enquanto nos EUA era de 33%, a partir de 2015. Claro, estes dados não podem ser considerados exaustivos, pois, no estudo, foi incluído um número limitado de empresas e o período de estudo foi de apenas seis meses. De qualquer forma, esses números nos fornecem alguma visão. Que conclusão podemos tirar disso?

Os métodos convencionais de análise utilizados pela maioria dos participantes no mercado não nos permitem efetivamente prever o processo de movimento de preços nos mercados financeiros. Medidas adicionais, incluindo métodos de gerenciamento de capital, também são ineficientes. A razão para isso está na previsão inicial ineficiente originais da dinâmica do mercado com a ajuda de análise técnica e fundamental. Como resultado, menos de um terço dos traders, no mercado financeiro, recebem lucro.

Quanto ao mercado de ações, as estatísticas não são uniformes. Vou citar dados relativamente "moderados". De acordo com a pesquisa da agência francesa para os mercados financeiros, oito em cada dez traders acabaram por perder seu dinheiro. Isto significa que a eficiência da negociação no mercado de ações é de 20%. Isso é ainda pior do que no mercado Forex, embora o valor seja a mesma coisa.

Como podemos ver, um controle abrangente de riscos é de extrema importância para qualquer investidor.

Podemos destacar dois grupos de riscos principais:

  • riscos associados à dinâmica do movimento dos preços;
  • riscos não associados à dinâmica do mercado.

Veremos mais detalhadamente esses riscos e as formas de reduzi-los.

Começaremos com o primeiro grupo de riscos. Essa lista é determinada com base na análise de gráficos de instrumentos financeiros. Precisamos analisar os elementos e os parâmetros do gráfico, incluindo as características e os grupos das velas individuais, bem como as médias móveis. Não usaremos outros indicadores convencionais, já que seus modelos matemáticos não correspondem ao conceito de movimento de preços, isso os torna ineficientes.


Riscos de mercado associados à dinâmica do movimento dos preços

Tecnicamente, o principal risco do trader é a reversão de tendência. O preço de um instrumento financeiro pode começar a se mover na direção oposta à posição aberta pelo trader. Se a posição ainda não foi aberta, o risco reside na previsão dessa reversão.

Cada trader tem sua própria definição de tendência. Por mais estranho que pareça, não existe uma definição "oficial" para este conceito na análise técnica, o que significa que a avaliação de uma probabilidade de reversão também é subjetiva. Com isso, cada trader define a amplitude crítica (durante uma reversão de tendência) dependendo de um risco aceitável (limite de risco). Esse valor, por sua vez, é definido pelo montante de fundos na conta de cada comerciante. Tudo depende do rebaixamento máximo admissível. Em outras palavras, o que é bom para um banco é ruim para um trader ordinário.

Demos uma olhada nos tipos de risco e procuraremos soluções para reduzi-los.

Classificação dos riscos associados à dinâmica do mercado

A análise tradicional destaca três tipos de tendência por sua duração: a curto, médio e longo prazos.

As tendências locais e globais também são mencionadas. Tradicionalmente, as tendências locais são aquelas formadas no curto ou médio prazos. As tendências globais são formadas no longo prazo. Não há valores claramente definidos que determinem os limites de tempo e amplitude desses conceitos. Tudo é relativo. Portanto, vamos simplificar a análise: a amplitude do movimento oposto deve ser usada como critério do risco associado à reversão da tendência. Nós avaliaremos isso em relação a níveis técnicos importantes ou dependendo do tamanho do depósito do investidor, levando em consideração o limite de risco.

Para classificar os riscos associados à possibilidade de uma reversão de tendência, também é necessário levar em consideração os fatores da dinâmica dos preços de mercado. Vamos examiná-los resumidamente.

  • Riscos associados à alta volatilidade no momento da entrada no mercado.
  • Riscos associados a níveis de resistência durante a entrada no mercado.
  • Riscos de ocorrência na zona de sobrecompra/sobrevenda durante a entrada no mercado.
  • Riscos associados à ausência de uma tendência clara durante a entrada no mercado.
  • Riscos associados à seleção incorreta do período de cálculo do indicador.
  • Riscos associados à utilização de ordens pendentes durante a entrada no mercado.
  • Riscos associados à incerteza da amplitude do movimento dos preços após a entrada no mercado.
  • Riscos associados ao colapso de preços após a entrada no mercado.
  • Riscos associados ao uso de só um timeframe.
  • Riscos associados ao uso de só uma análise (técnica ou só fundamental).

Riscos associados à alta volatilidade no momento da entrada no mercado

Muitos traders não consideram esse tipo de risco. Este é um grande erro, porque a amplitude do movimento (inclusive contra a tendência principal) aumenta durante uma alta volatilidade. Este é o fator de risco.

A avaliação da volatilidade usando indicadores tradicionais é muito subjetiva. Em primeiro lugar, as próprias configurações dos indicadores são subjetivas e, em segundo lugar, seus modelos matemáticos nem sempre são projetados para tal avaliação. Portanto, é mais confiável usar a área de consolidação como um modelo que define o grau de volatilidade necessário ao entrar no mercado.

Para reduzir esse risco, podemos definir a seguinte condição no algoritmo de entrada: limite da amplitude no histórico de cotações mais próximo. Essa faixa de preço pode ser definida:

  • pela amplitude entre dois fractais opostos
  • ou pela amplitude de um grupo de velas.

Limitar as amplitudes da vela é a maneira mais simples. Consideremos o trecho de código em que é realizada:

 //---ALGORITMO DE ENTRADA NO MERCADO - COMPRA (BUY)-------------------------------------------------------------------------------------------
      
  if( 
   //----MINMIZAMOS OS RISCOS ASSOCIADOS À ALTA VOLATILIDADE NO MOMENTO DE ENTRADA NO MERCADO ----
  
     //Simulamos a ausência de elevada volatilidade no histórico mais próximo:
     ( High[1] - Low[1]) <= 200*Point &&                       //limite a amplitude de velas do timeframe mais pequeno (M1)
     ( High[2] - Low[2]) <= 200*Point &&
     ( High[3] - Low[3]) <= 200*Point && 
     (H_prev_m15 - L_prev_m15) <= 300*Point &&                 //limite a amplitude de velas do timeframe maior (M15)
     (H_2p_m15 - L_2p_m15) <= 300*Point && 
     (H_3p_m15 - L_3p_m15) <= 300*Point && 
     (H_prev_m15 - L_3p_m15) <= 300*Point &&                   //limite a amplitude do canal a partir das velas da escala maior (M15)
     (High[1] - Low[1]) >= (1.1*(High[2] - Low[2])) &&         //limite a atividade na barra anterior em relação à 2ª barra no histórico de cotações 
     (High[1] - Low[1]) < (3.0*(High[2] - Low[2])) &&          //o mesmo

Fig. 1. Módulo no algoritmo de entrada: redução ao mínimo dos riscos associados à alta volatilidade no momento da entrada no mercado.

A Fig. 1 mostra o módulo no algoritmo de entrada (Buy).

Notação:

  • High{1], High[2], High[3] — níveis High nas três barras anteriores em M1,
  • H_prev_m15, H_2p_m15, H_3p_m15 — níveis High nas três barras anteriores em M15,
  • Low[1], Low[2], Low[3] — níveis Low nas três barras anteriores em M1,
  • L_prev_m15, L_2p_m15, L_3p_m15 — níveis Low nas três barras anteriores em M15.

O módulo permite reduzir os riscos que surgem se o ponto de entrada estiver numa área de volatilidade considerável. Isto é conseguido através da simulação do canal de preços horizontal, bem como da modelagem da atividade (volatilidade moderada) no final do canal.

Os canais de preços, nos timeframe M1 e M15, são simulados limitando a amplitude das velas nas três barras anteriores, no histórico de cotações. As limitações de amplitude são definidas tanto para velas separadas quanto para todo o seu conjunto. A amplitude do canal é definida como uma diferença entre os valores extremos de sua primeira e última velas.

A volatilidade moderada no final do canal é simulada limitando a proporção das amplitudes de duas velas adjacentes do timeframe M1 (neste caso, a proporção aplicada é de 1,1 a 3,0). Claro, você pode usar outras proporções de amplitude.

A questão é por quê devemos definir a amplitude de todo o canal. Não é suficiente definir a amplitude de todo o canal? Não, não é. Se não definimos a amplitude de todo o canal, pode se formar um canal ondulado (em vez de um horizontal), e sua amplitude pode ser o dobro do tamanho de uma única vela.

Este exemplo é para entrada Buy. Para entrada Sell, o código permanece o mesmo, uma vez que o canal e a amplitude das velas separadas são definidas como a diferença entre High e Low, enquanto a direção é definida em outros módulos de algoritmo de entrada em vez do atual.

Riscos associados à presença de níveis de resistência durante a entrada no mercado

Os participantes do mercado reagem aos níveis de resistência presentes no gráfico de forma diferente. Para alguns, esta é a meta de lucro, para outros - os redutores de perda, e para o terceiro - o objetivo inicial para a quebra de nível. É por isso que os níveis de fractais são freqüentemente cercados por áreas onde o preço se move de forma diferente dentro de uma pequena amplitude. Os riscos de abertura de posição em essas zonas são aumentados e, de acordo com vários resultados de testes de sistemas de negociação, uma previsão dentro deles é ineficiente. Portanto, parece lógico quando um ponto de entrada no mercado está fora dos níveis de resistência, na direção da tendência.

Como podemos levar em consideração esse risco de negociação?

Se a posição já está aberta na direção de um nível de resistência e o preço está se aproximando, é melhor fechar esta posição antecipadamente devido a uma alta probabilidade de uma forte reversão interferindo com o resultado.

Se você abrir uma posição de acordo com o seu algoritmo após o preço ultrapassar o nível de resistência, aguarde um rompimento confiável na direção selecionada.

Na verdade, esta é uma questão de rompimentos falsos e verdadeiros. Uma das possíveis soluções é a seguinte. Aguarde até que um novo nível de resistência seja formado após um nível de fractal. Então, espere até que o preço a quebre este nível. Certifique-se de usar um dos timeframes mais baixos. No entanto, isso também não é suficiente. A dinâmica atual deve demonstrar sinais claros de atividade na direção do rompimento e para além do novo nível de fractal.

A desvantagem desta abordagem é a incerteza do timeframe. Ele é escolhido subjetivamente, porque é impossível prever antecipadamente a amplitude do rompimento do nível. Portanto, simplificamos o problema especificando a condição de que o nível já deveria ser passado no momento da entrada.

Ao desenvolver um sistema de negociação, podemos usar várias opções no algoritmo de entrada para reduzir o risco relacionado à presença de níveis de resistência.

  • Opção 1. Após procurar o fractal de resistência mais próximo (no código, ele é realizado usando um ciclo). A vantagem desta abordagem é que encontraremos o nível real de resistência em dado timeframe. No entanto, existem duas desvantagens. Primeiro, programar os ciclos pode ser difícil para programadores novatos. Em segundo lugar, o fractal pode se revelar muito profundo na histórico, o que significa que, como nível de resistência, é irrelevante.
  • Variante 2. Usar High (para Buy) e Low (para Sell) da vela anterior. Esta abordagem tem duas vantagens. Em primeiro lugar, pode ser facilmente programada. Em segundo lugar, você pode definir vários timeframes simultaneamente, o que equivale a procurar por fractais mais antigos. Desvantagem: alguns fractais podem não ser detectados, já que os extremos das velas são fractais apenas na presença das chamadas sombras.

Para os programadores principiantes, bem como ao desenvolver estratégias manuais, recomendamos aplicar a opção 2: é simples e eficiente devido a certa diminuição na precisão graças à perda de alguns fractais. Aqui está o trecho de código:

 //----REDUZIMOS OS RISCOS RELACIONADOS COM A PRESENÇA DE NÍVEIS DE RESISTÊNCIA NA ENTRADA NO MERCADO-----
  
     //Simulamos a situação quando o preço atual passa pelos níveis de resistência locais:
       Bid > High[1] &&           //em M1 (timeframe mais pequeno)
       Bid > H_prev_m15 &&        //em M15 (timeframe maior)

Fig. 2. Módulo no algoritmo de entrada: redução dos riscos associados à presença de níveis de resistência ao entrar no mercado.

A Fig. 2 apresenta o módulo no algoritmo de entrada que visa reduzir os riscos associados à presença de níveis de resistência para o movimento ascendente, entrada Buy. Isto é conseguido definindo uma condição especificada, em que o preço atual já cruzou o nível de resistência como um High da vela anterior (separadamente em dois timeframes).

Devemos também definir a atividade de movimento. No entanto, para evitar a duplicação de variáveis, isso foi feito em outros módulos (onde a direção e a atividade estão definidas).

Para entrar em Sell, use os níveis Low da vela anterior (nos timeframes M1 e M15) como níveis de resistência, considerando uma tendência de baixa.

Riscos de ocorrência na zona de sobrecompra/sobrevenda durante a entrada no mercado

Esses riscos incluem a probabilidade de entrar no final de um movimento ondulatório ativo quando a amplitude restante na direção de entrada é pequena e a probabilidade de reversão aumenta acentuadamente. Elas são as áreas de sobrevenda/sobrecompra. O uso de indicadores tradicionais (RSI, etc.) para sua definição é muitas vezes ineficiente, em muitos casos seus sinais são falsos. O motivo é o mesmo: os indicadores convencionais não possuem algoritmos matemáticos adequados para determinar essas áreas. Para uma pesquisa mais precisa de áreas de sobrecompra/sobrevenda, você precisa identificar os sinais de uma desaceleração da tendência (inclusive no M1, uma vez que mostra imediatamente a dinâmica das reversões em todos os outros timeframes).

Vamos detectar os sinais de desaceleração, combinando as análises fractal e de vela, de acordo com os seguintes critérios:

  • diminuição da distância (tamanho de amplitude) entre os níveis de resistência fractal vizinhos. Para comparar as amplitudes de duas áreas vizinhas, precisamos de três fractais;
  • aumento da profundidade de correção dentro de uma vela, diminuição do corpo da vela (análise intra-vela);
  • mudança na direção do deslocamento do pivô da vela em relação ao pivô da vela anterior (são necessárias três velas para isso).

Se esse método for usado, a condição de ausência dos fatores listados deve ser adicionada ao algoritmo de entrada. Por exemplo, isso pode ser feito com ajuda de false e true, onde true significa que os fatores de desaceleração especificados estão presentes no mercado.

No entanto, existe uma opção mais simples. Ela não está diretamente relacionado à busca de uma área de sobrecompra/sobrevenda. Um sinal indireto é usado aqui: se você fornecer entrada no mercado no início de um movimento parecido com a onda, a probabilidade de cair numa área de sobrecompra/sobrevenda é muito reduzida. Na verdade, estamos simulando o estágio inicial de uma tendência local.

  • Primeiro, precisamos identificar a interseção de uma ou mais médias móveis (MA) dentro da mesma vela - este é o possível começo de um movimento ondulado. Para confirmar o início da onda, precisamos de condições adicionais (veja abaixo).
  • Em seguida, simulamos a fase inicial do movimento ondulatório. Ela será o início de uma nova tendência. Para alcançar isso, especificamos: direção da vela após o cruzamento; sua atividade; Direção das MA rápidas que participam do cruzamento na barra anterior; a localização do preço atual em relação a essas MA.

Nota: ao simular o estágio inicial de uma tendência local, recomenda-se definir a direção das MAs rápidas somente. Não há necessidade de definir a direção das MAs lentas.

O motivo de uma abordagem tão diferente para as médias móveis é o seguinte: as MA antigas, devido a um maior atraso, não têm tempo de virar na direção da nova tendência. Portanto, se definimos sua direção, o ponto de entrada simulado para o mercado pode estar longe do início da tendência e cair dentro de uma área perigosa de sobrecompra/sobrevenda.

A segunda opção (simulação do estágio inicial da tendência local) é mais simples e, portanto, recomendada para desenvolvedores novatos. Demos uma olhada no trecho de código:

//---REDUZIMOS OS RISCOS RELACIONADOS COM A ENTRADA NO MERCADO NA ZONA DE SOBRECOMPRA-----
  
    //Simulamos a ligação ao início da onda para reduzir a probabilidade da entrada na área de sobrecompra:
     ((MA8_prev > Low[1] && MA8_prev < High[1]) || (MA8_2p > Low[2] && MA8_2p < High[2]) || //início da onda - não mais de três barras no histórico de dados (M1)
     (MA8_3p > Low[3] && MA8_3p < High[3])) &&                                              //o mesmo
      MA5_prev_m15 > L_prev_m15 && MA5_prev_m15 < H_prev_m15 &&                             //início da onda - na barra anterior do timeframe maior (M15)
    

Fig. 3. Módulo no algoritmo de entrada: redução dos riscos á ocorrência numa área de sobrecompra durante a entrada no mercado

Notação:

  • MA8_prev, MA8_2p, MA8_3p — MA com período 8 calculada nas barras 2 e 3 anteriores (respectivamente) no histórico de cotações (M1),
  • MA5_prev_m15, MA5_2p_m15, MA5_3p_m15 — MA com período 5 calculada nas barras 2 e 3 anteriores (respectivamente) no histórico de cotações (M15),
  • os valores extremos das velas já foram especificados (ver Fig.2).

O risco de cair dentro de uma área de sobrecompra é reduzido, ao vincular um ponto de entrada ao início da onda prevista. O fato da vela cruzar a MA é o sinal de início da onda: em M1, ele é a MA com o período de 8, em M15 - MA com o período de 5. O valor dos períodos das médias móveis é escolhido a partir da série Fibo. Consideraremos este parâmetro em mais detalhes na seção "Riscos associados à seleção incorreta do período de cálculo do indicador".

Este módulo não especifica parâmetros que caracterizem a atividade e direção de velas e MAs, bem como a posição do preço atual em relação a MAs. Isso é feito para não duplicar as variáveis. Definiremos esses parâmetros no módulo a partir dos "Riscos associados à ausência de uma tendência clara no momento da entrada no mercado".

Observe que a interseção da vela e do MA no timeframe M1 não está limitada a uma barra no histórico. Ela é definida pelo OU lógico - quer na barra anterior quer na 2ª quer na 3ª do histórico (em M1). No M15, há uma única opção de cruzamento para esse caso - na barra anterior no histórico de cotações. Esse conjunto de potenciais opções permite levar em consideração as diversas situações de mercado real associadas ao desenvolvimento da tendência local em relação a essa interseção.

O exemplo acima foi escrito para entrada Buy (evitamos a zona de sobrecompra). Para a entrada Sell (evitamos a área de sobrevenda), o módulo é o mesmo, já que o algoritmo de cruzamento do MA pela vela não depende da direção do movimento.

Então, vimos duas maneiras de entrar no mercado sem cair nas áreas de sobrecompra/sobrevenda, bem como para encontrar essas áreas. Você pode experimentar esses métodos ao criar seu sistema ou desenvolver indicadores.

Riscos associados à ausência de uma tendência clara durante a entrada no mercado

A ausência de uma tendência claramente visível é mais um fator de incerteza dinâmica relacionado ao risco. Estamos falando de situações em que o mercado é dominado por uma tendência lateral de uma pequena amplitude, ou mesmo de um "flat".

Quando isso acontece, é difícil determinar a direção do preço, porque a mudanças constantes numa faixa estreita. Portanto, o risco de um erro, ao prever uma direção de entrada no mercado, é maior.

A questão é ainda mais complicada, uma vez que os métodos analíticos convencionais não nos fornecem uma definição clara do "flat" (como é o caso com a tendência). Portanto, não existe uma definição do limite entre um "flat" e o início de uma tendência. Os métodos existentes são muito subjetivos, isto tem a ver com o método de desvio quadrado (por exemplo, no indicador StdDev), além de funções adaptativas mais avançadas (por exemplo, a FRAMA). A questão é ainda mais complicada ao lidar com os métodos gráficos da definição da tendência. Aqui, existem tantos traders, quanto tendências. De acordo com diferentes interpretações, vários segmentos de mercado (incluindo aqueles com uma amplitude bastante considerável) são considerados "flat". Isto leva a perda de lucros.

De acordo com a minha experiência pessoal (confirmada pelos resultados da estratégia de negociação), a forma mais eficiente de determinar a borda do "flat" é definir o valor de amplitude absoluta dentro da tendência lateral.

Mas devemos lembrar que, se a amplitude for maior que o valor limite selecionado, isso não significa que estamos testemunhando uma nova tendência! Então não se apresse a abrir uma posição imediatamente. Você precisa confirmar esses dados com a dinâmica atual.

Aplicar valores limite absoluto parece mais promissor do que estimar os valores de amplitude relativa que são muito difíceis de definir nas condições de um processo aleatório não-estacionário. Claro, isso é uma simplificação séria, mas na prática dá bons resultados. Sem isso, você enfrentará um problema sério e cálculos teóricos complexos, uma vez que o limite entre um "flat" e uma tendência é objeto da lógica difusa.

Demos uma olhada no trecho de código (para entrada Buy):

 //---REDUZIMOS OS RISCOS ASSOCIADOS À AUSÊNCIA DE UMA TENDÊNCIA CALRA DURANTE A ENTRADA NO MERCADO------
  
      //Simulamos a direção das velas no timeframe mais pequeno:
      Close[2] > Open[2] &&      //vela ascendente na segunda barra no histórico (M1)
      Close[1] > Open[1] &&      //direção ascendente da vela anterior (M1)
      
      //Simulamos a direção das médias móveis no timeframe mais pequeno:
      MA5_cur > MA5_2p &&  MA60_cur > MA60_2p &&     //MA ascendentes: usamos as médias móveis com períodos 5 e 60 (M1)
      
      //Simulamos a hierarquia das médias móveis no timeframe mais pequeno:
      MA5_cur > MA8_cur && MA8_cur > MA13_cur &&     //formada a hierarquia das três MA no M1 (períodos de Fibo:5,8,13), isto é um sinal indireto de movimento ascendente
      
      //Simulamos a posição do preço atual em relação às médias móveis do timeframe mais pequeno:
      Bid > MA5_cur && Bid > MA8_cur && Bid > MA13_cur && Bid > MA60_cur && //preço atual superior à MA (5,8,13,60) no M1, isto é um sinal indireto de movimento ascendente
      
      //Simulamos a direção das velas no timeframe maior:
      C_prev_m15 > O_prev_m15 &&       //direção ascendente da vela anterior (M15)
      
      //Simulamos a direção das médias móveis no timeframe maior: 
      MA4_cur_m15 > MA4_2p_m15 &&     //MA ascendente com período 4 (M15)
      
      //Simulamos a hierarquia das médias móveis no timeframe maior: 
      MA4_prev_m15 > MA8_prev_m15 &&  //formada a hierarquia das duas MA no M15 (períodos 4 e 8), isto é um sinal indireto de movimento ascendente
      
      //Simulamos a posição do preço atual em relação às médias móveis dos timeframes maiores:
      Bid > MA4_cur_m15 &&            //se o preço atual for superior a MA4 (M15), isto é um sinal indireto de movimento ascendente
      Bid > MA24_cur_h1 &&            //se o preço atual é superior a MA24 (MH1), isto é um sinal indireto de movimento ascendente
      
      //Simulamos a microtendência dentro da vela atual do timeframe mais pequeno, bem como os pontos de entrada:
      Bid > Open[0] &&               //presença de um movimento ascendente dentro da vela atual (M1)
       
     //Simulamos uma atividade suficiente do processo anterior no timeframe maior:
     (C_prev_m15 - O_prev_m15) > (0.5*(H_prev_m15 - L_prev_m15)) &&  //a porção de corpo da vela é mais de 50% da amplitude da vela M15)
     (H_prev_m15 - C_prev_m15) < (0.25*(H_prev_m15 - L_prev_m15)) && //o limite da profundidade da correção é inferior a 25% da amplitude da vela (vela anterior M15)
      H_prev_m15 > H_2p_m15 &&                                       //tendência ascendente nos níveis locais de resistência (duas velas M15) 
      O_prev_m15 < H_prev_m15 && O_prev_m15 > L_prev_m15 &&          //presença de sombra (vela anterior M15) em realação ao preço de abertura desta vela
      
     //Simulamos uma atividade suficiente do processo anterior no timeframe mais pequeno: 
     (Close[1] - Open[1]) > (0.5*(High[1] - Low[1])) &&              //a porção de corpo da vela é mais de 50% da amplitude da vela M1)
     (High[1] - Low[1]) > 70*Point &&                                //vela anterior tem amplitude maior que o limite (obviamente, excluímos o "flat")
     (High[2] - Close[2]) < (0.25*(High[2] - Low[2])) &&             //o limite da profundidade da correção é inferior a 20% da amplitude da vela (segunda vela no histórico de dados M1)
      High[1] > High[2] &&                                           //tendência ascendente nos níveis locais de resistência (duas velas M1)
      Open[1] < High[1] && Open[1] > Low[1] )                        //presença de sombra (vela anterior M1) em realação ao preço de abertura desta vela
      

Fig. 4. Módulo no algoritmo de entrada: redução de riscos associados à ausência de uma tendência clara durante a entrada no mercado.

Notação:

  • Open[1], Close[1] — preços de abertura e fechamento, respectivamente, na barra anterior (M1);
  • MA5_cur, MA8_cur, MA13_cur, MA60_cur — valor da MA na barra atual com períodos 5,8, 13, 60, respectivamente (M1);
  • MA4_cur_m15, MA4_prev_m15, MA4_2p_m15 — valor da MA com período 4 nas barra atual, anterior e na segunda barra, no histórico de cotações, respectivamente (M15);
  • MA8_prev_m15 —  valor da MA com período 8 na barra anterior no histórico de cotações (M15).

Reduzimos esse risco simulando uma tendência claramente definida em dois timeframes (M1 e M15) simultaneamente:

  • velas anteriores na direção da abertura da posição (duas velas em M1 e uma vela em M15);
  • direção das médias móveis (dois MAs em M1, um MA em M15);
  • hierarquia de médias móveis (três MAs em M1 e dois MAs em M15);
  • posição do preço atual em relação às médias móveis - três MAs em M1.

Este "conjunto de medidas" aumenta significativamente a probabilidade de o ponto de entrada da posição estar dentro de uma tendência claramente definida e em dois timeframes ao mesmo tempo. Consequentemente, diminuem as probabilidades de cair dentro da zona de "flat", flutuações aleatórias e outras áreas de tendência pouco claras. E, assim, o risco associado a este fator adverso também diminui.

Este exemplo é para a entrada Buy. Para Sell, é usado o algoritmo oposto - é definido o movimento descendente de velas e MAs, em vez de o ascendente. O ponto de entrada está abaixo das MAs especificadas.

Riscos associados à seleção incorreta do período de cálculo do indicador

Cada trader define o período do indicador, incluindo a média móvel, com base na experiência pessoal. Há quem prefira uma MA com período de 200, há quem goste do período de 50, há outros que seguem a série Fibo. Quer dizer, escolhemos configurações de indicadores específicos (e, antes de mais, o período em que nos interessamos) intuitivamente.

O motivo dessa intuição forçada é que os métodos convencionais de análise não fornecem mecanismos para identificar oscilações moduladas em freqüência num determinado momento no tempo. Isso leva à incerteza ao definir o período do indicador. Claro, existem métodos para a construção de funções adaptativas (Kaufman, FRAMA, etc.), mas seus algoritmos também não levam em consideração a constante mudança na freqüência das flutuações de mercado.

Consideremos uma solução parcial: usamos métodos convencionais de análise, adicionando alguma lógica na definição dos períodos das médias móveis. Aplicaremos alguns fatores constantes relacionados ao tempo. A favor deste princípio surge o fato de que os limites das velas de timeframes grandes são níveis de fractais para movimentos intra-velas, mas somente se essas velas tiverem mechas (sombras). Se não houver mecha, então o movimento pode continuar na próxima vela, sem formação de um fractal.

Comparamos os timeframes e números da série Fibo padrão (similares em magnitude). Como resultado, obtemos a correspondência aproximada entre timeframes e períodos de cálculo da MA:

  • 1 minuto - valor Fibo 1 (minuto, ele é um pivô) mais próximo;
  • 5 minutos - valor Fibo 5 (minutos) mais próximo;
  • 15 minutos - valor Fibo 13 (minutos) mais próximo;
  • 1 hora (60 minutos) - valor Fibo 55 (minutos) mais próximo;
  • 4 horas (240 minutos) - valores de Fibo 3 (horas), 5 (horas), 233 (minutos) mais próximos;
  • 1 dia (24 horas) - valor Fibo 21 (horas) mais próximo;
  • 5 dias (semana de negociação, 120 horas para o mercado Forex) - valores Fibo 89 (horas) e 144 (horas) mais próximos.

Adicionalmente, podemos recomendar uma opção que minimize o atraso da MA:

  • uso de apenas os primeiros números da série em cada timeframe: 1 (pivô), 3, 5, 8, 13;
  • uso de forma complexa: converter no timeframe mais curto usando uma proporção igual à proporção de timeframes. Usar a MA com períodos mínimos permite reduzir o atraso dessas funções.

Como resultado, obtemos um conjunto de MAs para diferentes timeframes (exemplo de uso de quatro timeframes):

  • para M1: MA com os períodos de 5, 8, 13, 55 (ou 60 = 1 hora), 233 (ou 240 = 4 horas);
  • para M15: MA com os períodos de 5, 8, 13, 55 (ou 60 = 4 horas?);
  • para H1: MA com os períodos de 5, 8, 13, 21 (ou 24 = 1 dia), 89, 144 (ou 120 = 5 dias);
  • para D1: MA com os períodos de 5, 8, 13, 21 (ou 24 = 1 mês de negociação).

Claro, este é apenas um conjunto de amostras de MAs. Você pode adicionar seus próprios valores. De qualquer forma, esse princípio de escolha de períodos de MA tem o direito de existir, uma vez que muitos fatores, incluindo o início e o fim das sessões de negociação, a periodicidade das estatísticas, o pagamento de dividendos, etc. têm uma periodicidade claramente definida. Assim, a escolha lógica do período do indicador (neste caso MA) nos permite levar em consideração a frequência dos eventos do mercado e, portanto, reduzir os riscos até certo ponto.

Usaremos essas recomendações na escolha das MAs no desenvolvimento dos outros módulos descritos.

Riscos associados à utilização de ordens pendentes para entrada no mercado

Aqui, estamos falando de estratégias que dependem de ordens pendentes (em vez de a mercado) para definir um nível alvo. Mais frequentemente, as ordens pendentes são usadas em estratégias associadas ao abandono do preço das zonas de consolidação.

Com toda a variedade de tais estratégias, vamos conversar sobre o uso de um par de pedidos pendentes colocados em ambos os lados da zona de consolidação, com a esperança de que uma ordem funcione corretamente e a segunda seja removida imediatamente após a ativação da primeira. Observe que o uso de ordens pendentes para determinar um ponto de entrada está associado a um risco. O nível em que a ordem pendente está definida é sempre definido antes do preço desejado ser atingido. O nível de ordem pendente é definido, por exemplo, em % da amplitude da área de consolidação ou intuitivamente, e isso não tem nada a ver com a dinâmica dos preços reais.

Na verdade, esta é a principal desvantagem das ordens pendentes em comparação com as de a mercado, isto é, a incapacidade de evitar abrir uma posição na presença de fatores negativos no momento da entrada. Após atingir o preço-alvo, a dinâmica do mercado pode se tornar desfavorável para este tipo de ordem pendente, mas a entrada no mercado ainda ocorrerá com uma perda. Como resultado, o trader perde dinheiro.

Portanto, se você ainda quer negociar a partir de níveis fixos específicos, é mais razoável atribuí-los dentro do algoritmo de entrada, em vez de aplicar ordens pendentes padrão. Deve-se entrar no mercado usando níveis fixos somente se a dinâmica necessária tiver sido detectada quando esses níveis são ultrapassados. Isso, claro, é mais complicado do que as ordens pendentes convencionais, uma vez que exigimos um algoritmo adicional para controlar a dinâmica no momento em que o preço atravessa um nível virtual (também são necessárias habilidades de programação para desenvolver esse algoritmo). Mas isso permitirá que você se livre da negociação "as cegas", o que é inevitável na colocação de pedidos pendentes convencionais.

Este método também tem suas desvantagens. Quando o preço atinge o nível requerido, entramos usando o pedido a mercado (não pendente), que será exibido na plataforma da corretora mais tarde do que as encomendas pendentes já colocadas. Se houver muitos pedidos, a probabilidade de atraso na execução é elevada devido à prioridade dos pedidos. No caso de um pico de preço acentuado no momento da entrada, também é possível o deslizamento (slippage).

Assim, devemos escolher entre o risco de entrar "as escuras" usando ordens pendentes e o risco de atraso de execução das ordens de mercado. Ao mesmo tempo, a vantagem de usar um nível virtual é que o sistema pode cancelar automaticamente a entrada, se não houver condições favoráveis ​​adicionais para entrar no mercado quando o nível definido for alcançado.

Minha opinião pessoal: uma vez que o uso de ordens pendentes aumenta o risco, é necessário reduzi-lo ao abandonar tais ordens. Isso se justifica, entre outras coisas, pelo fato de que apenas o mercado determina a amplitude dos movimentos de preços. Nosso único objetivo é corrigir tais movimentos num determinado estágio de desenvolvimento e depois acompanhá-los usando funções analíticas.

Riscos associados à incerteza da amplitude do movimento dos preços após a entrada no mercado

Um erro típico de muitos traders é que são excessivamente viciados em definição de níveis-alvo específicos. Considerando um processo aleatório, não estacionário, do movimento de preços, a amplitude final da tendência é um valor de probabilidade. Como com as ordens pendentes descritas acima, é intuitivo colocar níveis-alvo para fixar lucro (ou seja, para definir o ponto de saída do mercado). Portanto, essa abordagem geralmente leva a perdas.

O algoritmo de saída do mercado deve caracterizar uma função de controlar os sinais de desaceleração (função adaptativa) ou a função para controlar um valor de amplitude fixa em relação a determinados níveis (nível de entrada, máximo atual ou mínimo dentro de uma posição aberta). Também vamos adicionar o controle de limite de risco para a segunda opção - tanto por posição quanto para todo o depósito. Usaremos a última e mais simples versão. Demos uma olhada no trecho de código:

 //MINIMIZAMOS OS RISCOS RELACIONADOS À INCERTEZA DA AMPLITUDE DO MOVIMENTO DE PREÇO NA ENTRADA NO MERCADO 
             
              //Controle do valor do lucro fixo (por posição):
              (Bid > OrderOpenPrice() && (Bid - OrderOpenPrice()) >= 100*Point)                       //condições de saída na área de lucro (Take-Profit sombreado)
                     ||
                     
             //Controle do desvio máximo admissível do preço 
             //do máximo atual depois de entrar no mercado:    
             (shift_buy >= 1 &&                                                                          //deslocamento não inferior a 1 barra do ponto de entrada
             Time_cur > OrderOpenTime() && Max_pos > 0 && OrderOpenTime() > 0 && OrderOpenPrice() > 0 && //existe um máximo atual após a entrada
             Max_pos > OrderOpenPrice() &&                                                               //o máximo atual está na área de lucro
             Bid < Max_pos &&                                                                            //existe um movimento inverso do preço 
             (Max_pos - Bid) >= 200*Point)                                                               //desvio inverso do máximo atual para sair do mercado
                    ||
                      
             //Controle do limite de risco pré-definido (por posição):     
              (Bid < OrderOpenPrice() && (OrderOpenPrice() - Bid) >= 200*Point)                          //condição de entrada na área de perda (Stop-Loss sombreado) 
                    ||
                    
             ////Controle do limite de risco pré-definido (depósito completo):
              (AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0)) )  //se o limite de risco para todo o depósito tiver sido excedido durante a negociação atual

Fig. 5. Módulo no algoritmo de saída: redução dos riscos associados à incerteza da amplitude do movimento de preços após uma entrada no mercado

Notação:

  • OrderOpenPrice() — preço de entrada no mercado;
  • Shift_buy —  deslocamento (em barras em M1) em relação ao ponto de entrada (necessário para definir um máximo dentro de uma posição aberta);
  • Max_pos  — nível do máximo dentro de uma posição aberta;
  • AccountBalance()saldo atual em termos monetários;
  • Depo_first — depósito inicial em termos monetários;
  • Percent_risk_depo — % de perdas máximas admissíveis para todo o depósito.

Esse tipo de risco é reduzido usando as seguintes funções:

  • Controle do lucro fixo por posição é, de fato, um take-profit sombreado.
  • Controle do desvio máximo admissível do máximo atual (para Buy) ou para o mínimo atual (para Sell) depois de entrar no mercado.
  • Controle do limite de risco pré-definido por posição é um stop-loss sombreado.
  • Controle do limite de risco pré-definido para o depósito completo.

Em todos esses casos, controlamos um determinado valor de amplitude em relação aos níveis capazes de alterar seu valor, incluindo o nível de entrada, o máximo dentro da posição aberta e o depósito inicial. Portanto, ao contrário dos níveis alvo bem definidos, neste caso, esses níveis não são níveis fixos.

Consideramos o módulo de amostra no algoritmo de fechamento da posição Buy. Para o módulo Sell, as mudanças ocorrem apenas em parte do movimento. Em vez do máximo atual dentro da posição (Max_pos), será usado o mínimo atual (Min_pos).

Na próxima seção, examinaremos riscos que também levam em consideração a velocidade do preço, o que é especialmente importante quando o preço do mercado colapsa.

Riscos associados ao colapso de preços após a entrada no mercado

Uma das formas perigosas de reversão de tendência local são as quedas e saltos bruscos com uma grande amplitude em pouco tempo. O salto de uma moeda num par sempre significa o colapso de outra. É especialmente perigoso se existe uma posição aberta e a direção do colapso é desfavorável a ela. Neste caso, pode estar completamente perdido um pequeno depósito.

Natureza do problema

  • As taxas de colapsos de preços não deixam tempo para que os participantes do mercado respondam adequadamente.
  • A análise moderna não oferece nenhum mecanismo para identificar estruturas dinâmicas inerentes ao colapso rápido dos preços.
  • Se houver uma posição aberta, os participantes do mercado estão completamente indefesos durante os colapsos de preços. É bastante difícil detectar um colapso num estágio inicial e ainda mais responder a ele, já que o pico do movimento principal é concluído ou o mercado é bloqueado devido ao pânico na cadeia de corretoras e bancos.

Como resultado, os participantes do mercado sofrem grandes perdas. Por exemplo, em 6 de maio de 2010, o índice Dow Jones caiu para 1 000 pontos em 6 minutos, enquanto, segundo estimativas de especialistas, o mercado perdeu cerca de um trilhão de dólares.

O exemplo mais recente (Fig. 6) é o Brexit, que provocou o colapso do GBPUSD em 24 de junho de 2016 por 560 pontos. 473 pontos foram perdidos num minuto:

GBPUSD 24/06/2014

Fig. 6 Colapso do preço do GBPUSD, 24 de junho de 2016.

Existem três razões globais para os colapsos dos preços.

  1. A natureza do próprio mercado. O colapso não é algo estranho, ele é uma manifestação natural da dinâmica do mercado. Entre outras coisas, pode causar mudanças bruscas na taxa de movimento de preços (por exemplo, devido ao crescente número de participantes no mercado, incluindo robôs de negociação). Por exemplo, de acordo com relatórios da mídia, milhares de flutuações ultra-rápidas com duração inferior a um segundo são registradas no mercado de ações dos EUA.
  2. Nível de desenvolvimento de análise. Os métodos para identificar tais manifestações do mercado são imperfeitos. A resposta adequada requer a capacidade de analisar a situação em fracções de um minuto, enquanto timeframes de segundos são uma coisa rara para plataformas de mercado.
  3. Falhas de uma legislação que regula as atividades nos mercados financeiros. Por exemplo, não existem mecanismos legais para combater a manipulação artificial de preços realizada pelos criadores do mercado.

Aqui está um exemplo de como um EA baseado no MACD não tem tempo para reagir a um forte colapso do preço USDCHF:


USDCHF- MACD

Fig. 7. O EA baseado no MACD não tem tempo para reagir ao colapso dos preços do USDCHF em 2 de outubro de 2015

A Fig. 7 mostra que o EA abre duas posições - antes (seta 1) e após (seta 2) o colapso do preço. Não respondeu ao colapso porque simplesmente "reparou" nele.

Assim, se você tem uma posição aberta, existe o risco de perder uma parte significativa do depósito durante um colapso ou de um forte rali. Isso significa que o algoritmo de fechamento da posição deve ter o módulo de proteção especial.

Demos uma olhada no trecho de código:

 if( 
            //MINIMIZAMOS OS RISCOS ASSOCIADOS AO COLAPSO DE PREÇOS APÓS A ENTRADA NO MERCADO----------------------
            
              (Bid < Open[0] && (Open[0] - Bid) >= 100*Point && (Time_cur - Time[0]) <= 20)           //condições de saída (em qualquer zona) durante um colapso do preço (ponto de referência - M1 preço atual da vela aberta)
                     ||
              (Bid < O_cur_m15 && (O_cur_m15 - Bid) >= 200*Point && (Time_cur - Time_cur_m15) <= 120) //condições de saída (em qualquer área) durante o colapso do preço (ponto de referência - M15 preço atual da vela aberta)
                     ||
              ((Time_cur - OrderOpenTime()) > 60 && Close[1] < Open[1] && 
              (Open[1] - Close[1]) >= 200*Point)                                                      //condições de saída em qualquer área durante um colapso de preços (ponto de referência - M1 amplitude da vela anterior)
                     ||

Fig. 8. Módulo no algoritmo de saída: redução de riscos associados ao colapso dos preços após uma entrada no mercado.

O risco de colapso de preços após a abertura de uma posição é reduzido da seguinte maneira.

  • Os limites do desvio reverso do preço (colapso) são definidos em relação ao nível aberto da vela atual separadamente em diferentes timeframes (no nosso caso, estes são M1 e M15). A duração máxima aceitável de tal colapso também é definida.
  • A amplitude do colapso máximo admissível na forma da vela anterior concluída em M1 é definida (uma vez que esta é uma vela de minuto, então também o tempo do colapso é indiretamente especificado).

Assim, o colapso é rastreado tanto no início da vela atual (usando o colapso na vela anterior) quanto no processo de desenvolvimento. Se alguma das condições especificadas aparecer (por OU lógico), a posição é fechada - o risco é minimizado.

O módulo para fechar uma posição de Buy é mostrado neste exemplo. Para fechamento da posição Sell, é necessário considerar o movimento de preços em espelho.

Riscos associados ao uso de só um timeframe

As mudanças nos preços são refletidas de forma diferente nos gráficos de timeframes diferentes. A tendência aparente num timeframe pequeno pode ser apenas uma pequena correção, se considerarmos isso num timeframe maior.

Portanto, devemos analisar a dinâmica dos preços em vários timeframes - um não é suficiente.

Quantos timeframes devem ser usados ​​para análise? A resposta a esta pergunta depende de você. Pessoalmente, uso quatro períodos simultaneamente (em quatro telas) porque:

  • M1: este timeframe é bom para mostrar reversões de tendências (incluindo as globais) e colapsos rápidos do mercado;
  • M15: as velas neste período do gráfico muitas vezes refletem as estruturas dinâmicas das quedas rápidas do mercado, formadas em timeframes pequenos (M1 e M5);
  • H1: as velas neste timeframe são limitadores de tempo naturais (incluindo no cronograma da sessão de negociação, publicação de índices macroeconômicos, notícias, etc.);
  • D1: as velas neste timeframe são limitantes naturais (incluindo dias de negociação dentro da semana).

Eu acredito que esses timeframes formam um conjunto eficiente, pois permitem que você analise com precisão a dinâmica do mercado. Claro, precisamos de uma percepção "volumétrica" ​​dos movimentos, isso é indispensável quando se trabalha nos mercados financeiros.

Uma vez que o uso de um período inevitavelmente aumenta os riscos de negociação, o código do algoritmo de entrada deve incluir a análise de velas, MAs e outros indicadores em relação a vários timeframes.

Riscos associados ao uso de apenas um tipo de análise (técnica ou fundamental)

O movimento dos preços é afetado por muitos fatores. O mercado é um sistema comportamental baseado nos interesses econômicos dos participantes. A análise técnica (baseada em robôs de negociação) usa apenas um tipo de dados - níveis de preços de um instrumento financeiro específico. Por sua vez, a análise fundamental também considera apenas um tipo de dados (por exemplo, um fator macroeconômico específico). Obviamente, essa análise é incompleta, unilateral e, portanto, imprecisa. Seria incorreto analisar apenas os preços sem ter em conta os fatores ligados ao seu movimento ou se concentrar apenas em indicadores fundamentais sem levar em consideração a dinâmica real do preço.

É mais razoável combinar ambos os tipos de análise, uma vez que eles se complementam logicamente entre si. Fatores fundamentais em geral (mas não absolutamente) predeterminam a direção do movimento do preço, enquanto os fatores técnicos o confirmam. Mas o primado de fatores fundamentais em relação aos técnicos não é absoluto.

Às vezes, o mercado é mais sensível a fatores técnicos do que a fundamentais, por exemplo, quando atinge máximos históricos. Um bom exemplo disso é o colapso periódico do bitcoin (às vezes por 20% por dia) imediatamente após atingir uma alta histórica. No entanto, o exemplo com o bitcoin não é inteiramente indicativo, uma vez que a análise fundamental da criptomoedas é problemática devido às especificidades do mercado.

No entanto, no caso de Forex e especialmente de mercado de ações, o impacto da análise fundamental é óbvio. Por exemplo, o colapso do USDCHF (em outubro de 2015) foi provocado pelo banco suíço "desamarrado" a taxa do CHF da do EUR.

Portanto, acredito, não é preciso tentar definir a prioridade de um dos tipos de análise, é melhor usá-los em conjunto. No entanto, há uma questão: como podemos usar a análise fundamental na negociação automatizada considerando que os algoritmos do sistema de negociação aplicam apenas os parâmetros técnicos do mercado?

Podem-se sugeriduas opções para incorporar a análise fundamental na estratégia de negociação.

  • Opção 1. Implementar os parâmetros fundamentais de análise no algoritmo da estratégia de negociação convertendo-os em técnicos (por exemplo, inserindo os dados do calendário econômico após a definição de sua lógica de ação).
  • Variante 2. Limitar manualmente a direção de entrada no mercado dentro de um EA (somente na direção correspondente aos parâmetros fundamentais).

Como podemos ver, usar a análise fundamental na negociação algorítmica é desconfortável, mas este é o caminho certo. A aplicação combinada dos dois métodos na negociação manual é mais simples, e os analistas e traders novatos devem aspirar a isso.


Riscos não associados à dinâmica do mercado

Fatores externos - operacionais, financeiros e legais - também fazem parte do processo de negociação. Eles desempenham um papel igualmente importante na ocorrência de riscos. Portanto, devemos levá-los em conta ao desenvolver sistemas de negociação, se possível.

Definamos uma lista deles.

Classificação dos riscos não associados à dinâmica do mercado

Aqui estão os riscos mais comuns possíveis não relacionados à dinâmica dos preços.

  • Riscos associados à estrutura do sistema de negociação.
  • Riscos associados ao ultrapassamento do limite de perda em relação ao depósito (controle do limite de risco do investidor em relação ao depósito).
  • Riscos associados a mudanças negativas nas condições de negociação.
  • Riscos determinados pela qualidade da conexão ao servidor da corretora.
  • Riscos associados à permissão para negociação automatizada no lado da corretora ou do cliente.
  • Riscos associados às mudanças na legislação dos mercados financeiros.

Veremos mais detalhadamente esses riscos e as formas de reduzi-los.

Riscos associados à estrutura do sistema de negociação

A regra principal: a estrutura do sistema de negociação deve levar em consideração a estrutura dos riscos. Ela deve incluir a proteção contra o máximo possível de riscos considerados acima. Isso melhorará a eficiência da negociação.

No entanto, enquanto aumentamos o número de blocos para minimizar os riscos, inevitavelmente aumentamos o número de filtros, já que qualquer método evitando riscos é, de fato, um filtro. Como resultado, enfrentamos a "superfiltração" do algoritmo de entrada do robô de negociação. Ao mesmo tempo, a maioria dos traders acredita que os robôs devem negociar ativamente, abrindo posições, pelo menos, diariamente. Nesse sentido, o trader atua como cliente de um robô, e esse requisito parece bastante lógico do seu lado. No entanto, acredito, isso é incorreto devido à própria natureza do processo.

O algoritmo de qualquer EA simula processos dinâmicos muito complexos que os simplificam inevitavelmente. Os erros estão relacionados à correspondência incompleta de um determinado modelo com a dinâmica do mercado.

Cada desenvolvedor sabe que há uma relação entre o número de entradas num sistema de negociação e a quantidade de filtragem no algoritmo de entrada. Quanto maior a quantidade de filtragem, menor o número de entradas e vice-versa. Geralmente, à medida que a filtração aumenta, o resultado financeiro melhora. Mas, claro, tudo depende do conteúdo dos filtros. Você precisa encontrar um compromisso entre o número de entradas e o resultado financeiro, ou, mais precisamente, o risco máximo (rebaixamento de depósito) para cada sistema de negociação. Isso é chamado de otimização convencional.

Mas o que é filtração?

Se ela for a separação de um sinal útil de todo o espectro, precisamos de critérios claros para essa utilidade. Critérios esses que a análise convencional não pode fornecer. A ativação de indicadores convencionais dificilmente pode ser chamada de filtração correta de um processo tão complexo como o movimento dos preços. Por exemplo, se aplicarmos as estruturas de onda de Elliott ou padrões de análise técnica para encontrar um sinal útil, perceberemos que eles não são adequados para análise, uma vez que cada trader os determina de forma diferente no mesmo gráfico.

Portanto, a estrutura do sistema de negociação deve reduzir os riscos, classificando os valores críticos dos parâmetros que determinam esses riscos. Mas há muitos riscos, e o grau de filtração cresce juntamente com a quantidade deles. Portanto, ao avaliar a eficiência de um EA individual, o principal não é o número de entradas, mas sim um lucro estável (embora moderado) com um risco aceitável (rebaixamento). Nesse caso, o número de entradas (durante o teste num único instrumento financeiro) pode ser insignificante. O lucro pode ser aumentado pela negociação simultaneamente em vários pares de moedas.

Daí resulta a conclusão:

O número de posições a serem abertas é um fator secundário na avaliação da qualidade do EA. A principal coisa é a estabilidade relativa ao fazer lucro.

A eficiência de um sistema de negociação deve ser avaliada em vários instrumentos financeiros. Isso melhora a qualidade da simulação e o resultado final:

  • uma estratégia de negociação é testada numa variedade de manifestações da dinâmica do mercado;
  • no caso de um resultado positivo em vários instrumentos, o lucro total no depósito cresce satisfazendo a demanda do investidor pela quantidade de lucro.

Assim, a otimização de uma estratégia de negociação deve ser reduzida à seleção de configurações que mostram lucro, quando se testa em diversos instrumentos financeiros.

Riscos associados ao ultrapassamento do limite de perda em relação ao depósito

Mesmo antes da negociação, é necessário estabelecer um limite no risco de depósito de negociação. Ele pode ser um montante fixo e absoluto (em termos monetários) ou relativo (em % do montante inicial de depósito). Após ele ser atingido, a negociação é interrompida.

Se você confiar a um trader mais experiente no gerenciamento de sua conta, é necessário definir o limite de risco no contrato.

Se você negociar por conta própria, precisa adicionar o código ao algoritmo de entrada (desativar a entrada se o limite de risco for excedido), bem como ao de fechamento de posição (discutimos isso anteriormente em "Riscos associados à incerteza da amplitude de movimento de preços após a entrada no mercado). O controle duplo do depósito é necessário porque, em primeiro lugar, o limite do risco no depósito é alcançado quando existe uma posição aberta (isto é corrigido no algoritmo de saída do mercado). Depois disso, precisamos desativar entradas subseqüentes, já que o limite de risco para o depósito já é alcançado (isso é corrigido no módulo antes do algoritmo de entrada no mercado).

Demos uma olhada no trecho de código:

 //CONTROLE DE PARÂMETROS FINANCEIROS RELACIONADOS COM A LIMITAÇÃO DO RISCO TOTAL PARA O DEPÓSITO DO CLIENTE-------------------------------
  
  if(kol < 1) //não há ordens
  {
   if(AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0))//se o limite de risco para todo o depósito tiver sido anteriormente excedido
    {
     Print("Entrada desativada - limite de risco alcançado anteriormente=",Percent_risk_depo, " % para todo o depósito", Depo_first);
     Alert("Entrada desativada - limite de risco alcançado anteriormente=",Percent_risk_depo, " % para todo o depósito=", Depo_first); 
     return;
    }
    
    
   if(AccountFreeMargin() < (1000*Lots)) //se são insuficientes os fundos de margem permitidos para abrir ordens na conta atual
    {
     Print("Fundos de margem insuficientes. Margem livre da conta = ",AccountFreeMargin());
     Alert("Fundos de margem insuficientes. Margem livre da conta = ",AccountFreeMargin());
     return; //...então saímos
    } 
  }     
        
 //-------------- 

Fig. 9. Módulo antes do algoritmo de entrada: redução dos riscos associados ao ultrapassamento do limite de perda em relação ao depósito.

O primeiro bloco gerencia o status de depósito do cliente (variável AccountBalance()). Variáveis ​​personalizáveis:

  • Depo_first — depósito inicial em termos monetários;
  • Percent_risk_depo — limite de perda por depósito (em % do seu valor inicial).

O algoritmo é desencadeado, se as perdas no depósito atingem o valor definido na variável Percent_risk_depo. Ao mesmo tempo, a entrada no mercado é desabilitada, e nós saímos do programa.

O segundo bloco gerencia a margem da conta em que é permitida a entrada no mercado. O algoritmo é disparado quando o volume da margem está abaixo de um certo número de lotes. A entrada no mercado é desativada, e saímos do programa.

Riscos associados a condições de negociação desfavoráveis

Estes podem ser: qualidade das cotações fornecidas pela corretora; expansão do spread ao abrir e fechar uma posição; deslizamento de preços ao executar ordens; atrasos na execução da ordem.

Tudo isso pode afetar fortemente os resultados da negociação (até a perda total do depósito), por isso você precisa monitorar os parâmetros relevantes. Em particular, é necessário rastrear automaticamente os valores do preço, spread, entrada e saída, e depois compará-los com os valores na abertura e fechamento da posição.

Você pode desenvolver esse módulo em seu sistema por conta própria.


Riscos determinados pela qualidade da conexão ao servidor da corretora

A qualidade da conexão com o servidor de negociação depende de dois fatores:

  • se habilitado o servidor de negociação do lado da corretora;
  • se está funcionando a internet no lado do cliente.

O segundo fator pode ser eliminado colocando o terminal do cliente num servidor externo. O primeiro fator é verificado de forma programática, adicionando um código ao algoritmo do sistema de negociação.

Demos uma olhada no trecho de código:

 if(IsConnected() == false) //verificar a conexão principal do terminal do cliente ao servidor da corretora
    {
     Print("Entrada desativada - o servidor da corretora desligado"); 
     Alert("Entrada desativada - o servidor da corretora desligado");
     return;
    } 

Fig. 10. O módulo de redução de riscos relacionados à qualidade de conexão ao servidor da corretora

A Fig. 10 mostra o fragmento de código permitindo monitorar a conexão ao servidor da corretora. Ele precisa ser incorporado no EA antes do algoritmo de entrada. Quando estas condições ocorrem, as posições de abertura são desabilitadas.

Riscos associados à permissão para negociação automatizada no lado da corretora e do cliente

Às vezes, uma estratégia de negociação envia uma ordem para o terminal do cliente, mas não é executada. Adicionalmente, a própria estratégia não pode restringir a negociação. Possíveis razões para isso acontecer:

  • a negociação automatizada está desativada nas configurações do terminal do cliente do lado do cliente;
  • a negociação na conta atual foi desativada pela corretora.

Para eliminar esses riscos, é necessário controlar se a negociação automática é permitida no programa do sistema.

Demos uma olhada no trecho de código:

 if(IsTradeAllowed() == false) //verificar se é possível negociar usando EAs (fluxo da corretora, permissão para operar)
    {
     
     Print("Entrada desativada ou fluxo de negociação da corretora ocupado e/ou o robô não tem permissão para negociar: ", IsTradeAllowed()); 
     Alert("Entrada desativada ou fluxo de negociação da corretora ocupado e/ou o robô não tem permissão para negociar: ", IsTradeAllowed());
     return;
    } 
    
    
    if( !AccountInfoInteger(ACCOUNT_TRADE_EXPERT) ) //verificar as configurações da conta de negociação
    {
     Print("Negociação automatizada desativada para a conta:", AccountInfoInteger(ACCOUNT_LOGIN), "no lado do servidor de negociação"); 
     Alert("Negociação automatizada desativada para a conta:", AccountInfoInteger(ACCOUNT_LOGIN), "no lado do servidor de negociação"); 
     return;
    }
    
    
    if(IsExpertEnabled() == false) //verificar se permitido iniciar EAs no terminal do cliente
    {
     
     Print("Entrada restrita no terminal do cliente, o robô não tem permissões para operar :", IsExpertEnabled()); 
     Alert("Entrada restrita no terminal do cliente, o robô não tem permissões para operar :", IsExpertEnabled());
     return;
    } 
    
    
   if(IsStopped() == true) //verificação da chegada do comando para completar a execução do programa mql4 
    {
     Print("Entrada restrita - ativado o comando para concluir o funcionamento de programas mql4"); 
     Alert("Entrada restrita - ativado o comando para concluir o funcionamento de programas mql4");
     return;
    } 

Fig. 11. Módulo para reduzir os riscos associados à permissão para negociação automatizada no lado da corretora e do cliente.

O fragmento de código acima controla o estado das permissões para negociação automatizada, tanto nos lados do corretor como do cliente.

Riscos associados às mudanças na legislação dos mercados financeiros

Estas são as regras das relações, no setor de mercados financeiros, que afetam direta ou indiretamente os riscos do cliente. Vários países desenvolvem atos legislativos que regulam as relações nos mercados de ações e financeiros. No futuro, muitos riscos associados a várias violações devem diminuir.

EA de amostra que considera alguns dos riscos mencionados

Identificamos e examinamos os riscos relacionados e não relacionados à dinâmica do mercado. Além disso, definimos soluções específicas para reduzi-los.

Os riscos são reduzidos pela inserção de módulos específicos no EA (antes do algoritmo de entrada, bem como nos algoritmos de entrada e saída). Cada módulo gerencia um certo tipo de risco.

Os principais elementos de análise são velas de diferentes timeframes. A dinâmica é analisada tanto dentro das velas (análise de estrutura única) quanto entre elas (análise de grupos estruturais).

Abaixo está um código de um EA simples que oferece soluções para reduzir alguns riscos descritos acima. Observe que, de todos os indicadores convencionais, se aplicam apenas as médias móveis (considerando as limitações acima mencionadas).

O código do EA para cotações de 5 dígitos (ou 3 dígitos para USDJPY):

//+------------------------------------------------------------------+
//|                                                 Reduce_risks.mq4 |
//|                            Copyright 2017, Alexander Masterskikh |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright   "2017, Alexander Masterskikh"
#property link        "https://www.mql5.com/pt/users/a.masterskikh"

input double TakeProfit     = 600;   //take-profit                                    
input double StopLoss       = 300;   //stop-loss                                
input double Lots           = 1;     //número de lotes
input int Depo_first        = 10000; //valor inicial do depósito do clientes em termos monetários
input int Percent_risk_depo = 5;     //risco máximo permitido por depósito (em % do depósito inicial do cliente)
input bool test             = false; //definir: para teste true (o padrão para negociação - false)

//-------------------------------------------------------------------------------------------------

void OnTick(void)
  {
   //---definição de variáveis---
   int f,numb,kol;
   double sl_buy, tp_buy, sl_sell, tp_sell;
   double L_prev_m15, L_2p_m15, L_3p_m15; 
   double H_prev_m15, H_2p_m15, H_3p_m15;
   double O_cur_m15, O_prev_m15, O_2p_m15, C_prev_m15, C_2p_m15;
   double MA4_cur_m15, MA4_prev_m15, MA4_2p_m15, MA5_prev_m15, MA8_cur_m15, MA8_prev_m15, MA8_2p_m15;
   double MA8_cur, MA8_prev, MA8_2p, MA8_3p, MA5_cur, MA5_prev, MA5_2p, MA13_cur, MA13_prev, MA13_2p,  
       MA60_cur, MA60_prev, MA60_2p, MA24_cur_h1;
   double C_prev_h1, O_prev_h1, H_prev_h1, L_prev_h1, H_2p_h1, L_2p_h1;    
   datetime Time_cur, Time_cur_m15; 
   double shift_buy, shift_sell;
   double Max_pos, Min_pos;    
  //--------

   //CONTROLE DE PARÂMETROS TÉCNICOS (ESTADOS E PERMISSÕES) - NO LADO DO TERMINAL DO CORREDOR E DO CLIENTE-------------------------------
   
 if(test==false) //verificar: teste ou negociação (teste - true, negociação - false)
 {//parâmetros que não são verificados ao testar dados históricos---
     
    if(IsConnected() == false) //verificar a conexão principal do terminal do cliente ao servidor da corretora
    {
     Print("Entrada desativada - o servidor da corretora desligado"); 
     Alert("Entrada desativada - o servidor da corretora desligado");
     return;
    } 
    
    
    if(IsTradeAllowed() == false) //verificar se é possível negociar usando EAs (fluxo da corretora, permissão para operar)
    {
     
     Print("Entrada desativada ou fluxo de negociação da corretora ocupado e/ou o robô não tem permissão para negociar: ", IsTradeAllowed()); 
     Alert("Entrada desativada ou fluxo de negociação da corretora ocupado e/ou o robô não tem permissão para negociar: ", IsTradeAllowed());
     return;
    } 
    
    
    if( !AccountInfoInteger(ACCOUNT_TRADE_EXPERT) ) //verificar as configurações da conta de negociação
    {
     Print("Negociação automatizada desativada para a conta:", AccountInfoInteger(ACCOUNT_LOGIN), "no lado do servidor de negociação"); 
     Alert("Negociação automatizada desativada para a conta:", AccountInfoInteger(ACCOUNT_LOGIN), "no lado do servidor de negociação"); 
     return;
    }
    
    
    if(IsExpertEnabled() == false) //verificar se permitido iniciar EAs no terminal do cliente
    {
     
     Print("Entrada restrita no terminal do cliente, o robô não tem permissões para operar :", IsExpertEnabled()); 
     Alert("Entrada restrita no terminal do cliente, o robô não tem permissões para operar :", IsExpertEnabled());
     return;
    } 
    
    
   if(IsStopped() == true) //verificação da chegada do comando para completar a execução do programa mql4 
    {
     Print("Entrada restrita - ativado o comando para concluir o funcionamento de programas mql4"); 
     Alert("Entrada restrita - ativado o comando para concluir o funcionamento de programas mql4");
     return;
    } 
    
 } //parâmetros que não são verificados ao testar dados históricos
 
 
  //Controle de cotações suficientes no terminal para o símbolo utilizado---
      
     if(Bars<100)
     {
      Print("não há suficientes barras no gráfico atual");
      return; 
     }
     
  //Controle da colocação de um EA no timeframe necessário----
  
    if(Period() != PERIOD_M1)
    {
     Print("EA colocado incorretamente - coloque o EA no timeframe  :", PERIOD_M1);
     Alert("EA colocado incorretamente - coloque o EA no timeframe  :", PERIOD_M1);
     return;
    }
 
  //Controle da colocação do EA nos instrumentos financeiros necessários----
  
   if(Symbol() != "EURUSD" && Symbol() != "USDCHF" && Symbol() != "USDJPY") 
     {
     Print("EA colocado incorretamente - instrumento financeiro inválido"); 
     Alert("EA colocado incorretamente - instrumento financeiro inválido");
     return;
    } 
    
    //----------
    
    
  //CONTROLE DE PARÂMETROS FINANCEIROS RELACIONADOS COM A LIMITAÇÃO DO RISCO TOTAL PARA O DEPÓSITO DO CLIENTE-------------------------------
  
  if(kol < 1) //não há ordens
  {
   if(AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0))//se o limite de risco para todo o depósito tiver sido anteriormente excedido
    {
     Print("Entrada desativada - limite de risco alcançado anteriormente=",Percent_risk_depo, " % para todo o depósito", Depo_first);
     Alert("Entrada desativada - limite de risco alcançado anteriormente=",Percent_risk_depo, " % para todo o depósito=", Depo_first); 
     return;
    }
    
    
   if(AccountFreeMargin() < (1000*Lots)) //se são insuficientes os fundos de margem permitidos para abrir ordens na conta atual
    {
     Print("Fundos de margem insuficientes. Margem livre da conta = ",AccountFreeMargin());
     Alert("Fundos de margem insuficientes. Margem livre da conta = ",AccountFreeMargin());
     return; //...então saímos
    } 
  }     
        
 //-------------- 
        
         
  //Valores das variáveis:
 
    L_prev_m15 = iLow(NULL,PERIOD_M15,1);
    L_2p_m15 = iLow(NULL,PERIOD_M15,2);
    L_3p_m15 = iLow(NULL,PERIOD_M15,3);
    H_prev_m15 = iHigh(NULL,PERIOD_M15,1);
    H_2p_m15 = iHigh(NULL,PERIOD_M15,2);
    H_3p_m15 = iHigh(NULL,PERIOD_M15,3);
    
    O_cur_m15 = iOpen(NULL,PERIOD_M15,0);
    O_prev_m15 = iOpen(NULL,PERIOD_M15,1);
    O_2p_m15 = iOpen(NULL,PERIOD_M15,2);
    C_prev_m15 = iClose(NULL,PERIOD_M15,1);
    C_2p_m15 = iClose(NULL,PERIOD_M15,2);
    Time_cur_m15 = iTime(NULL,PERIOD_M15,0);
    
    C_prev_h1 = iClose(NULL,PERIOD_H1,1);
    O_prev_h1 = iOpen(NULL,PERIOD_H1,1);
    H_prev_h1 = iHigh(NULL,PERIOD_H1,1);
    L_prev_h1 = iLow(NULL,PERIOD_H1,1);
    H_2p_h1 = iHigh(NULL,PERIOD_H1,2);
    L_2p_h1 = iLow(NULL,PERIOD_H1,2);
    
    MA4_cur_m15 = iMA(NULL,PERIOD_M15,4,0,MODE_SMA,PRICE_TYPICAL,0);
    MA4_prev_m15 = iMA(NULL,PERIOD_M15,4,0,MODE_SMA,PRICE_TYPICAL,1);
    MA4_2p_m15 = iMA(NULL,PERIOD_M15,4,0,MODE_SMA,PRICE_TYPICAL,2);
    MA5_prev_m15 = iMA(NULL,PERIOD_M15,5,0,MODE_SMA,PRICE_TYPICAL,1);
    MA8_cur_m15 = iMA(NULL,PERIOD_M15,8,0,MODE_SMA,PRICE_TYPICAL,0);
    MA8_prev_m15 = iMA(NULL,PERIOD_M15,8,0,MODE_SMA,PRICE_TYPICAL,1);
    MA8_2p_m15 = iMA(NULL,PERIOD_M15,8,0,MODE_SMA,PRICE_TYPICAL,2);

    MA8_cur = iMA(NULL,PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL,0);
    MA8_prev = iMA(NULL,PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL,1);
    MA8_2p = iMA(NULL,PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL,2);
    MA8_3p = iMA(NULL,PERIOD_M1,8,0,MODE_SMA,PRICE_TYPICAL,3);
    MA5_cur = iMA(NULL,PERIOD_M1,5,0,MODE_SMA,PRICE_TYPICAL,0);
    MA5_prev = iMA(NULL,PERIOD_M1,5,0,MODE_SMA,PRICE_TYPICAL,1);
    MA5_2p = iMA(NULL,PERIOD_M1,5,0,MODE_SMA,PRICE_TYPICAL,2);
    MA13_cur = iMA(NULL,PERIOD_M1,13,0,MODE_SMA,PRICE_TYPICAL,0);
    MA13_prev = iMA(NULL,PERIOD_M1,13,0,MODE_SMA,PRICE_TYPICAL,1);
    MA13_2p = iMA(NULL,PERIOD_M1,13,0,MODE_SMA,PRICE_TYPICAL,2);  
    MA60_cur = iMA(NULL,PERIOD_M1,60,0,MODE_SMA,PRICE_TYPICAL,0);
    MA60_prev = iMA(NULL,PERIOD_M1,60,0,MODE_SMA,PRICE_TYPICAL,1);
    MA60_2p = iMA(NULL,PERIOD_M1,60,0,MODE_SMA,PRICE_TYPICAL,2);
    MA24_cur_h1 = iMA(NULL,PERIOD_H1,24,0,MODE_SMA,PRICE_TYPICAL,0);
    
    kol = OrdersTotal();
    Time_cur = TimeCurrent();
   
 if(kol < 1) //se não houver ordens abertas, continuamos
     {
      
 //---ALGORITMO DE ENTRADA NO MERCADO - COMPRA (BUY)-------------------------------------------------------------------------------------------
      
  if( 
   //----REDUZIMOS OS RISCOS ASSOCIADOS À ALTA VOLATILIDADE NO MOMENTO DE ENTRADA NO MERCADO ----
  
     //Simulamos a ausência de uma volatilidade significativa no histórico mais próximo:
     ( High[1] - Low[1]) <= 200*Point &&                       //restrição da amplitude das velas do timeframe menor (M1)
     ( High[2] - Low[2]) <= 200*Point &&
     ( High[3] - Low[3]) <= 200*Point && 
     (H_prev_m15 - L_prev_m15) <= 300*Point &&                 //restrição da amplitude das velas de timeframes grandes (M15)
     (H_2p_m15 - L_2p_m15) <= 300*Point && 
     (H_3p_m15 - L_3p_m15) <= 300*Point && 
     (H_prev_m15 - L_3p_m15) <= 300*Point &&                   //restrição da amplitude de canal das velas de timeframes grandes (M15)
     (High[1] - Low[1]) >= (1.1*(High[2] - Low[2])) &&         //limite a atividade na barra anterior em relação à 2ª barra no histórico de cotações 
     (High[1] - Low[1]) < (3.0*(High[2] - Low[2])) &&          //o mesmo
  
    
   //----REDUZIMOS OS RISCOS RELACIONADOS COM A PRESENÇA DE NÍVEIS DE RESISTÊNCIA NA ENTRADA NO MERCADO-----
  
     //Simulamos a situação quando o preço atual passa pelos níveis de resistência locais:
       Bid > High[1] &&           // noM1 
       Bid > H_prev_m15 &&        // noM15 
           
    
   //----REDUZIMOS OS RISCOS RELACIONADOS COM A ENTRADA NA ZONA DE SOBRECOMPRA NA ENTRADA NO MERCADO-----
  
    //Simulamos a ligação ao início da onda para reduzir a probabilidade da entrada na área de sobrecompra:
     ((MA8_prev > Low[1] && MA8_prev < High[1]) || (MA8_2p > Low[2] && MA8_2p < High[2]) || //início da onda - não mais de três barras no histórico de dados (M1)
     (MA8_3p > Low[3] && MA8_3p < High[3])) &&                                              //o mesmo
      MA5_prev_m15 > L_prev_m15 && MA5_prev_m15 < H_prev_m15 &&                             //início da onda - na barra anterior do timeframe maior (M15)
      
  
  //---REDUZIMOS OS RISCOS ASSOCIADOS À AUSÊNCIA DE UMA TENDÊNCIA CALRA DURANTE A ENTRADA NO MERCADO------
  
      //Simulamos a direção das velas no timeframe mais pequeno:
      Close[2] > Open[2] &&      //vela ascendente na segunda barra no histórico de dados (M1)
      Close[1] > Open[1] &&      //direção ascendente da vela anterior (M1)
      
      //Simulamos a direção das médias móveis no timeframe mais pequeno:
      MA5_cur > MA5_2p &&  MA60_cur > MA60_2p &&     //MA ascendentes: usamos as médias móveis com períodos 5 e 60 (M1)
      
      //Simulamos a hierarquia das médias móveis no timeframe mais pequeno:
      MA5_cur > MA8_cur && MA8_cur > MA13_cur &&     //formada hierarquia de três MA (períodos de Fibonacci:5,8,13) (sinal indireto de movimento ascendente) M1
      
      //Simulamos a posição do preço atual em relação às médias móveis do timeframe mais pequeno:
      Bid > MA5_cur && Bid > MA8_cur && Bid > MA13_cur && Bid > MA60_cur && //preço atual superior a MA (5,8,13,60) (sinal indireto de movimento ascendente) M1 
      
      //Simulamos a direção das velas no timeframe maior:
      C_prev_m15 > O_prev_m15 &&       //direção ascendente da vela anterior (M15)
      
      //Simulamos a direção das médias móveis no timeframe maior: 
      MA4_cur_m15 > MA4_2p_m15 &&     //MA ascendente com período 4 (M15)
      
      //Simulamos a hierarquia das médias móveis no timeframe maior: 
      MA4_prev_m15 > MA8_prev_m15 &&  //formada a hierarquia de duas MA (períodos 4 e 8) (sinal indireto de movimento ascendente) M15
      
      //Simulamos a posição do preço atual em relação às médias móveis dos timeframes maiores:
      Bid > MA4_cur_m15 &&            //preço atual superior a MA4 (M15) (sinal indireto de movimento ascendente) 
      Bid > MA24_cur_h1 &&            //preço atual superior a MA24 (H1) (sinal indireto de movimento ascendente)
      
      //Simulamos a microtendência dentro da vela atual do timeframe mais pequeno, bem como os pontos de entrada:
      Bid > Open[0] &&               //presença de um movimento ascendente dentro da vela atual (M1)
       
     //Simulamos uma atividade suficiente do processo anterior no timeframe maior:
     (C_prev_m15 - O_prev_m15) > (0.5*(H_prev_m15 - L_prev_m15)) &&  //a porção de corpo da vela é mais de 50% da amplitude da vela M15)
     (H_prev_m15 - C_prev_m15) < (0.25*(H_prev_m15 - L_prev_m15)) && //o limite da profundidade da correção é inferior a 25% da amplitude da vela (vela anterior M15)
      H_prev_m15 > H_2p_m15 &&                                       //tendência ascendente nos níveis locais de resistência (duas velas M15) 
      O_prev_m15 < H_prev_m15 && O_prev_m15 > L_prev_m15 &&          //presença de sombra (vela anterior M15) em realação ao preço de abertura desta vela
      
     //Simulamos uma atividade suficiente do processo anterior no timeframe mais pequeno: 
     (Close[1] - Open[1]) > (0.5*(High[1] - Low[1])) &&              //a porção de corpo da vela é mais de 50% da amplitude da vela M1)
     (High[1] - Low[1]) > 70*Point &&                                //vela anterior tem amplitude maior que o limite (obviamente, excluímos o "flat")
     (High[2] - Close[2]) < (0.25*(High[2] - Low[2])) &&             //o limite da profundidade da correção é inferior a 20% da amplitude da vela (segunda vela no histórico de dados M1)
      High[1] > High[2] &&                                           //tendência ascendente nos níveis locais de resistência (duas velas M1)
      Open[1] < High[1] && Open[1] > Low[1] )                        //presença de sombra (vela anterior M1) em realação ao preço de abertura desta vela
      
        {
        //se as condições - acima mencionadas - do algoritmo de entrada Buy são satisfeitas, realizamos uma ordem de entrada Buy:
        sl_buy = NormalizeDouble((Bid-StopLoss*Point),Digits);
        tp_buy = NormalizeDouble((Ask+TakeProfit*Point),Digits);
        
         numb = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,sl_buy,tp_buy,"Reduce_risks",16384,0,Green); 
         
         if(numb > 0)

           {
            if(OrderSelect(numb,SELECT_BY_TICKET,MODE_TRADES))
            {
               Print("Entrada Buy : ",OrderOpenPrice());   
            }
           }
         else
            Print("Erro ao abrir a ordem Buy : ",GetLastError());
         return;
        }
        
 //--- ALGORITMO DE ENTRADA O MERCADO - VENDA (SELL)--------------------------------------------------------------------------------------------------
    
  if( 
     //----REDUZIMOS OS RISCOS ASSOCIADOS À ALTA VOLATILIDADE NO MOMENTO DE ENTRADA NO MERCADO ----
  
     //Simulamos a ausência de uma volatilidade significativa no histórico mais próximo:
     ( High[1] - Low[1]) <= 200*Point &&                       //restrição da amplitude das velas do timeframe menor (M1)
     ( High[2] - Low[2]) <= 200*Point &&
     ( High[3] - Low[3]) <= 200*Point && 
     (H_prev_m15 - L_prev_m15) <= 300*Point &&                 //restrição da amplitude das velas de timeframes grandes (M15)
     (H_2p_m15 - L_2p_m15) <= 300*Point && 
     (H_3p_m15 - L_3p_m15) <= 300*Point && 
     (H_prev_m15 - L_3p_m15) <= 300*Point &&                   //restrição da amplitude de canal das velas de timeframes grandes (M15)
     (High[1] - Low[1]) >= (1.1*(High[2] - Low[2])) &&         //limite a atividade na barra anterior em relação à 2ª barra no histórico de cotações 
     (High[1] - Low[1]) < (3.0*(High[2] - Low[2])) &&          //o mesmo
  
    
  //----REDUZIMOS OS RISCOS RELACIONADOS COM A PRESENÇA DE NÍVEIS DE RESISTÊNCIA NA ENTRADA NO MERCADO-----
  
     //Simulamos a situação quando o preço atual passa pelos níveis de resistência locais:
       Bid < Low[1] &&           // noM1 
       Bid < L_prev_m15 &&       // noM15 
           
    
  //----REDUZIMOS OS RISCOS RELACIONADOS COM A ENTRADA NA ZONA DE SOBREVENDA NA ENTRADA NO MERCADO-----
  
    //Simulamos a ligação ao início da onda para reduzir a probabilidade da entrada na área de sobrevenda:
     ((MA8_prev > Low[1] && MA8_prev < High[1]) || (MA8_2p > Low[2] && MA8_2p < High[2]) || //início da onda - não mais de três barras no histórico de dados (M1)
     (MA8_3p > Low[3] && MA8_3p < High[3])) &&                                              //o mesmo
      MA5_prev_m15 > L_prev_m15 && MA5_prev_m15 < H_prev_m15 &&                             //início da onda - na barra anterior do timeframe maior (M15)
      
  
  //---REDUZIMOS OS RISCOS ASSOCIADOS À AUSÊNCIA DE UMA TENDÊNCIA CALRA DURANTE A ENTRADA NO MERCADO------
  
      //Simulamos a direção das velas no timeframe mais pequeno:
      Close[2] < Open[2] &&      //vela descendente na segunda barra no histórico de dados (M1)
      Close[1] < Open[1] &&      //vela anterior descendente (M1)
      
      //Simulamos a direção das médias móveis no timeframe mais pequeno:
      MA5_cur < MA5_2p &&  MA60_cur < MA60_2p &&     //MA descendente: usamos a média móvel com período de cálculo 5 e 60 (M1)
      
      //Simulamos a hierarquia das médias móveis no timeframe mais pequeno:
      MA5_cur < MA8_cur && MA8_cur < MA13_cur &&    //formada hierarquia de três MA (períodos de Fibonacci:5,8,13) (sinal indireto de movimento descendente) M1
      
      //Simulamos a posição do preço atual em relação às médias móveis do timeframe mais pequeno:
      Bid < MA5_cur && Bid < MA8_cur && Bid < MA13_cur && Bid < MA60_cur && //preço atual inferior à MA (5,8,13,60) (sinal indireto de movimento ascendente) M1
      
      //Simulamos a direção das velas no timeframe maior:
      C_prev_m15 < O_prev_m15 &&      //vela anterior descendente (M15)
      
      //Simulamos a direção das médias móveis no timeframe maior: 
      MA4_cur_m15 < MA4_2p_m15 &&     //MA descendente com período de cálculo 4 (M15)
      
      //Simulamos a hierarquia das médias móveis no timeframe maior: 
      MA4_prev_m15 < MA8_prev_m15 &&  //formada hierarquia de duas MA (períodos de cálculo 4 e 8) (sinal indireto de movimento ascendente) M1
      
      //Simulamos a posição do preço atual em relação às médias móveis dos timeframes maiores:
      Bid < MA4_cur_m15 &&            //preço atual inferior a MA4 (M15) (sinal indireto de movimento descendente) 
      Bid < MA24_cur_h1 &&            //preço atual inferior a MA24 (MH1) (sinal indireto de movimento descendente)
      
      //Simulamos a microtendência dentro da vela atual do timeframe mais pequeno, bem como os pontos de entrada:
      Bid < Open[0] &&                //presença de um movimento descendente dentro da vela atual (M1)
       
     //Simulamos uma atividade suficiente do processo anterior no timeframe maior:
     (O_prev_m15 - C_prev_m15) > (0.5*(H_prev_m15 - L_prev_m15)) &&  //a porção de corpo da vela é mais de 50% da amplitude da vela M15)
     (C_prev_m15 - L_prev_m15) < (0.25*(H_prev_m15 - L_prev_m15)) && //o limite da profundidade da correção é inferior a 25% da amplitude da vela (vela anterior M15)
      L_prev_m15 < L_2p_m15 &&                                       //tendência descendente nos níveis locais de resistência (duas velas M15) 
      O_prev_m15 < H_prev_m15 && O_prev_m15 > L_prev_m15 &&          //presença de sombra (vela anterior M15) em realação ao preço de abertura desta vela
      
     //Simulamos uma atividade suficiente do processo anterior no timeframe mais pequeno: 
     (Open[1] - Close[1]) > (0.5*(High[1] - Low[1])) &&              //a porção de corpo da vela é mais de 50% da amplitude da vela M1)
     (High[1] - Low[1]) > 70*Point &&                                //vela anterior tem amplitude maior que o limite (obviamente, excluímos o "flat")
     (Close[2] - Low[2]) < (0.25*(High[2] - Low[2])) &&              //o limite da profundidade da correção é inferior a 20% da amplitude da vela (segunda vela no histórico de dados M1)
      Low[1] < Low[2] &&                                             //tendência descendente nos níveis locais de resistência (duas velas M1)
      Open[1] < High[1] && Open[1] > Low[1] )                        //presença de sombra (vela anterior M1) em realação ao preço de abertura desta vela
               
        {
         //se as condições - acima mencionadas - do algoritmo de entrada Buy são satisfeitas, realizamos uma ordem de entrada Sell:
         
         sl_sell = NormalizeDouble((Ask+StopLoss*Point),Digits);
         tp_sell = NormalizeDouble((Bid-TakeProfit*Point),Digits);
         
         numb = OrderSend(Symbol(),OP_SELL,Lots,Bid,3,sl_sell,tp_sell,"Reduce_risks",16384,0,Red);
          
         if(numb > 0)
           {
            
            if(OrderSelect(numb,SELECT_BY_TICKET,MODE_TRADES))
              {
               Print("Entrada Sell : ",OrderOpenPrice());
              }
           }
         else
            Print("Erro ao abrir a ordem Sell : ",GetLastError());
        }
      //--- aqui é o fim do algoritmo de entrada no mercado (Buy,Sell)
      return;
     }
//-- Verificação de ordens abertas e o símbolo do instrumento financeiro para a preparação do fechamento da posição:  

   for(f=0; f < kol; f++)
     {
      if(!OrderSelect(f,SELECT_BY_POS,MODE_TRADES))
         continue;
      if(OrderType()<=OP_SELL &&   //para verificação do tipo de ordem 
         OrderSymbol()==Symbol())  //verificação do símbolo 
        {
         
         if(OrderType()==OP_BUY) //se o tipo de ordem for "Buy", fechamos a posição Buy:
           {
            
   //------ALGORITMO DE FECHAMENTO DA POSIÇÃO BUY------------------------------------------------------------------------------------------------- 
          
         
     //Módulo de busca do máximo do preço existente dentro da posição aberta--------------
         
          //primeiro, definimos a distância entre o ponto atual dentro da posição de aberta para o ponto de entrada no mercado:
             
             shift_buy = 0; 
      
           if(Time_cur > OrderOpenTime() && OrderOpenTime() > 0)                          //se o tempo atual estiver mais longe do que o ponto de entrada...
            { shift_buy = NormalizeDouble( ((Time_cur - OrderOpenTime() ) /60), 0 ); }    //definimos a distância nas barras do timeframe M1 até o ponto de entrada
            
          //agora, definimos o máximo do preço após entrar no mercado:
          
            Max_pos = 0; 
     
           if(Time_cur > OrderOpenTime() && shift_buy > 0) 
            { Max_pos = NormalizeDouble((High[iHighest(NULL,PERIOD_M1, MODE_HIGH ,(shift_buy + 1), 0)]), Digits);}
           
          //o módulo para procurar o máximo do preço dentro da posição aberta termina aqui--  
          
          //Fechamos a posição Buy aberta (opções de OU lógico): 
       
            if( 
            //MINIMIZAMOS OS RISCOS ASSOCIADOS AO COLAPSO DE PREÇOS APÓS A ENTRADA NO MERCADO----------------------
            
              (Bid < Open[0] && (Open[0] - Bid) >= 100*Point && (Time_cur - Time[0]) <= 20)           //condições de saída (em qualquer zona) durante um colapso do preço (ponto de referência - M1 preço atual da vela aberta)
                     ||
              (Bid < O_cur_m15 && (O_cur_m15 - Bid) >= 200*Point && (Time_cur - Time_cur_m15) <= 120) //condições de saída (em qualquer área) durante o colapso do preço (ponto de referência - M15 preço atual da vela aberta)
                     ||
              ((Time_cur - OrderOpenTime()) > 60 && Close[1] < Open[1] && 
              (Open[1] - Close[1]) >= 200*Point)                                                      //condições de saída em qualquer área durante um colapso de preços (ponto de referência - M1 amplitude da vela anterior)
                     ||
                     
            //MINIMIZAMOS OS RISCOS RELACIONADOS À INCERTEZA DA AMPLITUDE DO MOVIMENTO DE PREÇO NA ENTRADA NO MERCADO 
             
              //Controle do valor do lucro fixo (por posição):
              (Bid > OrderOpenPrice() && (Bid - OrderOpenPrice()) >= 100*Point)                       //condições de saída na área de lucro (Take-Profit sombreado)
                     ||
                     
             //Controle do desvio máximo aceitável do preço 
             //do máximo atual depois de entrar no mercado:    
             (shift_buy >= 1 &&                                                                          //deslocamento não inferior a 1 barra do ponto de entrada
             Time_cur > OrderOpenTime() && Max_pos > 0 && OrderOpenTime() > 0 && OrderOpenPrice() > 0 && //existe um máximo atual após a entrada
             Max_pos > OrderOpenPrice() &&                                                               //o máximo atual está na área de lucro
             Bid < Max_pos &&                                                                            //há um movimento inverso do preço
             (Max_pos - Bid) >= 200*Point)                                                               //desvio inverso do máximo atual para sair do mercado
                    ||
                      
             //Controle do limite de risco pré-definido (por posição):     
              (Bid < OrderOpenPrice() && (OrderOpenPrice() - Bid) >= 200*Point)                          //condição de entrada na área de perda (Stop-Loss sombreado) 
                    ||
                    
             ////Controle do limite de risco pré-definido (depósito completo):
              (AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0)) )  //se o limite de risco para todo o depósito tiver sido excedido durante a negociação atual
   
          
              {
               
               if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))     //se o algoritmo de fechamento for processado, realizamos a ordem para fechar a posição Buy
                  Print("Erro de fechamento de posição Buy ",GetLastError());    //caso contrário, imprimimos o erro de fechamento de posição  Buy
               return;
              }
        
           }
           else //caso contrário, passamos para o fechamento da posição Sell:
           {
            
           //------ALGORITMO DE FECHAMENTO DA POSIÇÃO SELL------------------------------------------------------------------------------------
           
           
            //Módulo de busca do máximo do preço existente dentro da posição aberta--------------
         
          //primeiro, definimos a distância entre o ponto atual dentro da posição de aberta para o ponto de entrada no mercado:
             
             shift_sell = 0; 
      
           if(Time_cur > OrderOpenTime() && OrderOpenTime() > 0)                          //se o tempo atual estiver mais longe do que o ponto de entrada...
            { shift_sell = NormalizeDouble( ((Time_cur - OrderOpenTime() ) /60), 0 ); }   //definimos a distância nas barras do timeframe M1 até o ponto de entrada
            
          //agora, definimos o mínimo do preço após entrar no mercado:
          
            Min_pos = 0; 
     
           if(Time_cur > OrderOpenTime() && shift_sell > 0)  
           { Min_pos = NormalizeDouble( (Low[iLowest(NULL,PERIOD_M1, MODE_LOW ,(shift_sell + 1), 0)]), Digits); }
           
          //o módulo para procurar o máximo do preço dentro da posição aberta termina aqui--  
          
          
          //Fechamos a posição Sell aberta (opções de OU lógico): 
           
           if( 
            //MINIMIZAMOS OS RISCOS ASSOCIADOS AO COLAPSO DE PREÇOS APÓS A ENTRADA NO MERCADO----------------------
            
              (Bid > Open[0] && (Bid - Open[0]) >= 100*Point && (Time_cur - Time[0]) <= 20)          //condições de saída (em qualquer zona) durante um colapso do preço (ponto de referência - M1 preço atual da vela aberta)
                     ||
              (Bid > O_cur_m15 && (Bid - O_cur_m15) >= 200*Point && (Time_cur - Time_cur_m15) <= 120) //condições de saída (em qualquer área) durante o colapso do preço (ponto de referência - M15 preço atual da vela aberta)
                     ||
              ((Time_cur - OrderOpenTime()) > 60 && Close[1] > Open[1] && 
              (Close[1] - Open[1]) >= 200*Point)                                                      //condições de saída (em qualquer área) durante o colapso do preço (parâmetro de referência - amplitude a vela anterior M1)
                     ||
                       
           //MINIMIZAMOS OS RISCOS RELACIONADOS À INCERTEZA DA AMPLITUDE DO MOVIMENTO DE PREÇO NA ENTRADA NO MERCADO 
             
              //Controle do valor do lucro fixo (por posição):
              (Bid < OrderOpenPrice() && (OrderOpenPrice()- Bid) >= 100*Point)                         //condições de saída na zona de lucro (take-profit sombreado)
                     ||
                     
             //Controle do desvio máximo aceitável do preço 
             //do mínimo atual após a entrada no mercado:      
             (shift_sell >= 1 &&                                                                         //deslocamento não inferior a 1 barra a partir do ponto de entrada
             Time_cur > OrderOpenTime() && Min_pos > 0 && OrderOpenTime() > 0 && OrderOpenPrice() > 0 && //existe um mínimo atual após a entrada
             Min_pos < OrderOpenPrice() &&                                                               //o mínimo atual se encontra na zona de lucro
             Bid > Min_pos &&                                                                            //existe um movimento inverso do preço 
             (Bid - Min_pos) >= 200*Point)                                                               //valor do desvio inverso do mínimo atual para saída do mercado
                    || 
                      
             //Controle do limite de risco pré-definido (por posição):     
             (Bid > OrderOpenPrice() && (Bid - OrderOpenPrice()) >= 200*Point)                            //condição de entrada na área de perda (Stop-Loss sombreado) 
                    ||
                    
             //Controle do limite de risco pré-definido (depósito completo):
             (AccountBalance() <=  NormalizeDouble( (Depo_first*((100 - Percent_risk_depo)/100)), 0)) )   //se o limite de risco para todo o depósito tiver sido excedido durante a negociação atual 
   
              {
        
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))     //se o algoritmo de fechamento for processado, realizamos a ordem para fechar a posição Sell
                  Print("Erro de fechamento de posição Sell ",GetLastError());   //caso contrário, imprimimos o erro de fechamento de posição  Sell
               return;
              }  
          
           }
        }
     }
//---
  }
//-----------------------------------------------------------------------------------------------------------

Fig. 12. EA de amostra que considera alguns dos riscos mencionados

A estrutura do código do EA considera alguns dos riscos descritos acima e, também, inclui módulos para reduzi-los.

O EA é instalado no M1 e testado em dados de histórico para os seguintes símbolos: EURUSD, USDCHF e USDJPY.

Resultados do teste EURUSD:

test_EURUSD

Fig. 13. Resultados do teste EURUSD.

Um resultado positivo foi obtido ao testar por um ano e meio.

Resultados do teste USDCHF:

test_USDCHF

Fig. 14. Resultados do teste USDCHF.

Um resultado positivo foi obtido ao testar por um ano e meio. No entanto, o número de entradas no mercado não é suficiente.

Resultados do teste USDJPY:


test_USDJPY

Fig.15. Resultados do teste USDJPY.

Um resultado positivo foi obtido ao testar por um ano e meio.

Agora, avaliamos o significado de cada tipo de risco. Para isso, usamos o seguinte procedimento:

  • como parâmetro principal tomamos o lucro líquido obtido pelo EA;
  • definimos a significância de um determinado tipo de risco desativando (separadamente) o módulo apropriado no algoritmo do EA;
  • quanto pior o resultado financeiro, mais importante é esse tipo de risco.

Usamos os resultados do teste EURUSD como um nível, em relação ao qual o impacto de cada módulo é definido. Demos uma olhada no seguinte gráfico:

segnificance_types_risks

Fig.16. Importância dos tipos de risco com o uso do EA anteriormente descrito como exemplo

Fig. 16 notação:

  • NetProfit é o eixo onde é exibido o lucro líquido do EA;
  • A - lucro líquido "em forma reduzida" (todos os módulos de redução de risco estão incluídos);
  • 1 - o módulo de redução de riscos relacionados à alta volatilidade no momento da entrada no mercado está desativado;
  • 2 - o módulo para reduzir os riscos relacionados à presença de níveis de resistência no momento da entrada no mercado é desativado;
  • 3 - o módulo para reduzir os riscos relacionados à queda na área de sobrecompra/sobrevenda no momento da entrada no mercado está desativado;
  • 4 - o módulo de redução de riscos relacionados à ausência de uma tendência claramente definida no momento da entrada no mercado está desativado (o bloco que simula a atividade suficiente do processo anterior);
  • 5 - o módulo para reduzir os riscos relacionados à ausência de uma tendência claramente definida no momento da entrada no mercado é desativado (o bloco que simula a direção das velas e as médias móveis).

A figura mostra que a perda máxima corresponde ao ponto 4. O resultado aqui é várias vezes pior do que em outros pontos do gráfico. Portanto, o componente mais importante da estratégia de negociação é o módulo, onde a atividade do processo é especificada.

Isso significa que o risco mais significativo (pelo menos para o EA dado) é o associado à ausência de uma tendência claramente definida (atividade de processo insuficiente).

Fim do artigo

Nós classificamos os principais tipos de risco - relacionados e não relacionados à dinâmica do mercado. Também descrevemos as formas de reduzi-los e mostramos os algoritmos de implementação de alguns deles. Além disso, examinamos o código de um EA simples que continha alguns desses algoritmos. Testamos o EA em três instrumentos financeiros, nomeadamente, EURUSD, USDCHF e USDJPY. Observe que os resultados foram obtidos sem a otimização do EA. Eu estabeleci os níveis de preços limite aplicados nos módulos com base na minha experiência pessoal.

Além disso, foram oferecidos um conjunto de médias móveis e um método para defini-lo com base nos ciclos de calendário. Eu apliquei esse método ao desenvolver os módulos de redução de risco e o EA como um todo. Também foi apresentado um método que permite aos usuários diminuir um pouco a probabilidade de cair numa área de sobrecompra/sobrevenda (com base na simulação do movimento ondulatório).

Foi obtido um resultado positivo em três instrumentos financeiros, o que, em geral, confirma a correção das abordagens descritas, tanto na classificação de riscos como nas formas de reduzi-los, bem como na determinação da estrutura de um sistema de negociação que leva estes riscos em conta.

A análise realizada mostrou que os sistemas de negociação de tendências que não apresentam simulação de atividade de processo são os mais sujeitos ao risco. É esse o fator que, em maior medida do que o resto, se reflete nos resultados financeiros.

A vantagem do EA acima (e a abordagem descrita para construção da estratégia de negociação) é a ausência de indicadores tradicionais no algoritmo de entrada e saída. Somente são aplicadas as análises de velas e médias móveis (com limitações). Isso diminui significativamente o volume de otimização. Aqui, essa otimização é reduzida à seleção de níveis de limiar, nos quais são acionados os módulos apropriados, bem como a seleção dos períodos da MA da lista de períodos de cálculo disponível (veja a seção "Riscos associados à seleção incorreta do período de cálculo do indicador").

A desvantagem da abordagem descrita é a "sobrefiltragem" do algoritmo de entrada, uma vez que pode haver muitos riscos (e filtros de entrada). O resultado é um número limitado de entradas no mercado. No entanto, isso é parcialmente mitigado pela capacidade de negociar simultaneamente em vários instrumentos financeiros (após testes preliminares).

O objetivo deste trabalho foi criar um EA simples para reduzir os principais riscos e, ao mesmo tempo, apresentar um algoritmo que pudesse ser facilmente entendido pelos traders novatos. Certamente, podemos melhorar significativamente a eficiência do EA, incluindo o algoritmo para analisar os níveis de fractal. No entanto, isso envolve a procura de fractais (incluindo num ciclo, o que complicaria significativamente o código). Eu acredito que o mais importante para os analistas e traders novatos é compreender a estrutura do sistema de negociação (em termos de parâmetros de dinâmica do mercado) antes de aperfeiçoar suas habilidades de programação.

Usando este EA como exemplo, você poderá realizar experimentos desabilitando certos módulos ou alterando seu conjunto dependendo de suas decisões lógicas.

ATENÇÃO! Este EA é uma versão de demonstração simplificada não destinada a negociação real.

As abordagens descritas para reduzir os riscos de mercado podem ser úteis no desenvolvimento de seu próprio sistema de negociação.

A versão MQL5 do EA deste artigo está disponível aqui Reduce_risks

Traduzido do russo pela MetaQuotes Software Corp.
Artigo original: https://www.mql5.com/ru/articles/4233

Arquivos anexados |
Reduce_risks.mq4 (60.14 KB)
test_EURUSD.png (147.15 KB)
test_USDCHF.png (148.42 KB)
test_USDJPY.png (143.03 KB)
Últimos Comentários | Ir para discussão (1)
JuniorFurtado
JuniorFurtado | 21 abr 2018 em 22:32

Artigo muito bom. Está sendo muito útil para o desenvolvimento de meus EAs.

Meus parabéns ao autor.

Criando uma nova estratégia de negociação usando uma tecnologia de resolução de entradas em indicadores Criando uma nova estratégia de negociação usando uma tecnologia de resolução de entradas em indicadores

O artigo sugere uma tecnologia que ajuda todos a criar estratégias de negociação personalizadas, montando um conjunto de indicadores individuais, além de desenvolver sinais personalizados de entrada no mercado.

Seleção automática de sinais promissores Seleção automática de sinais promissores

O artigo analisa os sinais de negociação, para o MetaTrader 5, com execução automática, nas contas dos assinantes. Também é estudado o desenvolvimento de ferramentas para procurar sinais de negociação promissores diretamente no terminal.

Testador de estratégia personalizada com base em cálculos matemáticos rápido Testador de estratégia personalizada com base em cálculos matemáticos rápido

O artigo descreve como criar um testador de estratégias personalizado e um analisador de corridas de otimização próprio. Depois de lê-lo, você vai entender como funciona o modo de cálculos matemáticos e o mecanismo de quadros, como preparar e fazer upload de seus próprios dados para cálculos e usar algoritmos eficientes para comprimi-los. Além disso, este artigo será de interesse para quem deseje saber maneiras de armazenar informações personalizadas num EA.

Geração automática de linhas de suporte e resistência Geração automática de linhas de suporte e resistência

O artigo fala sobre a construção automática de linhas de suporte e resistência atravessando máximos e mínimos locais, nos gráficos de preços. Para determinar estes extremos, é aplicado o popularmente conhecido ZigZag.