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:
- Baixe, descompacte e compile o Study.mq5 e o test.mq5 em https://www.mql5.com/pt/articles/download/12853.zip
- No Strategy Tester, execute o Study.ex5 uma vez, conforme indicado em https://c.mql5.com/2/55/Study.png
- 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.
- 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
- (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.
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;
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.
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso
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:
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.
Infelizmente, fora do conjunto de treinamento, os resultados do EA foram mais modestos.
Autor: Dmitriy Gizlyk