Arranquemos o lucro até o último pip

fxsaber | 5 agosto, 2019

Introdução

Este artigo é sobre uma das possíveis abordagens da negociação algorítmica. MetaQuotes não tem relação direta com as plataformas de negociação e se destina a grandes massas de leitores. Se um termo não estiver claro, use a pesquisa. Aqui é resolvida a tarefa de obter um sistema de negociação lucrativo (ou robô).

Onde cavar?

Esse tipo de tarefa é definido por cada trader. Isso foi feito milhões de vezes. Pode-se escolher um caminho já percorrido e imediatamente mudar para outro artigo. Mas é lógico encontrar um tesouro onde ele existe e, além disso, ele não é procurado pela multidão.

Terra

A maior parte da conversa sobre a criação de sistemas de negociação está associada ao uso de barras históricas de preços e vários indicadores. Este é um campo bem desgastado que não tocaremos. As barras são uma entidade completamente artificial, por isso, vamos dar algo mais próximo a protoinformações - ticks. Esse tipo de abordagem nos dará alguma vantagem informacional sobre a multidão.

A tarefa de obter lucro é bastante difícil, é por isso que existe a opinião de que ela precisa ser resolvida por métodos intelectuais complexos: aprendizado de máquina, modelos matemáticos econométricos, etc. Eles têm uma desvantagem significativa: tardam muito tempo em serem criados e testados, devido à complexidade computacional. Portanto, vamos pelo caminho oposto: idéias muito simples e rápidas. Isso possibilitará a busca de padrões de mercado não num só lugar, mas, sim, muito extensivamente.

Sim, esse método parece estúpido. Mas há tanta informação que não é razonável procurar um tesouro em apenas um lugar pequeno e com um pequeno pincel de arqueólogo. Portanto, é necessária uma boa ferramenta para pesquisa. Ela deve ser capaz de trabalhar com bilhões de ticks, ser rápida, visualizar o encontrado convenientemente. Adicionalmente, é melhor que suas instruções sejam curtas e claras.

Pá mecânica para escavações arqueológicas

Se você possui algum conhecimento matemático e tem projetos próprios que atendem a esses requisitos, então, ótimo. Se não, pegue o testador da plataforma MetaTrader 5.

Nesse trequinho é incorporada uma grandiosa quantidade de ticks de diferentes corretoras, adicionalmente, sabe como trabalhar com ticks de terceiros, armazena os resultados dos cálculos em seu banco de dados e exibe vários parâmetros razoavelmente bem. Também tem seu próprio otimizador multitarefa baseado em pesquisa detalhada simples e genética segundo critérios do usuário.

Algoritmo de negociação

Precisamos de uma ideia simples e rápida na forma de um algoritmo de negociação. Isso pode se tratar de qualquer coisa. O principal é que seja rápido. Para isso, é bom evitar os ciclos dentro do algoritmo. Após recebermos um novo tick, fazemos algo muito rapidamente e saímos.

Uma das variantes de tal algoritmo formou a base deste texto. Pode parecer que esse é o destaque do artigo, que deve ser divulgado para ser útil. Mas não é assim. O artigo mostra algo um pouco diferente. Assim, o algoritmo usado está oculto.

MQL5

O algoritmo de negociação é criado na forma de um EA em MQL5. Nós abandonamos barras e indicadores. Por isso, existem apenas ticks e trabalho com ordens (e seu histórico). É aconselhável escrever esse tipo de EAs em MQL4, e depois converter como uma linha em MQL5 através da biblioteca de negociação MT4Orders.

#include <MT4Orders.mqh> // https://www.mql5.com/pt/code/16006

Isso faz com que o código seja multiplataforma (ele funcionará em MetaTrader 4/5) e abra a porta para o uso de algumas bibliotecas úteis. O algoritmo de negociação precisa ser escrito rapidamente. Para o testador, ele deve ter um mínimo de verificações.

Fonte

Onde você obtém informações sobre preços para sua pesquisa? Existem muitas fontes de ticks. E é lógico primeiro decidir entre elas.

Talvez seja mais provável encontrar uma pepita de ouro na rocha onde a concentração de ouro é maior. Portanto, tomamos a fonte de ticks em que há mais lucro potencial. O método para determinar esse critério comparativo foi descrito neste comentário. Com base neste método foi selecionado este arquivo de dados de ticks de muitos gigabytes. Bilhões de ticks.

Ticks personalizados

Usar ticks no testador do MetaTrader 5 é possível através de símbolos personalizados. Isso tudo é um tanto pesado para uma rápida compreensão, por isso, apenas usamos o script ThirdPartyTicks já preparado. Ele cria esses símbolos com base nos dados do arquivo de cotações selecionado.

ThirdPartyTicks launch window to download the entire quote of archives


Aditivo para combustível

É necessário saber trabalhar com bilhões de ticks em tempo razoável. Grosso modo, temos que gerar, de alguma forma, muitos trilhões de ticks na entrada do algoritmo de negociação ao procurar padrões. É muito demorado, por isso é necessário um mecanismo de aceleração.

Acontece que nem todos os ticks são necessários. Como conhecemos nosso algoritmo de negociação, isto é, entendemos quais ticks não causam mudanças de negociação, podemos decidir sobre ticks desnecessários e removê-los do histórico. Esse tipo de filtragem é bastante eficaz:

Total Ticks (EURAUD.rann) = 61354152 (2134296 ticks/sec.), Reserve = 80023750
Recording...
After Filter (MinPips = 5) Ticks = 7820486 (12.75%)

Ao gravar no log, pode-se ver que foi possível reduzir o número de ticks.

O testador do MetaTrader 5 é muito meticuloso (pode ser útil), gerando muitos cálculos computacionais que são supérfluos (e algumas vezes errôneos) no estudo proposto. Para evitar isso, é necessário entender suas sutilezas, o que, claro, não faremos aqui. Num dos tópicos do fórum, há uma discussão sobre este assunto.

Para não ser enganados, escrevamos o que é necessário para um algoritmo de negociação em MQL5:

Um resultado de inicialização deve ser algo assim:

Single launch 
    result

A imagem na coluna selecionada mostra que há uma virada de posições através de ordens limitadas. Além disso, são executados exatamente ao preço indicado. É muito importante uma execução clara aos preços indicados.

Finta

O comportamento do mercado depende da hora do dia. Portanto, implementamos a biblioteca BestInterval, escrevendo apenas duas linhas no código fonte do EA:

#define BESTINTERVAL_ONTESTER // critério de otimização - lucro do melhor intervalo.
#include <fxsaber\BestInterval\BestInterval.mqh> // cálculo do melhore intervalo de negociação

Isso fornece parâmetros de entrada adicionais no EA.

Parâmetros de entrada do BestInterval

Vamos otimizar de acordo com um critério do BestInterval igual ao maior lucro que o EA mostra quando negocia apenas a uma determinada hora do dia.

Pá mecânica

Assim, o algoritmo de negociação está preparado. Também estão prontos os ticks personalizados filtrados. Resta atiçar uns contra os outros através do testador  MetaTrader 5 . Aqui vem para o resgate a solução MultiTester. Ele pegará automaticamente cada símbolo personalizado e otimizará o EA.

Parâmetros de entrada para executar a otimização de todos os símbolos personalizados da Observação do Mercado.


Intervalo de otimização

É inútil otimizar com base em todo o histórico, porque não haverá maneira de entender se foi encontrado um padrão ou se é apenas um reajuste. Como tudo é feito com base num debulhador numérico, contamos com um grande número de transações.

Quanto mais transações, mais fácil é falar sobre o alcance de alguns indicadores estatísticos. Quanto menor o tempo de vida da transação média, menores os riscos. Em geral, muitas transações são boas. Embora não seja justificado corretamente.

Como é desejável que haja uma alta frequência de transações, pode-se selecionar um intervalo pequeno. Seja como for, nele é acumulada uma quantidade razoável de transações.

Intervalo para otimização.

Isso é um pouco menos do que nos últimos quatro meses.

Comecemos!


Artefatos

Para 81 símbolos (todos os dados da fonte do arquivo) todos os cálculos foram feitos em 10 horas, algumas das quais foram gastas no sono do autor. Portanto, é conveniente iniciar à noite. Como o testador do MetaTrader 5 é multinúcleo, essas 10 horas são de aquecimento adicional do local.

Nós entramos no banco de dados do testador do MetaTrader 5 e vemos caches de otimização.

Optimization caches


Ao abrir qualquer registro deste banco de dados, obtemos os resultados de otimização correspondentes do símbolo selecionado.

Todas as variantes (81) foram enumeradas manualmente. Esse processo pode ser automatizado, mas não existe implementado no momento, portanto, foi gasta uma hora. Vou me debruçar sobre apenas um símbolo, como no exemplo. A mesma coisa foi feita para todos os símbolos.

One symbol optimization results


Vemos o resultado da otimização do símbolo classificado pelo critério do BestInterval. O bom dos símbolos personalizados é que não há limite no saldo negativo. Ou seja, o tamanho do saldo não afeta a negociação. E você não pode se preocupar com isso.

É desejável que exista um grande número de transações, por isso, selecionamos uma das entradas na coluna vermelha e executamos um único teste. Sua gráfico de negociação fica assim

Round-the-clock operation chart


Isso é negociação de vinte e quatro horas. No final do log da execução única, vemos esta entrada

BestInterval Action(true - single pass & MT4-style & Virtual is required) = false

Profit = -2392.00 = -2392.00 + 0.00 (0.00%) - Amount of Delete Intervals = 0 (2019.04.01 - 2019.07.20)
00:00:00 - 23:59:59 : Profit = -2392.00 (100.00%), Total = 2612 (70.64%), PF = 0.94, Mean = -0.92, DD = 3840.00, RF = -0.62
SUMMARY: 00:00:00 - 23:59:59 : Profit = -2392.00 (100.00%), Total = 2612 (70.64%), PF = 0.94, Mean = -0.92, DD = 3840.00, RF = -0.62

Profit = 4035.00 = -2392.00 + 6427.00 (-268.69%) - Amount of Delete Intervals = 1 (2019.04.01 - 2019.07.20), 20:00 - 08:00, CountHours = 11
00:00:00 - 07:58:54 : Profit = 1074.00 (26.62%), Total = 349 (76.22%), PF = 1.21, Mean = 3.08, DD = 709.00, RF = 1.51
19:41:38 - 23:59:59 : Profit = 2961.00 (73.38%), Total = 348 (76.44%), PF = 1.94, Mean = 8.51, DD = 358.00, RF = 8.27
SUMMARY: 00:00:00 - 23:59:59 : Profit = 4035.00 (100.00%), Total = 697 (76.33%), PF = 1.49, Mean = 5.79, DD = 484.00, RF = 8.34
BestInterval is saved in "TesterEA"-file in common(MT5)/base(MT4) folder.

final balance - InitBalance (10000.00) + Profit (-2392.00) without BestInterval.
OnTester - Profit (4035.00) with BestInterval.
final balance 7608.00 USD
OnTester result 4035

Ela mostra que se houvesse um lucro de 4035 pips, seria possível negociar segundo a estratégia de negociação das 8 da noite às 8 da manhã. Para ver esta negociação, vamos para os parâmetros de entrada e indicamos precisamos ativar o BestInterval

Ativação do BestInterval.


E devemos sacar o testador do MetaTrader 5 do modo Otimização. Aqui, no testador do MetaTrader 5, isso é inconveniente, infelizmente.

Disabling optimization for BestInterval activation


Iniciamos e observamos o resultado da implementação do BestInterval

Resultado da implementação do BestInterval.


Nos logs da execução única, certificamo-nos de que tudo está processado claramente

BestInterval Action(true - single pass & MT4-style & Virtual is required) = true
Calculation time activated intervals is 2019.07.23 16:27:25 - TesterEA (common folder) 00:13:14 ago.

Amount of Delete Intervals = 1 (2019.04.01 - 2019.07.20), 20:00 - 08:00, CountHours = 11
00:00:00 - 07:58:54 : Profit = 1074.00 (26.62%), Total = 349 (76.22%), PF = 1.21, Mean = 3.08, DD = 709.00, RF = 1.51
19:41:38 - 23:59:59 : Profit = 2961.00 (73.38%), Total = 348 (76.44%), PF = 1.94, Mean = 8.51, DD = 358.00, RF = 8.27
SUMMARY: 00:00:00 - 23:59:59 : Profit = 4035.00 (100.00%), Total = 697 (76.33%), PF = 1.49, Mean = 5.79

final balance - InitBalance (10000.00) + Profit (4035.00) with BestInterval.
OnTester - Virtual InitBalance (10000.00) + Profit (-2403.00) without BestInterval. Profit is calculated with TickValue=1 and w/o Commission+Swap.
final balance 14035.00 USD
OnTester result 7597

Parece que fica quase lindo. Há muitas transações, o gráfico é bastante tranquilo. Eu não quero ficar chateado, mas é definitivamente necessário iniciar com base em todo o histórico (e quebrar-se).

Check optimization result in the entire history

Todo o tempo nós vamos ter um gráfico nojento dizendo que temos um ajuste matemático dos parâmetros para ter um bom resultado num intervalo otimizado. Mas isso não funciona em outros trechos, ou seja, se iniciarmos isso durante a negociação, haverá perdas.

'Forward'

O testador do MetaTrader 5 permite fazer testes para frente. Minha opinião é que esse teste é autoengano. Por essa razão, devemos ter apenas alguns bons resultados e iniciar com base em todo o histórico. Nenhum deles teve sucesso. O teste 'forward' também rola muitas outras variantes, o que já é um tipo de ajuste.

Ouro

Apesar de tudo, o tempo todo haverá um gráfico nojento ou há esperança? Sim, com o aumento em todo o histórico nossa variante deu esse resultado.

One of testing results in the entire history

Vermelho mostra o intervalo otimizado. Vê-se claramente que, no período muitas vezes maior do que o intervalo otimizado, há boa estabilidade.


Gravura de jóias

Na verdade, agora está claro com qual símbolo continuar trabalhando — o EURCHF. Relatório da execução mostrada acima:

Entire history trading result

Destacada a expectativa em pips. Este é o parâmetro mais importante! Acontece que a comissão em EURCHF é de ~ 4,40 pips. Isso significa que, nesse caso, será necessário doar dois três lucros para a plataforma de negociação. Isso é demais.

Por isso, removemos o BestInterval, introduzindo nos parâmetros de entrada a possibilidade de regular o tempo de negociação. Começamos a otimizar desde o final do maior drawdown. Ele é marcado em verde no gráfico acima. Se existirem muitos parâmetros, faremos genética várias vezes.

De modo que, ao procurar padrões durante a otimização, não há distorções fortes, removemos a aumento não sistêmico.

Aumento não sistêmico.

Para fazer isso, no código fonte apenas escrevemos isso

const bool TradeTime = (TimeCurrent() < D'2018.02.10') || (TimeCurrent() >= D'2018.02.12');

Como resultado, foi alcançado um amento da expectativa em duas vezes para símbolos não filtrados.

Martin/Grade

Claro, eu tentei usar vários truques na forma de grades de ordens, etc. No começo, fiquei feliz com o fato de que a expectativa estivesse crescendo muito. Mas ele não consegui explicar o motivo. No final, descobri que o testador do MetaTrader 5 calcula incorretamente nas contas de compensação. Mais precisamente, ele não coloca neste conceito o que você espera. Por essa razão, escrevi o que era necessário

// Cálculo da espectativa. Na cobertura irá coincidir com o clássico.
double OnTester()
{
  double Res = 0;
  
  if (HistorySelect(0, INT_MAX))
    for (int i = HistoryDealsTotal() - 1; i >= 0; i--)
      Res += HistoryDealGetDouble(HistoryDealGetTicket(i), DEAL_VOLUME);
  
  Res /= 2;
  
  if (Res)
    Res = TesterStatistics(STAT_PROFIT) / Res;
  
  return(Res);
}

O resultado confirmou totalmente a teoria de que a grade não pode melhorar uma estratégia de negociação bem otimizada. Esta é uma conclusão curta, mas muito ampla.

Monetização

É necessário decidir onde negociar o encontrado. Revemos as condições de negociação das corretoras (incluindo o histórico de preços) e ficamos especialmente interessados na implementação de ordens limitadas. Algumas corretoras executam ordens limitadas nos mercados, permitindo um slippage negativo. E algumas proíbem a execução parcial de ordens limitadas. Nós nos mantemos longe delas, porque já estamos lutando por cada pip (veja o título do artigo). Uma atitude desleixada em relação às condições de negociação é inaceitável.

Observe que você não precisa procurar apenas entre corretoras MetaTrader 4/5. Precisa procurar em todos os lugares. Plataforma de negociação é secundária. Sim, talvez não seja correto falar sobre o recurso MetaTrader 4/5, mas é assim. Com a estratégia de negociação primária, vamos ser objetivos.

Bem, muitas transações, porque a negociação é assim.

Exemplo de um trecho de negociação.


Foi possível encontrar um mercado adequado. As ordens limitadas iniciais chegarão rapidamente ao provedor de liquidez, o que aumentará a probabilidade de execução. Além disso, um slipage positivo pode ser o bônus. Para nós, na expectativa todo pip é importante. Isso permitirá recuperar parte do custo da comissão.

Negociação real

Esta honra foi reservada para a plataformaMetaTrader 4. Assim, a plataforma cruzada acabou sendo muito útil novamente.

Para alcançar a máxima coincidência do real com os resultados do testador, foi necessário organizar o esquema de trabalho a seguir.

Todos esses truques foram necessários por causa da luta pelo tamanho da espectativa. Mas esse esquema poderia ser aplicado a quase qualquer estratégia de negociação. Claro, é possível não se preocupar. No entanto, tive a oportunidade de observar como isso às vezes se transforma em negociação real. Por essa razão, o esquema não é desenvolvido a partir do zero.

Diversificação

Selecionar apenas uma variante de parâmetros de entrada seria muito presunçoso. Não se sabe qual variante de otimização é boa no futuro e qual não é.

Portanto, foram escolhidas apressadamente oito variantes, o saldo da conta foi dividido igualmente entre elas e foram inciadas simultaneamente (oito gráficos, cada um com um EA com seu próprio MagicNumber). Externamente, parece uma grade. Mas, ele não tem a ver com estratégias de negociação de grade. Trata-se de oito estratégias de negociação independentes.

Divisão do bolo

Suponhamos que iniciemos. E então o que fazer? Existem vários caminhos. De controle remoto (gerenciamento de confiança) e PAMMs até serviços de cópia de Sinais.

Como estamos falando de lucro, faz sentido apostar em Sinais apenas para fins de RP. Os assinante não poderão ganhar, porque receberão derrapagem negativa ao copiar. O que implicaria uma redução em suas expectativas para valores negativos, ou seja, com esse tipo de negociação é altamente provável a perda de assinantes.

A iluminação do método de negociação tem a chance de reprojetar a estratégia de negociação ou os princípios básicos. Essa é outra variante para se beneficiar do sistema de código aberto.

E, finalmente, pode-se simplesmente contemplar como mais uma vez a supostamente boa estratégia de negociação não teve sucesso. É inevitável.

Memórias

No caminho do pesquisador no campo dos algoritmos existem várias histórias, solavancos, etc. Eu me lembro de muitos casos. Recentemente foi falado de passagem sobre o EURDKK, e isto vai bem com este caso.

Resultado da estratégia de negociação otimizada no intervalo vermelho.

Esta é a imagem do resultado da estratégia de negociação otimizada no intervalo vermelho realçado. Eu definitivamente não consigo reproduzir como era então. Mas lembro que a imagem à esquerda do intervalo de otimização era muito melhor - uma linha reta. Quase um Graal que foi colocado numa conta real e ganhou exatamente o mesmo que no testador. Quando começou uma perda sistemática depois do ano novo, bastava inteligência ou experiência para desativar a negociação. A perda foi de cerca de 10% do lucro já ganho. Não é claro o que causou a fenda.

Nesta história, é importante que até o Graal causa perdas. Mas esta não é a principal razão pela qual me lembrei da história.

O principal era o símbolo NOKSEK! Muitos dos leitores já examinaram esse símbolo ou pelo menos o notaram? Por quê?


Fim do artigo

Há alguma luta filosófica no artigo: o debulhador numérico contra a abordagem intelectual clássica. Decida por si mesmo o que escolher.

Alguns truques e raciocínios podem ser úteis.

O artigo mostrou o quão verdadeira pode ser a afirmação: se você tiver uma estratégia de negociação lucrativa, é muito provável você nunca tenha conhecimento disso. Provavelmente, deitamos boas estratégias de negociação no caixote do lixo mais de uma vez. Aqui é mostrado que a verificação da estratégia de negociação não consiste apenas em iniciá-la num ou dois símbolos.

Também é visível a importância de limitar a negociação considerando a hora do dia. E não é desejável que seja algo como o método de Monte Carlo. Afinal, pode matar a conclusão sobre a rentabilidade da estratégia de negociação.

Sistemas universais são improváveis e não são necessários para extrair lucro. A luta por cada pip tem um lugar para existir,

e claro testador do MetaTrader 5 também. Principalmente ele é ótimo! Algumas coisas desapontam, mas sem ele seria impossível fazer exatamente esse estudo e explicá-lo mais ou menos facilmente. Obrigado aos desenvolvedores! E estamos aguardando melhorias.

O que não foi incluído

Estou cansado de escrever, por isso, nem tudo ficou: