Discussão do artigo "Redes neurais de maneira fácil (Parte 47): Espaço contínuo de ações"

 

Novo artigo Redes neurais de maneira fácil (Parte 47): Espaço contínuo de ações foi publicado:

Neste artigo, estamos ampliando o escopo das tarefas do nosso agente. No processo de treinamento, incluiremos alguns aspectos de gerenciamento de dinheiro e risco, que são partes integrantes de qualquer estratégia de negociação.

Em nossos trabalhos anteriores, ensinamos o agente apenas a determinar a direção das negociações. O escopo de ações do Agente estava limitado a apenas 4 opções:

  • comprar, 
  • vender, 
  • segurar/esperar,
  • fechar todas as posições.

Aqui, não vimos funções de gerenciamento de capital e riscos. Em todas as operações de negociação, usamos um lote mínimo. Isso é suficiente para avaliar abordagens de treinamento, mas não é suficiente para construir uma estratégia de negociação. Uma estratégia de negociação lucrativa deve ter um algoritmo de gerenciamento de capital.

Além disso, para criar uma estratégia de negociação estável, é necessário gerenciar os riscos. Esse componente também estava ausente em nossos desenvolvimentos. Sim, o EA avaliava a situação de mercado a cada nova vela de negociação e tomava decisões de negociação. Mas cada vela subsequente carrega riscos para nossa conta. O movimento de preços dentro de uma vela pode ser prejudicial para nosso saldo. É por isso que sempre é recomendável usar ordens de stop-loss. Esse método simples nos permite limitar os riscos em uma única negociação.

Após cerca de 3000 passagens, consegui obter um modelo capaz de gerar lucro no conjunto de treinamento. Durante o período de treinamento de 5 meses, o modelo realizou 334 negociações, sendo mais de 84% delas lucrativas. Como resultado, um lucro de 33% foi alcançado em relação ao capital inicial. Além disso, a redução no saldo foi inferior a 1%, e a redução no equilíbrio foi de 7,6%. O fator de lucro ultrapassou 26, e o fator de recuperação foi de 3,16. O gráfico abaixo mostra uma tendência de aumento no saldo. Além disso, a linha de saldo quase sempre fica abaixo da linha de equilíbrio, o que indica a abertura de posições na direção correta. Ao mesmo tempo, a carga no depósito é de cerca de 20%, o que é um valor relativamente alto, mas não excede o lucro acumulado.

Resultados de treinamento de modelo

Resultados de treinamento de modelo

Infelizmente, fora do conjunto de treinamento, os resultados do EA foram mais modestos.

Autor: Dmitriy Gizlyk

 
Olá. O Expert Advisor para de abrir negociações depois de 30-50 passagens. Isso é normal ou algo deve ser corrigido? Fiz de 5 a 7 tentativas com novos arquivos de modelo. Quando o número de passagens é um pouco maior, ele continua a abrir negociações, e quando é um pouco menor, ele continua a abrir negociações. Mas ainda assim deixa de abrir negociações. Tentei treinar um dos modelos em 4.000 passagens. O resultado é o mesmo: uma linha reta.
 
Viktor Kudriavtsev #:
Olá. O Expert Advisor para de abrir negociações depois de 30-50 passagens. Isso é normal ou algo deve ser corrigido? Fiz de 5 a 7 tentativas com novos arquivos de modelo. Quando o número de passagens é um pouco maior, ele continua a abrir negociações, e quando é um pouco menor, ele continua a abrir negociações. Mas ainda assim deixa de abrir negociações. Tentei treinar um dos modelos em 4.000 passagens. O resultado é o mesmo - uma linha reta.

Bom dia, Victor.

O treinamento de um modelo é um processo bastante longo. O coeficiente de treinamento na biblioteca é definido como 3,0e-4f. Ou seja, se você treinar o modelo com apenas um exemplo, ele o aprenderá em cerca de 4.000 iterações. Essa pequena taxa de aprendizado é usada para que o modelo possa calcular a média dos pesos para maximizar o ajuste à amostra de treinamento.

Com relação à falta de transações, esse não é um motivo para interromper o processo de aprendizado. O processo de treinamento do modelo se assemelha a um método de "tentativa e erro". O modelo tenta gradualmente todas as opções possíveis e procura uma maneira de maximizar a recompensa. Ao criar o processo de aprendizado, adicionamos uma penalidade para a ausência de negociações, o que deve estimular o modelo a abrir posições. Se, em algum momento, o modelo não fizer nenhuma negociação, depois de uma ou mais repetições, a penalidade deverá fazer seu trabalho e tirar o modelo desse estado. Para acelerar esse processo, você pode aumentar a penalidade por ausência de negociações. Mas é preciso ter cuidado, pois ela não deve exceder a possível perda de uma negociação. Caso contrário, o modelo abrirá posições não lucrativas para evitar a penalidade por sua ausência.

 

Dmitriy Gizlyk Muito obrigado pelo artigo detalhado. Treinei novamente o modelo entre 1º de janeiro de 2023 e 31 de maio de 2023 para produzir DDPGAct.nnw e DDPGCrt.nnw. No entanto, ao testar o EA com test.ex5, não houve uma única negociação.

Tomei as seguintes medidas:

  1. Baixe, descompacte e compile o Study.mq5 e o test.mq5 em https://www.mql5.com/pt/articles/download/12853.zip
  2. No Strategy Tester, execute o Study.ex5 uma vez, conforme indicado em https://c.mql5.com/2/55/Study.png
  3. No testador de estratégias, otimize o Study.ex5 conforme indicado em https://c.mql5.com/2/55/Study_opt.png; veja o arquivo Optimized.png em anexo.
  4. No testador de estratégias, execute o arquivo test.ex5 (otimização: desativada) para o mesmo período entre 1º de janeiro de 2023 e 31 de maio de 2023
  5. (Nenhum erro e nenhuma negociação!)

Tentando depurar com as seguintes linhas PrintFormat :

...
   double sell_sl = NormalizeDouble(Symb.Bid() + ActorResult[5], Symb.Digits());
   PrintFormat("ActorResult[0]=%f  ActorResult[1]=%f ActorResult[2]=%f buy_sl=%f",ActorResult[0], ActorResult[1],  ActorResult[2], buy_sl);
   PrintFormat("ActorResult[3]=%f  ActorResult[4]=%f ActorResult[5]=%f sell_tp=%f",ActorResult[0], ActorResult[1],  ActorResult[2], sell_tp);
//---
   if(ActorResult[0] > 0 && ActorResult[1] > 0 && ActorResult[2] > 0 && buy_sl > 0)
      Trade.Buy(buy_lot, Symb.Name(), Symb.Ask(), buy_sl, buy_tp);
   if(ActorResult[3] > 0 && ActorResult[4] > 0 && ActorResult[5] > 0 && sell_tp > 0)
      Trade.Sell(sell_lot, Symb.Name(), Symb.Bid(), sell_sl, sell_tp);
...

revisei o seguinte:

...
2023.12.01 23:15:18.641	Core 01	2023.05.30 19:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.072910
2023.12.01 23:15:18.641	Core 01	2023.05.30 19:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.070290
2023.12.01 23:15:18.641	Core 01	2023.05.30 20:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.072830
2023.12.01 23:15:18.641	Core 01	2023.05.30 20:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.070210
2023.12.01 23:15:18.641	Core 01	2023.05.30 21:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.072450
2023.12.01 23:15:18.641	Core 01	2023.05.30 21:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.069830
2023.12.01 23:15:18.641	Core 01	2023.05.30 22:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.072710
2023.12.01 23:15:18.641	Core 01	2023.05.30 22:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.070090
2023.12.01 23:15:18.641	Core 01	2023.05.30 23:00:00   ActorResult[0]=0.085580  ActorResult[1]=-0.000476 ActorResult[2]=-0.000742 buy_sl=1.073750
2023.12.01 23:15:18.641	Core 01	2023.05.30 23:00:00   ActorResult[3]=0.085580  ActorResult[4]=-0.000476 ActorResult[5]=-0.000742 sell_tp=1.071130
...

Posso saber o que deu errado ou o que não aconteceu, por favor?

Muito obrigado.

Dmitriy Gizlyk
Dmitriy Gizlyk
  • 2023.11.30
  • www.mql5.com
Trader's profile
Arquivos anexados:
Optimized.png  187 kb
 

Olá. Parece-me que o problema não é que o modelo não abre negociações, mas que ele não está configurado para obter lucro. A linha reta na captura de tela diz exatamente isso. Algo precisa ser feito nas regras de recompensa.

float reward = (account[0] - PrevBalance) / PrevBalance;

se(conta[0] == PrevBalance)
se((valor_de_compra + valor_de_venda) == 0)

reward -= 1;

Tentei estas variantes

float reward = (account[0] - PrevBalance) / PrevBalance;

se(conta[0] == PrevBalance)

se((valor_compra + valor_venda) == 0)

recompensa -= 1;

se(buy_profit<10)

recompensa -= 1;

se(buy_profit>10)

a recompensa += 1;

se(sell_profit<10)

recompensa -= 1;

se(sell_profit>10)

reward += 1;

Isso não ajuda. Por favor, diga-me o que fazer.

Arquivos anexados: