Abordagem ideal para desenvolver e analisar sistemas de negociação

5 fevereiro 2021, 15:40
Evgeniy Ilin
0
965

Introdução

Atualmente, o mercado de moedas está se tornando cada vez mais popular, com novos sinais e sistemas de negociação surgindo. Isso é inevitável, já que sempre houve muita gente querendo ganhar dinheiro rápido e fácil. Além disso, com a expansão da infraestrutura da Internet pelo mundo, esse mercado só está se expandindo. Este site é uma prova disso. Provavelmente ele é o maior e mais variado a nível de funções - um sítio onde você pode tanto adquirir um produto e serviço, como contribuir para seu desenvolvimento e ganhar dinheiro. Neste artigo, tentarei ensinar que critérios usar ao selecionar produtos ou sinais de interesse, bem como mostrar que dogmas devem ser seguidos ao construir e usar seus próprios sistemas de negociação.

Minha filosofia

Vou contar um pouco sobre minha motivação e, especialmente, sobre os princípios de minha abordagem para construir sistemas de negociação. Como eu disse, escrevi tantos Expert Advisors diferentes, principalmente, para o MetaTrader 4, porque é mais simples e mais conveniente na minha opinião, embora, é claro, seja melhor se habituar ao MetaTrader 5. Eu costumo transferir alguns sistemas para o MetaTrader 5, e nem sempre faço, porque tudo depende da situação.

Como uma ferramenta para estudar o mercado, o MetaTrader 4 é muito mais simples e rápido, o código é mais fácil de escrever, há menos problemas e, logo, menos erros. É claro que, em termos de funcionalidade, o MetaTrader 5 é muito mais progressivo, não há nada que discutir quanto a isso. Acredito que para entender o mercado é preciso antes de tudo combinar teoria e prática. O MetaTrader 4 fornece a parte prática suficiente na quantidade justa.

Agi de acordo com o princípio: faça da maneira mais simples e rápida possível e, depois, observe o resultado. Se o resultado mostrar algo funcionando, se o resultado lembrar algum tipo de padrão, tento adicionar filtros, aumentar a intensidade do sinal e ver o que dá. Se houver uma melhoria, procuro entender a essência do processo, por que melhora ou piora.

Além disso, é necessário escrever os mais diferentes sistemas e ao mesmo tempo simples para fornecer algo como um pipeline. Afinal, se nos concentrarmos num sistema e mexer nele por meses e anos, dificilmente teremos sucesso. Ao mesmo tempo, supõe-se que quanto mais parâmetros de entrada você tiver e mais código e todo tipos de complexidades, o sistema certamente deve ser mais legal 🙂. Na verdade, tudo é exatamente o oposto.

Às vezes eu escrevia EAs de 2000-3000 linhas de código que não faziam sentido, e às vezes programava código funcional de apenas 20-50 linhas e, curiosamente, funcionava imediatamente com base em todo o histórico e também em várias moedas 🙂. A qualidade do seu conhecimento de mercado realmente faz toda a diferença. Um programador talentoso não é aquele que escreve um Skynet que não funciona, mas, sim, aquele que sabe o que escrever e qual a relevância disso no sistema.

A vantagem dessa abordagem é que quanto mais simples for o sistema na saída, mais fácil será corrigi-lo e modificá-lo. Outro ponto interessante é que a princípio nada funciona, depois, de repente tudo começa a funcionar e você chega a uma explicação lógica, mas o EA na mesma trabalha com uma lógica completamente diferente, incompreensível e que, em alguns casos, leva anos para entender.

No próximo nível, você começa a entender o mercado, aqui quase todos os robôs que você programa se tornam tão simples quanto possível, tão lucrativos e estáveis quanto possível. Eu estou agora neste mesmo nível. Eu sei o que funciona e o que não, quais situações devem ser tratadas e quais não. Após atingir esse nível, você entende que 99 por cento das informações que vagueiam no ambiente de negociação são totalmente absurdas.

Um exemplo disso são os padrões de candles ou os indicadores. O resto das informações, por exemplo, tendências e lateralizações, e outras bobagens com que empaturram você, são tratadas de uma forma que é impossível pó-las em dúvida. Aparentemente, todos esses modelos estão presentes, e se você perder, sempre haverá uma oportunidade de lhe dizer que você não notou algo corretamente, por exemplo, que você não viu que a linha de tendência estava sendo construída incorretamente.

Tire tudo isso da cabeça e comece a pensar no que impulsiona o preço. Além disso, um pré-requisito para que você tenha a chance de encontrar algo é o conhecimento matemático e a capacidade de aplicá-lo, a habilidade de analisar os resultados, encontrar momentos funcionais e compreender sua física. Tudo isso é alcançado apenas pela prática + teoria. No final, tudo dependerá do número de sistemas de negociação escritos e testados por você. Não há necessidade de correr o código de outra pessoa, escreva-o do zero por conta própria. Se alguém pensa que agora vai pegar e codificar o Graal e juntar montes de grana, está enganado. Eu pensei assim por vários anos. Pensar não é saber.


Sinais, Expert Advisors, indicadores

Todas essas ferramentas são projetadas para ajudar um operador ou assinante a negociar Forex, além disso, cada uma delas, se usada corretamente, pode ser útil, algumas até mesmo podem enriquecer você. Nesse sentido, acredito que é muito importante ter um correto entendimento de cada uma delas separadamente, a fim de formar uma visão correta da situação como um todo. O mais importante é entender que qualquer serviço se destina apenas a fornecer um meio, não uma solução. É muito importante entender o que está por trás da etiqueta do preço. Pessoalmente, há muito entendi essas questões e acredito que esse conhecimento ajudará alguém. Outra das minhas motivações é que quero fazer um breve tour para abordar corretamente as ideias sobre o desenvolvimento de sistemas de negociação próprios.

Sinais

Os sinais estão disponíveis para negociação com conta real e de demonstração. Os sinais permitem monitorar sua própria conta de negociação e as de outros traders, bem como assinar sinais e copiar transações de outro operador. Pessoalmente, não recomendo assinar sinais cujo tempo médio de retenção da posição seja inferior a um minuto. Acontece que essas transações são feitas via arbitragem ou scalpers. Em ambos os casos, essas estratégias são muito sensíveis ao ping, e mesmo 10 milissegundos podem ser suficientes para que uma posição seja aberta da maneira errada. Quanto mais longa a duração média da transação, menos diferente da original será esta.

Abaixo está um exemplo de um sinal ruim e um bom:

Sinal seguro:

 

É seguro porque a linha de fundos está o mais próxima possível da linha de equilíbrio, o que significa que: não há transações prolongadas, posições são abertas e fechadas uma de cada vez, não há martingale e grades - podemos ver que o sinal é honesto e estável. Ele é muito semelhante a uma linha reta, com uma pequena carga no depósito e uma alta porcentagem de transações vencedoras.

Próximo sinal:

 

Na verdade, também é um sinal muito bom, mas vale a pena dar uma olhada mais de perto nos grandes picos verdes para baixo que sinalizam que o martingale é usado ativamente. Além disso no início do teste há alguns picos que poderiam realmente jogar fora todo o dinheiro ganho. Não há garantias de que esta situação não volte a acontecer no futuro, se bem que pode dar-se que todo o depósito seja coberto. Não sabemos isso ao certo, é claro, mas existem certos riscos. Apesar disso, o Mercado possui uma seleção muito grande de sinais e, se desejar, você encontrará excelentes opções.

Expert Advisors

Ninguém jamais publicará um Expert Advisor estável e lucrativo no Mercado sem levar em consideração que a venda desse EA trará muito mais do que se apenas seu o autor o usar com calma. Vale a pena dizer que pode existir um segundo cenário em que o próprio autor não tem certeza do sistema e não quer correr riscos, por isso coloca grandes quantias no seu depósito, e negocia o mínimo com riscos mínimos. Para que a compra de um Expert Advisor seja compensada, você precisará de um grande depósito, digamos que, após adquirir um EA por um ano (que presumivelmente trará $ 200 dos $ 100 iniciais) e pagar por ele $ 200, você não vai receber nada mesmo que ele continue operacional.

O lucro previsto deve ser pelo menos várias vezes superior ao preço do EA. Além disso, você deve levar em conta que ninguém lhe dará a garantia de que o desempenho do Expert Advisor permanecerá pelo tempo que você deseja. Vale a pena dizer que um Expert Advisor multimoeda oferece uma vantagem adicional. Acontece que, se um EA trabalha com pelo menos vários pares de moedas, significa que usa a física do mercado. Isso dá quase 100% de garantia de lucro. Como exemplo, vou mostrar o desempenho do meu último sistema e um dos resultados da tabelinha na forma de um teste real.

Primeiro, vou apresentar a tabela geral de teste do EA para os últimos 10 anos do histórico dos principais pares de moedas:


Todos esses resultados são alcançados usando um único arquivo set, sem ajuste com base num par de moedas específico e sem otimização.

Aqui está uma das variações na tabela:

 

Eu trouxe essa variante para confirmar que não se trata apenas de uma tabelinha tirada ao acaso, e para que você possa ver claramente que leituras podem realmente ser obtidas usando um sistema de negociação automatizado. Dei esse exemplo porque é bastante problemático encontrar esses Expert Advisors no Mercado, você pode, claro, mas vai ter que passar muito tempo pesquisando, por isso, é mais fácil para mim mostrar meus resultados. Desde já respondo que ainda não ofereço este Expert Advisor dentro da minha carteira de produtos. Mas acho que aqueles que duvidam que um EA desse tipo possa ser criado devem achar útil ver isto. Ao operar usei um lote fixo de 1.

Indicadores

Minha atitude em relação aos indicadores é mais negativa do que positiva, os indicadores são mais para negociação manual do que automática, embora seja possível usá-los no código, funcionam extremamente devagar e, em suma, dão um preço ligeiramente alterado. Isso é natural acontecer quando o indicador é desenhado na janela de cotação. Se falamos de indicadores em janela separada, trata-se apenas de um cálculo de alguma função, em muitos casos cálculos recorrentes, ou seja, valores que são calculados a partir dos anteriores. Em ambos os casos, a significância dessas ferramentas é severamente limitada.

Você nunca deve estar à espera de um sinal na forma de cruzamento de indicadores ou intercepção de linhas, pois pensar isso é apenas psicológico e nada mais. Acho que os indicadores mais úteis são os que detectam a geometria do mercado (padrões), porém, devem ser usados com um sinal sonoro. Além disso, se você reage a um padrão oportunamente, é só você que deve tomar a decisão de negociar ou não.

É como se lhe disseram que se prepare, pois há um ponto interessante, mais nada: olhe, aqui está este ponto que o indicador considera interessante, mas pelo fato de ele considerá-lo interessante, não necessariamente se torna interessante. Se um indicador detectasse sempre os pontos de entrada corretamente, já tivesse sido inventado um Expert Advisor operando com base neles para lucrar. Todos os indicadores que testei, incluindo o meu, não mostram pontos de entrada, porque fiz deles Expert Advisors e testei-os e o resultado foi zero. Eles são úteis apenas como uma ferramenta auxiliar para melhorar a precisão e, em geral, para que todo trader tenha a mesma calma tanto para entrar quanto para sair.

Aqui também darei um exemplo do meu indicador:


Mostrei este indicador como um exemplo de abordagem não padronizada. Ele define funções matemáticas simples e as procura no gráfico; se encontradas, você pode ativar um sinal sonoro que o notifica de que um padrão foi encontrado. Novamente, este indicador é apenas uma ferramenta para economizar tempo ao operar. Esses indicadores podem ser realmente úteis na negociação manual, mas ainda assim a decisão final é sempre sua.

Após um breve tour pelos recursos adicionais em termos de investimento e negociação, vamos começar a analisar o que é o processo de teste e desenvolvimento em linguagem matemática, para um entendimento mais profundo.

Matemática da pesquisa ideal

Se o objetivo final do desenvolvimento é obter o enésimo número de sistemas que atendam aos nossos requisitos, então surge a primeira pergunta: quão complexo deve ser o sistema para maximizar a eficiência do nosso trabalho? A eficiência pode ser entendida como a probabilidade do protótipo inicial cair dentro dos critérios de protótipo que definimos. Em outras palavras, o protótipo deve fornecer determinados indicadores já no estágio inicial, funcionar com base num par específico ou vários pares. Pessoalmente, sempre coloco vários pares moedas como um critério obrigatório. Como resultado, tudo se resume a determinada dependência, que não pode ser definida de forma confiável, mas pode ser estudada por meio de experimentos:

  • Ps=Ps(L)

Onde "L" é o número de linhas do código de trabalho. Em outras palavras, a probabilidade de que os primeiros indicadores do sistema atual a ser criado estejam numa faixa satisfatório, depende diretamente da quantidade de código que escrevemos. Pode parecer que quanto mais linhas, melhor será o sistema; na verdade, nem sempre é esse o caso. Deve ser entendido que:

  • T=K*L

Quanto mais linhas, mais tempo leva para desenvolver; antes de tudo não devemos pensar não sobre quantas linhas existem em nosso código e se não seremos odiados por 2 linhas de código que funcionam como 2000, mas, sim, sobre o quão eficiente nosso código é e quantos sistemas aceitáveis podemos escrever numa unidade de tempo. Afinal, todos os outros indicadores dependerão deste indicador:

  • E= Ps/T
  • E --> Max

Em outras palavras, devemos maximizar o índice "E" de todas as maneiras possíveis. As duas maneiras principais são melhorar a qualidade do seu conhecimento de mercado e encontrar o tamanho ideal do código do protótipo. Após decidirmos o tamanho do protótipo e ,naturalmente, dado o seu conhecimento atual do mercado e sua capacidade de aplicá-lo, tudo isso dá um certo "E0" - um certo indicador de sua eficiência no momento. Também obtemos um tempo médio de desenvolvimento dedicado a 1 sistema.

Afinal, o desenvolvimento é sempre seguido por um período de teste e modificação, esse processo também tem sua própria probabilidade. Neste caso, é a probabilidade de modificação + otimização bem-sucedida. Uma coisa não se pode separar da outra. É impossível fazer modificações sem um processo de teste. Como resultado, tudo se resume a vários ciclos repetitivos de "teste-resultados-modificações". Como resultado, iremos descartar o sistema, melhorá-lo, mantê-lo para nós, vendê-lo ou usá-lo nós mesmos.

Você também precisa entender que otimizar sua abordagem para desenvolvimento e teste inicial não garante que você encontrará pelo menos um desses sistemas. Tudo com que você pode contar é a chance máxima de obter o resultado desejado, e você precisa saber quanto tempo tem para processos de desenvolvimento e testes iniciais. Usando a fórmula de Bernoulli, você pode escrever: 

  • Pa=Soma(m0...m...n)[C(n,m)*Pow(Ps ,m)*Pow(1-Ps ,n-m)]
  • m0 é o número mínimo de protótipos satisfatórios
  • Pa é a probabilidade de que, como resultado do desenvolvimento, obteremos pelo menos "m0" ou mais de "n" ciclos de desenvolvimento.
  • n é o número máximo disponível de ciclos de pesquisa para protótipos de trabalho

Usamos a soma na fórmula porque ficaremos satisfeitos com as opções em que o número de protótipos satisfatórios acaba sendo maior do que o necessário. Abaixo está outra fórmula, ela parte do mesmo princípio.

É importante não superestimar suas capacidades e não pensar que obterá muitos protótipos bons. Afinal, mesmo que você os encontre, ninguém pode garantir que funcionarão da maneira que você deseja. Podemos contar tanto com muitos protótipos simples como com poucos mais complexos. A escolha é sua. Eu apostei nos simples.

No processo de modificação e teste, também existem indicadores que podem e devem ser maximizados. Vamos começar com a probabilidade de encontrar uma variante satisfatória no esquema de teste. Todo o processo de localização de resultados satisfatórios do protótipo selecionado inicialmente se junta num único processo de teste-modificação-otimização. É um processo recorrente que pode ser descrito usando a fórmula de Bernoulli:

  • Pf= Soma(1...m...n)[C(n,m)*Pow(Po,m)*Pow(1-Po,n-m)]
  • Po é a probabilidade de que, como resultado da iteração, obteremos um resultado aceitável
  • n é o número máximo disponível de ciclos de pesquisa

Ao fazer isso, presumimos que precisamos de pelo menos um evento satisfatório no processo de busca de resultados aceitáveis. Em outras palavras, temos um certo tempo para teste e modificação, que em última análise se traduz no número de iterações disponíveis (teste ou modificação), a fim de encontrar no protótipo algo mais do que o resultado inicial, e este resultado deve atender às nossas necessidades. Não precisamos exigir o máximo "Pf", pois o uso racional do nosso tempo é muito mais importante:

  • Ef= Pf/m
  • Ef--> Max

Nesta fase, é importante manter um equilíbrio entre modificações e testes, é importante sentir como este ou aquele parâmetro afeta o resultado final e se há algum sentido em realizar testes adicionais. O processo de teste e modificação sempre leva quase o mesmo tempo, por isso, "m" aqui é o número de testes que você deve determinar por intuição ou experiência. Não há diretrizes ou recomendações específicas. É claro que você pode aderir ao esquema clássico, quando você pega "n" ciclos e olha para o final, mas em muitos casos você pode reduzir o número dessas iterações e, por exemplo, descartar o sistema já no estágio inicial, ou vice-versa, tirar uma conclusão sobre seu excelente desempenho e flexibilidade. Sempre tento seguir essa abordagem, porque economiza tempo, e o tempo é a coisa mais valiosa que temos. Com base nas conclusões anteriores, você pode criar uma medida mais completa e geral da eficácia do seu projeto, levando em consideração que em média você usa testes "m" em vez de "n" completos:

  • ET= ( Ps*Pf)/(TSumm)
  • TSumm = T + m*Tm
  • Tm é o tempo médio de ciclo (teste-modificação-otimização)

Visto que os eventos das probabilidades Pf e Ps são inconsistentes, podemos fazer um novo espaço de eventos, onde um novo evento é a localização do protótipo, já depois disso uma modificação bem-sucedida, o que essencialmente significa uma descoberta bem-sucedida de um sistema de negociação satisfatório. Portanto, multiplicamos as probabilidades para obter a probabilidade de um determinado evento.

Na verdade, também sabemos que cada variante que encontramos leva tempo para desenvolver um protótipo "T" e modificar "m*Tm" Quanto maior a probabilidade de sucesso, referida a um ciclo de desenvolvimento completo, mais eficaz é a nossa abordagem. Em parte, o tempo final depende do tempo de teste. Inicialmente, fiz robôs de ticks, mas aconselho a todos que façam apenas protótipos que funcionem usando barras. Em primeiro lugar, você irá acelerar seus testes várias vezes, e em segundo lugar, você vai se livrar dos ticks e não vai perder tempo em testes baseados em ticks reais, e isso, acredite, vai acelerar muito o seu desenvolvimento. A seguir, analisaremos quais critérios podem ser apresentados às estratégias e quais deles devem ser levados em consideração.

Indicadores chave da estratégia

Existem certos valores quantitativos que se destinam a avaliar a qualidade da estratégia, cada um deles reflete suas características específicas. Alguns valores são mais importantes, outros não, mas em geral eles podem dizer tudo sobre a estratégia. Existem os seguintes indicadores quantitativos da estratégia:

  • Valor esperado
  • Fator de lucro
  • Rebaixamento absoluto
  • Rebaixamento relativo
  • Máximo rebaixamento
  • Fator de recuperação
  • Porcentagem de transações lucrativas

Valor esperado

O valor esperado é o indicador mais importante de qualquer Expert Advisor ou sistema de negociação manual, se você não atingir um bom valor esperado, suas chances são praticamente zero, exceto nos casos em que você tem apenas sorte. O valor esperado pode ser em pontos e moeda do depósito.

  • M_Points=( Soma(1,n)(PrPoints[i]) - Soma(1,n)(LsPoints[i]) )/n
  • M=( Soma(1,n)(Pr[i]) - Soma1,n)(Ls[i]) )/n

Onde:

  • PrPoints[i] — se a i-ésima transação for lucrativa, este é o valor do seu lucro em pontos
  • LsPoints[i] — se a i-ésima transação não for lucrativa, este é o valor de sua perda em pontos
  • Pr[i] — se o i-ésimo transação for lucrativa, este é o valor do seu lucro na moeda de depósito
  • Ls[i] — se a i-ésima transação não for lucrativa, este é o valor de sua perda na moeda de depósito
  • n — número de transações

Devo dizer desde já que todos os valores que descreverei aqui não descrevem a estratégia com 100% de acerto, pois para determiná-los com precisão é necessário que n tenda ao infinito. Mas mesmo quando não há muitas transações, todos esses valores podem nos falar, com uma confiabilidade muito alta, sobre a estratégia tudo o que pode ser dito nesta fase em princípio.

Para que a estratégia seja lucrativa, esse valor deve ser maior que zero, mas deve-se entender que parte do lucro vai para spread, comissão, swap.

  • PrPoints[i]=PrPoints_0[i] - (SpreadOpen[i]/2 + SpreadClose[i]/2) - (OrderComission[i]/OrderLots[i])/TickValue + (OrderSwap[i]/OrderLots[i])/TickValue
  • Pr[i]=Pr_0[i] - (SpreadOpen[i]/2 + SpreadClose[i]/2)*OrderLots[i])*TickValue - OrderComission[i] + OrderSwap[i]

Eu vou te contar sobre o TickValue. Este é o preço de um pip na moeda do nosso depósito, desde que joguemos com um lote igual a 1. Este valor é diferente para todos os pares de moedas e é considerado de forma que a alteração do preço mínimo forneça todo o TickValue. Na verdade, esse é o parâmetro mais importante da estratégia, já que o spread, de fato, é aquela parte do valor esperado que damos à corretora, por isso devemos estar atentos a este indicador, pois se o valor esperado supera ligeiramente o spread, todas as outras estratégias de indicadores não importam.

Fator de lucro

O fator lucro é a segunda característica mais importante de sua estratégia. Se você conseguiu um bom valor esperado, vale a pena olhar para este indicador, pois ele reflete a qualidade do seu sinal, ou seja, a qualidade da previsão. Quanto maior ele é, maior será o lucro total de suas transações e menor será a perda total das mesmas.

  • PrFactor = Soma(1,n)(Pr[i]) / Soma(1,n)(Ls[i])

Como pode ser visto pela fórmula, se o denominador desta fórmula zera, então o fator de lucro não pode ser calculado, ou, formalmente, pode-se assumir que este é o limite quando o denominador tende a zero a partir da parte positiva de o argumento. O limite é mais infinito, ou seja, se não houver transações não lucrativas, esse indicador muda para o infinito, e se não houver transações lucrativas, esse indicador passa para "0". Acontece que a faixa de valores desse valor é [0,+infinito]. O valor médio aqui é o número 1, tudo o que é maior é lucrativo, já o que menor é não lucrativo.

Os próximos a nível de importância são 2 parâmetros; na verdade, eles refletem a mesma coisa, mas de uma maneira ligeiramente diferente. Ambos os parâmetros, na minha opinião, refletem a mesma magnitude, apenas ligeiramente diferente.

Máximo rebaixamento

O rebaixamento máximo é a diferença máxima entre dois máximos adjacentes e o mínimo do patrimônio líquido, se assumirmos que primeiro é atingido o máximo e, em seguida, o lucro diminui até o próximo mínimo. Se denotarmos os preços da matriz de vértices por PriceExtremum[i], o rebaixamento máximo será:

  • MaximumDrawdown = MaxOf( PriceExtremum[i+1]- PriceExtremum[i] )

Se houver 2 ou mais estratégias com o mesmo lucro final, aquela com o rebaixamento máximo é melhor, o que realmente reflete o seguinte indicador, sem a necessidade de fazer esta suposição:

Fator de recuperação

Quase idêntico ao anterior, com a pequena exceção de que o lucro está presente na fórmula:

  • RecoveryFactor = TotalProfit/MaximumDrawdown

Este valor representa exatamente o mesmo quanto ao rebaixamento máximo, honestamente não sei por que são usados esses dois valores, na minha opinião a última opção é mais informativa. Quanto maior o fator de recuperação, mais estável fica nossa estratégia. Por exemplo, quanto maior esse indicador, mais adequada a estratégia para uso de martingale, pois a sequência de perdas fica menor e podemos começar a aumentar o lote em caso de perdas sem medo de perder o depósito.

Porcentagem de transações vencedoras

Este critério só é relevante em situações em que o valor da transação vencedora média é muito próximo ou igual ao valor da negociação perdedora média. Na verdade, estamos acostumados ao nível de 50% e mais do que isso significa que a estratégia é ganhadora, senão, perdedora. Vale destacar o patamar de 60%, na minha opinião esta linha é bastante importante, principalmente para um sistema de negociação manual, pois este indicador afeta fortemente qualquer trader. Mas não há nada neste indicador que não possa nos dizer sobre o sistema de fator de lucro, além disso, este indicador nem sempre é informativo.

  • WinPercent= (100*NProfit)/(NProfit + NLoss)

Rebaixamento absoluto

Este valor é importante quando sua estratégia tem uma grande carga no depósito ou quando a forma da curva de equilíbrio não é muito semelhante a uma linha reta, mas parece mais um caos com uma tendência ligeiramente pronunciada para o lucro, ou pelo menos se houver alguns motivos para isso no futuro. Pode parecer que o rebaixamento absoluto é capaz de nos indicar o depósito mínimo pelo qual não perderemos dinheiro, mas isso é uma ilusão e eu não aconselharia ninguém a se apegar a essa ideia. Este valor é igual à diferença entre o saldo inicial e o ponto inferior no gráfico de saldo para a área testada ou negociada:

  • AbsoluteDrawdown = StartBalance - MinimumBalance
Rebaixamento relativo

Esse valor, em minha opinião, é mais informativo como indicador da lucratividade ou estabilidade de um sistema de negociação, pois leva em consideração o lucro total. A diferença é aproximadamente a mesma que entre o rebaixamento máximo e o fator de recuperação:

  • 100*AbsoluteDrawdown/EndProfit

O valor é medido como uma porcentagem e mostra o quanto o rebaixamento absoluto afeta o lucro final. O conteúdo informativo desse fator também é muito limitado. Quanto menor for esse valor, melhor será a estratégia.

Outros parâmetros da estratégia

Existem também alguns parâmetros menos importantes da estratégia, mas não os subestime.

  • Ganho máximo
  • Perda máxima
  • Ganho médio
  • Perda média
  • Sequência máxima de transações vencedoras
  • Sequência máxima de transações perdedoras
  • Sequência média de transações vencedoras
  • Sequência média de transações perdedoras

Ganho máximo

Entre todas as transações vencedoras, procuramos uma negociação cujo lucro seja o valor máximo. Este indicador pode estar na moeda do depósito ou em pontos, tudo dependendo do motivo pelo qual precisamos desse valor. A importância deste indicador é bastante abstrata, assim como a do próximo indicador.

Perda máxima

Valor idêntico ao anterior, com a exceção de que estamos procurando o valor máximo do módulo de uma transação perdedora entre todas estas.

Ganho médio

O ganho médio é a soma do lucro de todas as transações dividida pelo número dessas transações. Por si só, este parâmetro é informativo apenas quando o valor esperado e o fator de lucro são positivos. Em outros casos, é absolutamente inútil.

  • MiddleProfit= Soma(Pr[i])/n;

Perda média

Semelhante à perda média, só que usando apenas transações perdedoras:

  • MiddleLoss= Soma(Ls[i])/n;

Sequência máxima de transações vencedoras

Este parâmetro é bastante útil, pois se for delimitado por cima, ele é ideal para usar um martingale reverso. Quanto menor o número de transações vencedoras, melhor para o martingale reverso.

Sequência máxima de transações perdedoras

Se a redução da sequência máxima de transações vencedoras permite o uso de martingale reverso, então limitar esse valor permite o uso de martingale direto. Se você de alguma forma tiver uma limitação desse valor em qualquer sinal, então usando o martingale, você pode ganhar dinheiro de forma rápida e segura sem medo de perder seu depósito.

Sequência média de transações vencedoras

O indicador é quase equivalente à porcentagem de transações vencedoras, na verdade, ele reflete quase o mesmo indicador do sistema de negociação, apenas um pouco diferente

  • MiddleWins= Soma(Wins[i])/n

OndeWins[i] é o comprimento de uma meia onda específica. Se dividirmos todo o gráfico de equilíbrio em seções ascendentes e descendentes e selecionarmos apenas as ascendentes, e contarmos o número de segmentos (ou transações, que é o mesmo) neles, enquanto ainda contamos o número de essas meias-ondas (ascendentes) que será "n", então será possível calcular o próprio indicador, que nada mais é do que a média aritmética de certas meias-ondas.

Sequência média de transações perdedoras

Um indicador semelhante com a única diferença de que são consideradas as meias-ondas negativas:

  • MiddleLosses= Soma(Loss[i])/n

Meus complementos

Acredito que para uma avaliação mais completa da estratégia, mais pode ser introduzido um indicador, para dar uma avaliação mais completa da estratégia:

  • Fator de linearidade

Este indicador reflete o desvio da curva de equilíbrio da linha reta que conecta o início e o final do gráfico de equilíbrio. Quanto mais o gráfico de equilíbrio ao negociar com lote fixo se parecer com uma linha reta, melhor será o sistema encontrado. Isso dá uma chance maior de poder trabalhar no futuro. Este indicador é especialmente útil se você estiver negociando com lote fixo. Acontece que a volatilidade do mercado está constantemente mudando e saltando, o que significa que o tamanho médio dos candles ou a dinâmica geral do mercado muda, o que é essencialmente a mesma coisa. Se você entender esses pontos, pode entender porque algumas estratégias têm um amortecimento da expectância ao final do teste ou a situação oposta, o que significa que o gráfico é muito curvo e começa a nos incomodar ou envergonhar, pois não há garantias que aparecerá um ângulo de inclinação no futuro e, portanto, o valor esperado será estável.

  • LinearFactor = MaxDeviation/EndBalance
  • MaxDeviaton = Max(MathAbs(Balance[i]-AverageLine))
  • AverageLine=StartBalance+K*i
  • K=(EndBalance-StartBalance)/n
  • n - número de transações durante o teste

A razão pela qual não existem tais indicadores nos testadores de estratégia MetaTrader 4 e MetaTrader 5 é muito simples. Isso ocorre porque para calcular esses indicadores são sempre necessárias 2 execuções, uma vez que eles mostram o lucro final. Quanto menor for este indicador, melhor será a estratégia. Se quiser, você pode medir como uma porcentagem.

Algo pode ser ilustrado na figura abaixo para entender isso:


Em quais indicadores você deve se concentrar ao testar ou revisar o sistema

Na minha opinião, existem apenas alguns indicadores básicos do sistema que devem ser levados em consideração:

  • Valor esperado em pontos
  • Fator de lucro ou seu equivalente
  • Máximo rebaixamento
  • Sequência máxima de transações perdedoras
  • Fator de linearidade

Por que escolhi esta combinação como sendo a mais importante? Isso porque é muito difícil usar todos os outros parâmetros como alguma informação adicional sobre o sistema ou sobre o mercado, em qualquer caso, ainda não encontrei algoritmos que sejam capazes de explorar esses indicadores e nem mesmo há motivos para usá-los. Na minha opinião, não há necessidade de complicar algo que é simples, e esses indicadores, na minha opinião, nada mais são do que uma tentativa de complicar algo que na verdade é muito mais simples. Isso confunde as pessoas e as desvia das questões que são realmente importantes.

Tentarei descrever a escolha desses critérios em linguagem simples, e refletir com isso:

Em primeiro lugar, para que a estratégia seja rentável, é necessário fornecer um valor esperado em pontos para superar o spread+comissão+swap, é claro, medindo-o em pontos. O valor esperado é de preferência pelo menos 2 vezes o spread+comissão+swap médio, por isso, iremos compensar as perdas e obter um lucro maior ou igual ao módulo deste indicador.

Após estarmos convencidos da lucratividade da estratégia, devemos cuidar da qualidade da previsão. O fator de lucro nada mais é do que a qualidade da previsão. Quanto maior de um for este indicador, melhor será a qualidade de nossa previsão. Quanto melhor for a qualidade da previsão, mais este valor afetará todos os outros. Na verdade, se fosse possível nos abstrairmos do valor esperado, o valor mais importante seria lucro=fator. Todos os outros indicadores disponíveis dependem do seu valor, direta ou indiretamente, mas dependem.

Além disso, se atingimos indicadores de rentabilidade adequados, vale a pena pensar no rebaixamento máximo. O rebaixamento máximo responde direta e simplesmente à pergunta sobre o depósito mínimo necessário para não perdê-lo e ao mesmo tempo garantir a rentabilidade máxima nesta fase. Com base no rebaixamento máximo, podemos escolher o depósito inicial de forma a garantir a porcentagem máxima anual de lucro, praticamente sem temer uma perda total. Se houver confiança de que a sequência máxima de transações perdedoras ou o rebaixamento máximo têm valores extremos, neste sinal pode ser usado um martingale.

O fator de linearidade o livrará de dúvidas de que se trata de um padrão, e não de um resultado acidental, pois quanto mais o gráfico se assemelha a uma linha reta, mais provável é que se trate de um padrão real ou característica de mercado.

Além disso, outro fator que uma porcentagem muito pequena de pessoas considera importante é o tempo do teste. Quanto mais tempo você leve a testar um sistema, com indicadores de lucratividade semelhantes, mais provável é que esse sistema reflita um padrão global, e não algum resultado aleatório.

Saldo e patrimônio líquido

Esta questão é muito importante para os iniciantes, especialmente aqueles que não veem a diferença entre esses valores. O patrimônio líquido é o lucro não fixo atual, enquanto o saldo é o lucro fixo atual. A diferença é que basicamente todo mundo está olhando para a linha de equilíbrio, mas não para o patrimônio, porque ela é mais brilhante e chama a atenção para si mesma. Estritamente falando, em bons sistemas de negociação, o patrimônio está o mais próximo possível da linha de equilíbrio. Isso sugere que a estratégia não usa nenhuma trapaça, como grade ou martingale, piramide. Claro, não estou dizendo que essas abordagens não funcionem, mas sem um bom sinal, isso é apenas distrações, vamos ser honestos. Artigos anteriores podem confirmar as minhas palavras. No testador de estratégia MetaTrader 5 e no site MQL5, a linha de equilíbrio é exibida em azul escuro, já a linha de patrimônio é exibida em verde. Quanto mais próxima a linha do patrimônio da linha de equilíbrio, mais segura é a estratégia, é claro, desde que ambas as linhas aumentem. 

Indicadores de um sistema de negociação real e sua viabilidade

Eu levanto esta questão com base na prática e nos sistemas de negociação da vida real, escritos com minhas próprias mãos. Além disso, pretendo alcançar o máximo entendimento entre os leitores e, mais importante, protegê-los o máximo possível de investimentos em sinais ou EAs, que na verdade são apenas uma imagem e nada mais. Em minha humilde experiência, os sistemas que foram testados usando menos de 10 anos do histórico têm um risco maior de ficarem inoperantes. Adicionalmente, se a parcela testada tem 2 anos ou menos, eu não olho para esses sistemas e não aconselho você.

Minha experiência mostra que um sistema que pode negociar lucrativamente durante todo o seu histórico terá aproximadamente 5 a 50 pontos de valor esperado, com um fator de lucro na faixa de 1,05 a 3,0. Eu realmente amo o período gráfico M5, já que todos os sistemas que criei funcionam com ele e, se desejar, você pode executá-los no M1. Este também é um gráfico muito bom, provavelmente devido ao fato de serem as menores barras e conterem mais informações por unidade de tempo ( High[i],Low[i],Close[i],Open[i] ). Esses pontos de barra são, na verdade, ticks reais salvos e, quanto mais curto o período gráfico, mais ticks reais são armazenados dentro dos candles. Ao testar um sistema no testador, para muitos sistemas, isso será de grande importância, a menos, é claro, que você esteja testando com base em ticks reais.

Pessoalmente, nunca testei usando ticks reais, porque já adotei uma determinada visão há muito tempo. Todos os meus Expert Advisors trabalham no fechamento da barra, e não preciso me preocupar com a geração artificial de ticks, até porque o fechamento de uma barra é sempre um tick real. Em média, o fator de lucro médio dos sistemas que encontrei era de cerca de 1,2, e o valor esperado era de cerca de 15 pontos. Isso ocorre porque eu usei períodos gráficos bastante baixos. É muito mais difícil encontrar algo que funcione em períodos grandes. Você aumentará o valor esperado, mas, não, o fator de lucro - é improvável.

Outro ponto muito importante é que muitos vendedores escrevem que, supostamente, o EA precisa ser otimizado, e até mesmo escrevem o tempo previsto antes da reotimização. Não se deixe enganar por essas afirmações, uma vez que é impossível prever o tempo de funcionamento do Expert Advisor no futuro. Também aconselho você a esquecer a palavra "otimização" até aprender a usar essa ferramenta. Você pode otimizar qualquer coisa e ajustar com base no resultado desejado, mas muito provavelmente seu resultado será apenas um acidente. Você precisa otimizar de forma competente e opcional. Raramente uso esta ferramenta, pode-se dizer que quase não a utilizo, faço tudo à mão e assim está certo. O cérebro humano é um sistema muito mais eficiente do que uma busca enfadonha de parâmetros.

Como testar adequadamente o sistema

Pessoalmente, eu testo os meus próprios sistemas e os de outros, embora, é claro, quase sempre esteja testando os meus, e uso a seguinte abordagem:

Para o primeiro teste, seleciono sempre o último ano, se contar a partir da data atual. Se eu gostar do teste, pego mais alguns gráficos. É importante entender que para uma análise abrangente, precisamos ter uma parcela de por pelo menos 10 anos, ou melhor, de 20.

Se o primeiro e o último ano forem bons, então devemos tomar mais algumas parcelas mais perto do meio. Se tudo for aceitável, vale a pena testar todos os 10 anos e avaliar a curva de equilíbrio e o patrimônio líquido. Se eles forem os mais planos possíveis e parecidos com uma linha reta, provavelmente o sistema merece ser reconhecido. Essa abordagem tem um único objetivo - economizar tempo e maximizar a qualidade dos sistemas resultantes.

Depois que essa análise for feita, podemos pensar no que fazer para frente. A fim de fortalecer ainda mais a confiança no sistema, devemos testá-lo usando mais alguns pares de moedas, e se pelo menos reter parte de seu desempenho, será porque o sistema é baseado na física do mercado e pode ser melhorado. Provamos os principais parâmetros do sistema um por um e vemos como afetam o resultado. Na maioria dos casos, verifica-se que a influência de um determinado parâmetro é praticamente independente de outro.

Após alcançar o melhor desempenho, podemos começar a testar o sistema numa conta de demonstração. Se o sistema mostrar um resultado aceitável numa conta dessas, podemos tentar numa conta real. Novamente, outra vantagem do trabalho do Expert Advisor com barras é que o resultado na de demonstração não será diferente do resultado na real, mas, claro, desde que haja uma corretora adequada. Eu pessoalmente recomendo Alp***. Você pode terminar palavra sozinho. Dados históricos desta corretora sem distorção. Eu não recomendo testar robôs de tick ainda, não há garantias. Apenas sugiro usar os que trabalham com fechamentos ou aberturas de barras.

Parâmetros das barra

Para entender corretamente uma cotação, acredito que seja necessário analisar o que é uma barra ou candle (que dados contém, quais informações podem ser obtidas com base no tipo). Uma barra ou candle é um segmento do histórico de ticks de comprimento fixo, onde não são salvos todos os ticks, mas, sim, o tick inicial, o tick final, o tick máximo e o mínimo, bem como o tempo de abertura da barra, alterado em datetime. Este valor é o número de segundos que se passaram desde 1 de janeiro de 1970. Existem 6 valores dentro da barra:

  • Close[]
  • Open[]
  • Low[]
  • High[]
  • Time[]
  • Volume[]

Os primeiros 4 são, respectivamente, 4 ticks que são armazenados na barra, já os restantes são o tempo de abertura da barra e o volume. O volume se refere ao número de ticks que cabem numa determinada barra. É claro que os dados mais importantes são os dados de preços, mas eu diria que o tempo e os volumes não são menos importantes. Durante muito tempo eu mesmo não dei importância a esses valores, mas se você processar corretamente essas informações, poderá encontrar bons sinais. Barras e candles são a mesma coisa, apenas representações gráficas diferentes dos mesmos valores:


Existem diferentes métodos para analisá-los, até mesmo a classificação e os nomes de certos tipos de barras são introduzidos. Eu não aconselharia você a levar essas metodologias para o lado pessoal, porque elas são apenas informações gráficas. Elas só podem ajudar em conjunto com indicadores e outros métodos de análise.

Escrevemos e testamos um Expert Advisor simples usando volumes

Como exemplo de uma abordagem competente, estudaremos a escrita de um Expert Advisor usando volumes e faixas de tempo como informações adicionais sobre o mercado e restrições a nível de mercado. A ideia é que ao definir os picos de volume, você pode encontrar pontos de decisão importantes tomadas pelos participantes do mercado e, ao limitar o tempo do servidor do Expert Advisor, pode encontrar áreas onde os volumes são cruciais. Escreveremos um Expert Advisor, e depois faremos vários testes e uma análise completa, após a qual tiraremos conclusões sobre o sistema. É claro que o próprio sistema é apenas para imersão e estudo da relação dos parâmetros de mercado. O sistema é necessário principalmente para mostrar que cada parâmetro da barra tem seu próprio peso e contribui para a qualidade geral do sistema. O Expert Advisor em si será anexado ao artigo e todos podem usá-lo e modificá-lo à vontade.

Vamos começar com as bibliotecas já bastante conhecidas para trabalhar com posições:

#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
CPositionInfo  m_position=CPositionInfo();// trade position object
CTrade         m_trade=CTrade();          // trading object

São necessárias principalmente para simplificar o código. Não vou explicar o que e como funciona, as informações estão completas no site.

A seguir, vamos definir uma lista numerada para poder alternar os modos de operação:

enum MODE_CALCULATE
   {
   MODE_1=0,
   MODE_2=1,
   MODE_3=2,
   MODE_4=3
   };

Isso é feito com a expectativa de que existam vários modos para determinar a fórmula de mercado mais eficaz. Inicialmente, deve haver algumas ideias gerais sobre qual física queremos explorar, e, na verdade, não sabemos qual fórmula será mais eficaz para o nosso caso. Neste robô, criei 4 variantes da fórmula e veremos qual delas melhor descreve o mercado. Muitos modos também não merecem ser feitos, uma vez que, se houver alguma verdade em nossa suposição, certamente a veremos. Normalmente não faço mais do que 4 modos.

Em seguida, definimos os parâmetros de entrada e o que é necessário para:

input MODE_CALCULATE MODEE=MODE_1;//Mode
input int TradeHour=0;//Start Trading Hour
input int TradeMinute=1;//Start Trading Minute
input int TradeHourEnd=23;//End Trading Hour
input int TradeMinuteEnd=59;//End Trading Minute

input bool bWriteValuesE=false;//Log
input int CandlesE=50;//Bars To Analyse
input int Signal=200;//Signal Power
input int PercentE=52;//Percent Signals To One Side

input bool bInvert=false;//Trade Invert

input int SLE=3000;//Stop Loss Points
input int TPE=3000;//Take Profit Points
input double Lot=0.01;//Lot

input int MagicF=15670867;//Magic

Após o modo de operação, há um bloco de 4 parâmetros, no qual devemos descrever o corredor de horário do servidor, no qual abriremos posições (ou sessão de negociação). Por mais estranho que possa parecer, muito depende desse valor. A seguir está o bloco de parâmetros operacionais, que descreve as variáveis mais importantes para o sistema. Se necessário, você pode gravar no log informações sobre o estado atual dos valores monitorados para poder ajustar os parâmetros de entrada quando alternamos os modos.

Depois, vem um pedaço do mercado em barras que vamos analisar. Todos os candles mais abaixo na histórico não serão consideradas no cálculo. Em seguida, vem a intensidade do sinal, que possui escalas diferentes para cada modo, para isso precisamos de um log. E o último é um elemento adicional de controle de sinal. Afinal, pode acontecer que o sinal seja grande, mas sem entender qual porcentagem da maioria do sinal em relação a todos os sinais, não faz sentido definir a intensidade desse sinal. As últimas variáveis permitem inverter a negociação, definir o stop loss e o take profit, bem como o volume e o número mágico de todas as ordens.

Para calcular de forma rápida e conveniente os valores de arrays predefinidos, você precisa inserir as seguintes funções:

MqlTick LastTick;//the last tick

double High[];
double Low[];
double Close[];
double Open[];
datetime Time[];
long Volume[];

void DimensionAllMQL5Values()//prepare the arrays
   {
   ArrayResize(Time,CandlesE,0);
   ArrayResize(High,CandlesE,0);
   ArrayResize(Close,CandlesE,0);
   ArrayResize(Open,CandlesE,0);   
   ArrayResize(Low,CandlesE,0);
   ArrayResize(Volume,CandlesE,0);
   }

void CalcAllMQL5Values()//recalculate the arrays
   {
   ArraySetAsSeries(High,false);                        
   ArraySetAsSeries(Low,false);                              
   ArraySetAsSeries(Close,false);                        
   ArraySetAsSeries(Open,false);                                 
   ArraySetAsSeries(Time,false); 
   ArraySetAsSeries(Volume,false);                                   
   CopyHigh(_Symbol,_Period,0,CandlesE,High);
   CopyLow(_Symbol,_Period,0,CandlesE,Low);
   CopyClose(_Symbol,_Period,0,CandlesE,Close);
   CopyOpen(_Symbol,_Period,0,CandlesE,Open);
   CopyTime(_Symbol,_Period,0,CandlesE,Time);
   CopyTickVolume(_Symbol,_Period,0,CandlesE,Volume);
   ArraySetAsSeries(High,true);                        
   ArraySetAsSeries(Low,true);
   ArraySetAsSeries(Close,true);                        
   ArraySetAsSeries(Open,true);                                 
   ArraySetAsSeries(Time,true);
   ArraySetAsSeries(Volume,true);
   }

Já dei apresentei essas funções em artigos anteriores, mas de uma forma mais truncada, além da variável LastTick, na qual armazenaremos o valor de todos os parâmetros do último tick que vieram do servidor. Eles são necessários para acessar arrays como no MQL4.

Eu coloquei as principais variáveis e lógica numa classe estática:

class TickBox
   {
   public:
   static int BarsUp;
   static int BarsDown;
   static double PowerUp;
   static double PowerDown;
   static double PercentUp;
   static double PercentDown;
   static double PercentPowerUp;
   static double PercentPowerDown;

   static void CalculateAll(MODE_CALCULATE MODE0)//calculate all the necessary parameters
      {
      BarsUp=0;
      BarsDown=0;
      PercentUp=0.0;
      PercentDown=0.0;
      PowerUp=0.0;
      PowerDown=0.0;
      if ( MODE0 == MODE_1 )
         {
         for ( int i=0; i<CandlesE; i++ )
            {
            if ( Open[i] < Close[i] )
               {
               BarsUp++;
               PowerUp+=(MathAbs(Open[i] - Close[i])/(High[i] - Low[i]))*Volume[i];
               } 
            if ( Open[i] > Close[i] )
               {
               BarsDown++;
               PowerDown+=(MathAbs(Open[i] - Close[i])/(High[i] - Low[i]))*Volume[i];
               } 
            }
         }
         
      if ( MODE0 == MODE_2 )
         {
         for ( int i=0; i<CandlesE; i++ )
            {
            if ( Open[i] < Close[i] )
               {
               BarsUp++;
               PowerUp+=(MathAbs(Open[i] - Close[i])/_Point)*Volume[i];
               } 
            if ( Open[i] > Close[i] )
               {
               BarsDown++;
               PowerDown+=(MathAbs(Open[i] - Close[i])/-_Point)*Volume[i];
               } 
            }
         }
         
      if ( MODE0 == MODE_3 )
         {
         for ( int i=0; i<CandlesE; i++ )
            {
            if ( Open[i] < Close[i] )
               {
               BarsUp++;
               PowerUp+=(double(CandlesE-i)/double(CandlesE))*(MathAbs(Open[i] - Close[i])/_Point)*Volume[i];
               } 
            if ( Open[i] > Close[i] )
               {
               BarsDown++;
               PowerDown+=(double(CandlesE-i)/double(CandlesE))*(MathAbs(Open[i] - Close[i])/_Point)*Volume[i];
               } 
            }
         }
         
      if ( MODE0 == MODE_4 )
         {
         for ( int i=0; i<CandlesE; i++ )
            {
            if ( Open[i] < Close[i] )
               {
               BarsUp++;
               PowerUp+=(double(CandlesE-i)/double(CandlesE))*(MathAbs(Open[i] - Close[i])/(High[i] - Low[i]))*Volume[i];
               } 
            if ( Open[i] > Close[i] )
               {
               BarsDown++;
               PowerDown+=(double(CandlesE-i)/double(CandlesE))*(MathAbs(Open[i] - Close[i])/(High[i] - Low[i]))*Volume[i];
               } 
            }
         }
         
      if ( BarsUp > 0 && BarsDown > 0 )
         {
         PercentUp=(double(BarsUp)/double(BarsUp+BarsDown))*100.0;
         PercentDown=(double(BarsDown)/double(BarsUp+BarsDown))*100.0;
         PercentPowerUp=(double(PowerUp)/double(PowerUp+PowerDown))*100.0;
         PercentPowerDown=(double(PowerDown)/double(PowerUp+PowerDown))*100.0;
         }         
      }
   };
   int TickBox::BarsUp=0;
   int TickBox::BarsDown=0;
   double TickBox::PowerUp=0;
   double TickBox::PowerDown=0;   
   double TickBox::PercentUp=0;
   double TickBox::PercentDown=0;
   double TickBox::PercentPowerUp=0;
   double TickBox::PercentPowerDown=0;

Todas as funções e variáveis são estáticas, não há a criação de instância, já que uma é suficiente para nós. Todo o cálculo ocorre numa única função, que está na classe, que, por usa vez, conta o número de barras de alta e de baixa, bem como componentes semelhantes da intensidade do sinal, que são resumidos numa variável comum. Todas as 4 fórmulas para cada modo são implementadas nesta função.

As 2 primeiras variantes da fórmula são implementadas sem atenuação na extremidade da área analisada, as próximas duas são uma cópia exata, mas implementam atenuação. Nesse caso, a atenuação é linear, se desejar, você pode fazer qualquer outra atenuação, mas para simplificar, é melhor tentar sempre primeiro o que exigirá um mínimo de computação.

Para cada candle existe um termo elementar que contribui para o total. A primeira versão da fórmula considera que todo o volume que estava no candle é um sinal numa determinada direção, e também leva em consideração o quão próximo o movimento final está de ser o único. Quanto mais caudas na parte inferior e superior do candle em relação ao movimento final, menos peso terá dado volume. Se desejar, você pode fazer outras proporções.

A segunda versão da fórmula calcula o movimento final do candle em pontos (o sinal depende da direção do movimento deste), enquanto também multiplicamos este valor pelo volume, assumimos assim que o volume é uma espécie de coeficiente de peso que diz o quão confiável é o movimento de uma determinada barra. As variáveis restantes contam a porcentagem de barras que aumentaram ou diminuíram, bem como a porcentagem do próprio sinal.

A seguir, descreveremos a função principal com que abriremos e fecharemos as posições:

void Trade()
   {
   SymbolInfoTick(Symbol(),LastTick);
   MqlDateTime tm;
   TimeToStruct(LastTick.time,tm);
   int MinuteEquivalent=tm.hour*60+tm.min;
   int BorderMinuteStartTrade=HourCorrect(TradeHour)*60+MinuteCorrect(TradeMinute);
   int BorderMinuteEndTrade=HourCorrect(TradeHourEnd)*60+MinuteCorrect(TradeMinuteEnd);
   if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= 1.0 && TickBox::PercentPowerUp >= 50.0 )
      {
      if ( !bInvert ) ClosePosition(POSITION_TYPE_BUY);
      else ClosePosition(POSITION_TYPE_SELL);
      }
      
   if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= 1.0 && TickBox::PercentPowerDown >= 50.0 )
      {
      if ( !bInvert ) ClosePosition(POSITION_TYPE_SELL);
      else ClosePosition(POSITION_TYPE_BUY);
      }
      
     if ( BorderMinuteStartTrade > BorderMinuteEndTrade )
        {
        if ( PositionsTotal() == 0 && !(MinuteEquivalent>=BorderMinuteEndTrade && MinuteEquivalent<= BorderMinuteStartTrade) )
           {
           if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= Signal && TickBox::PercentPowerUp >= PercentE )
              {
              if ( !bInvert ) m_trade.Sell(Lot,_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
              else m_trade.Buy(Lot,_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
              }
      
           if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= Signal && TickBox::PercentPowerDown >= PercentE )
              {
              if ( !bInvert ) m_trade.Buy(Lot,_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
              else m_trade.Sell(Lot,_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
              }
           }        
        }
     if ( PositionsTotal() == 0 && BorderMinuteStartTrade <= BorderMinuteEndTrade )
        {
        if ( MinuteEquivalent>=BorderMinuteStartTrade && MinuteEquivalent<= BorderMinuteEndTrade )
           {
           if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= Signal && TickBox::PercentPowerUp >= PercentE )
              {
              if ( !bInvert ) m_trade.Sell(Lot,_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
              else m_trade.Buy(Lot,_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
              }
      
           if ( MathAbs(TickBox::BarsUp-TickBox::BarsDown) >= Signal && TickBox::PercentPowerDown >= PercentE )
              {
              if ( !bInvert ) m_trade.Buy(Lot,_Symbol,LastTick.ask,LastTick.bid-double(SLE)*_Point,LastTick.ask+double(TPE)*_Point);
              else m_trade.Sell(Lot,_Symbol,LastTick.ask,LastTick.ask+double(SLE)*_Point,LastTick.bid-double(TPE)*_Point);
              }
           }        
        }
   }

Nós o abrimos de acordo com a força e a qualidade do sinal, medido como uma porcentagem. Fechamos se houver pelo menos uma sugestão mínima de mudança de sinal.

Para fechar apenas uma posição que está aberta numa determinada direção, usaremos esta função. É simples.

void ClosePosition(ENUM_POSITION_TYPE Direction)//close a position by a symbol
   {
   bool ord;
   ord=PositionSelect(Symbol());
   if ( ord && int(PositionGetInteger(POSITION_MAGIC)) == MagicF  && Direction == ENUM_POSITION_TYPE(PositionGetInteger(POSITION_TYPE)) )
      {
      if(m_position.SelectByIndex(0)) m_trade.PositionClose(m_position.Ticket());          
      }
   }

A seguir, descreveremos os eventos principais e a função para trabalhar com barras:

int OnInit()
  {
  m_trade.SetExpertMagicNumber(MagicF);//set the magic number for positions
  DimensionAllMQL5Values();//prepare the predefined arrays
  return(INIT_SUCCEEDED);
  }

datetime Time0;
datetime TimeX[1];
bool bNewBar()
   {
   CopyTime(_Symbol,_Period,0,1,TimeX);
   if ( Time0 < TimeX[0] )
      {
      if (Time0 != 0)
         {
         Time0=TimeX[0];
         return true;
         }
      else
         {
         Time0=TimeX[0];
         return false;
         }
      }
   else return false;
   }

void OnTick()
  {
  if ( bNewBar())//work by bars
     {
     CalcAllMQL5Values();
     TickBox::CalculateAll(MODEE);
     if (bWriteValuesE)
        {
        Print("% Sit in buy = ",TickBox::PercentUp);
        Print("% Sit in sell = ",TickBox::PercentDown);
        Print("Signal = ",MathAbs(TickBox::BarsDown-TickBox::BarsUp));
        Print("% Resistance = ",TickBox::PercentPowerUp);
        Print("% Support = ",TickBox::PercentPowerDown);        
        Print("***************************************************************************");
        }
     Trade();
     } 
  }

Ao iniciar o Expert Advisor, precisamos preparar os arrays e definir seu tamanho, bem como definir a número mágico para as posições, após o que iremos descrever a função-predicado, a fim de corrigir a mudança da barra e as variáveis que são necessárias para sua operação. Depois de tudo isso, iremos descrever o evento principal do tick e a cada barra iremos recalcular os valores dos arrays pré-definidos, após o que iremos calcular os parâmetros do sistema, e adicionar um bloco para escrever no log os valores dos parâmetros principais do sistema se habilitarmos esta função. Você pode, é claro, fazer diferente, você pode fazer melhor, mas, neste caso, você pode usá-lo. O principal é que tudo seja simples e claro.

A essência do Expert Advisor é que cada barra contribui para a imagem atual, é impossível até mesmo determinar aproximadamente o que vai acontecer a seguir após algumas barras, aconselho a todos que se lembrem disso. Cada barra contribui para o sinal final, mas deve-se entender que o peso das barras não é o mesmo. Tudo por causa da física do mercado. Falaremos sobre esse tópico no próximo artigo.

Testando o Expert Advisor

Nesta seção, testaremos nosso Expert Advisor e tentaremos encontrar momentos de trabalho, se eles existirem. Vamos começar com o teste do ano passado. Vamos pegar o par EURUSD M5. Após percorrer os modos de operação, testar 10 anos do histórico e usar também diferentes corredores de tempo, encontrei o seguinte resultado satisfatório. A configuração com o qual o EA foi testado será anexada ao artigo. Com base nas minhas próprias regras de análise de sistemas, alterei alternadamente os modos de operação e o intervalo de tempo do servidor, e, como resultado, encontrei os seguintes parâmetros, em cerca de 30-60 minutos de trabalho.

Abaixo está o teste do último ano:

 

Em seguida, testei o primeiro ano por um período de 10 anos:

 

O gráfico não foi tão bom quanto na próxima parcela, mas ainda assim o movimento final foi preservado. Existem momentos desagradáveis, mas parece que tudo funciona também.

Depois disso, peguei o ponto médio do intervalo e verifiquei como o sistema se comporta para ter certeza de que funciona:

 

Como você pode ver, há sinais de um padrão global, e só temos que testar todo o intervalo e ver como fica numa escala global:

 

O gráfico está longe de ser perfeito, mas você pode ver os momentos em que funciona, tentar introduzir filtros ou, por exemplo, realizar uma otimização profunda. A escolha de uma ferramenta específica é sempre opcional. Se testarmos com outros pares, provavelmente o resultado será diferente, mas após um certo tempo gasto, você provavelmente encontrará os parâmetros ideais para vários pares ao mesmo tempo, e se você entende a física e pode fortalecer isso, isso é bom de mais.

Mesmo com este robô, obtive resultados aceitáveis, houve muito poucas transações, mas havia algumas multimoedas. Você pode testá-lo com mais firmeza, em qualquer caso, haverá bons resultados. Mesmo à primeira vista, o código mais simples pode servir como uma base poderosa para o desenvolvimento de uma ideia; alguns sistemas podem até ser usados sem modificações, de forma organizada, mas ainda assim.

Seria bom, claro, alcançar um domínio a nível multimoeda, mas isso é conseguido por meio de um trabalho muito mais rígido e modificações ativas. Neste artigo, não vou tratar disso, vou deixar isso para o leitor. Em meu próprio nome, acrescentarei que você não deve gastar muito tempo com o sistema, tentando tirar pelo menos algum proveito dele, porque se houver algo funcionando, será visível quase imediatamente. Se o resultado não for visível, é melhor tirar conclusões e mudar de ideias. Em alguns, é claro, é possível corrigir algo, mas nem sempre é o caso.

Você pode, é claro, ainda testá-lo, mas me parece que é o suficiente para mostrar que absolutamente todos os parâmetros das barras afetam o resultado de maneiras diferentes, e há valores extremos de indicadores com diferentes combinações em pares diferentes. Existem também extremos que funcionam para todos os pares ao mesmo tempo, mas encontrá-los requer tempo e prática. A versão MQL4 também será anexada ao artigo.

Fim do artigo

Finalmente, direi que você não deve ter medo de escrever código sozinho e testá-lo, não deve ter medo de que o sistema seja muito simples (esses são os sistemas que geralmente funcionam). Acontece que quanto mais complexo o sistema, mais graus de liberdade ele possui, mais dados de entrada e variantes de trabalho imprevisíveis. Você deve, de todas as maneiras possíveis, evitar complexidades no código e mantê-lo o mais simples possível.

Outro ponto é que quanto mais complexo o sistema, mais tempo você levará para testá-lo. Você vai gastar muito tempo sem motivo que valha a pena Você não deve escrever sistemas que não sejam baseados em nada, ou nas especulações de algumas pessoas que dizem que "aqui eu fiz 30 transações e agora tudo vai funcionar". Esta é uma abordagem pouco profissional. Em particular, você não deve escrever sistemas baseados com base em algumas leituras, esta é a coisa mais estúpida que você pode fazer como desenvolvedor.

Basicamente, vale a pena antes de tudo entender por que você deveria gastar tempo nisso e, se você está pronto para gastar tempo, quanto está pronto para gastar. Em primeiro lugar, você deve ter uma meta e um cronograma, isso o estimulará a usar racionalmente seu tempo. Primeiro, a meta é alta, depois mais real, mas a meta sempre deve ser obrigatória.

Nunca entendi as pessoas que se preparam aqui há anos e colocam mil indicadores no gráfico e tentam ver alguma coisa - esse é o caminho para lugar nenhum. Primeiro, você precisa saber se seu espírito tem vontade ou apenas é um hobby. Acredito que existam hobbies muito mais interessantes do que olhar para uma tela com cotações tristes durante anos. O Forex é um buraco negro e, se ficar preso nele, nunca poderá voltar.

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

Arquivos anexados |
VAI_EURUSD_M5.set (1.28 KB)
Perceptron Multicamadas e o Algoritmo Backpropagation Perceptron Multicamadas e o Algoritmo Backpropagation

Recentemente, ao aumentar a popularidade desses métodos, tantas bibliotecas foram desenvolvidas em Matlab, R, Python, C++, e etc, que recebem o conjunto de treinamento como entrada e constroem automaticamente uma Rede Neural apropriada para o suposto problema. Vamos entender como funciona um tipo básico de Rede Neural, (Perceptron de um único neurônio e Perceptron Multicamadas), e um fascinante algoritmo responsável pelo aprendizado da rede, (Gradiente descendente e o Backpropagation). Tais modelos de rede serviram de base para os modelos mais complexos existentes hoje.

Redes Neurais de Maneira Fácil(Parte 7): Métodos de otimização adaptativos Redes Neurais de Maneira Fácil(Parte 7): Métodos de otimização adaptativos

Nos artigos anteriores, nós usamos o gradiente descendente estocástico para treinar uma rede neural usando a mesma taxa de aprendizado para todos os neurônios da rede. Neste artigo, eu proponho olhar para os métodos de aprendizagem adaptativos que permitem a mudança da taxa de aprendizagem para cada neurônio. Nós também consideraremos os prós e os contras dessa abordagem.

Aplicação prática de redes neurais no trading. Python (Parte I) Aplicação prática de redes neurais no trading. Python (Parte I)

Neste artigo, analisaremos passo a passo a implementação de um sistema de negociação baseado na programação de redes neurais profundas em Python. Para isso, usaremos a biblioteca de aprendizado de máquina TensorFlow desenvolvida pelo Google. Para descrever as redes neurais, iremos por em uso a biblioteca Keras.

Exemplos de análise de gráficos usando o TD Sequential e os níveis de Murray-Gann Exemplos de análise de gráficos usando o TD Sequential e os níveis de Murray-Gann

O TD Sequential mostra perfeitamente as mudanças no equilíbrio durante o movimento do preço. Isso é especialmente evidente se usarmos seus sinais juntamente com um indicador de nível, como com os níveis de Murray. Este artigo falará sobre essa combinação. O texto é destinado principalmente a iniciantes e àqueles que ainda não conseguiram encontrar seu "Graal", embora eu mostre alguns recursos de construção de níveis que não vi em outros fóruns. Sendo assim, algumas partes podem ser úteis também para usuários avançados. Por outra parte, quanto aos gurus, eu os convido ao diálogo e à crítica...