Discussão do artigo "Redes neurais de maneira fácil (Parte 50): Soft Actor-Critic (otimização do modelo)"

 

Novo artigo Redes neurais de maneira fácil (Parte 50): Soft Actor-Critic (otimização do modelo) foi publicado:

No artigo anterior, implementamos o algoritmo Soft Actor-Critic, mas não conseguimos treinar um modelo lucrativo. Neste artigo, vamos realizar a otimização do modelo previamente criado para obter os resultados desejados a nível de seu funcionamento.

Continuamos a explorar o algoritmo Soft Actor-Critic. No artigo anterior, implementamos este algoritmo, mas, infelizmente, não conseguimos treinar um modelo lucrativo. Hoje, vamos discutir soluções para esse problema. Questões semelhantes já foram abordadas no artigo "Procrastinação do modelo, causas e métodos de resolução". Vou sugerir expandir nosso conhecimento nesta área e analisar novas abordagens usando nosso modelo Soft Actor-Critic como exemplo.




Antes de prosseguir diretamente para a otimização do modelo que construímos, gostaria de lembrar que o Soft Actor-Critic é um algoritmo de aprendizado por reforço para modelos estocásticos em espaços de ação contínua. A principal característica deste método é a introdução de um componente de entropia na função de recompensa.

O uso de uma política estocástica do Ator permite que o modelo seja mais flexível e capaz de lidar com tarefas em ambientes complexos, onde algumas ações podem ser indefinidas ou impossíveis de serem governadas por regras claras. Essa política muitas vezes é mais robusta ao lidar com dados que contêm muito ruído, uma vez que leva em consideração o aspecto probabilístico em vez de estar vinculada a regras rígidas.

Autor: Dmitriy Gizlyk

 
//--- Ator
ator.Clear();
//--- Camada de entrada
Se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
int prev_count = descr.count = (HistoryBars * BarDescr);
descr.window = 0;
descr.activation = None;
descr.optimisation = ADAM;
se(!actor.Add(descr))
{
excluir descr;
return false;
}
// Camada 1 | Camada de atenção multicamada com várias cabeças - 1
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.otimização = ADAM;
Se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 1: Camada de atenção multicamada com várias cabeças - 1: Dados passados com sucesso.\n");
//--- camada 2 | camada de normalização de lote
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBatchNormOCL;
descr.count = prev_count;
descr.batch = 1000;
descr.activation = None;
descr.otimização = ADAM;
se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 2: camada de normalização em lote: dados passados com sucesso.\n");
// Camada 3 | Camada de atenção multicamada com várias cabeças - 2
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.otimização = ADAM;
Se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 3: Camada de atenção multicamada com várias cabeças - 2: Dados passados com sucesso.\n");
//--- camada 2
se(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count - 1;
descr.window = 2;
descr.step = 1;
descr.window_out = 8;
descr.activation = LReLU;
descr.otimização = ADAM;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 3
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = 8;
descr.step = 8;
descr.window_out = 8;
descr.activation = LReLU;
descr.otimização = ADAM;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 7 | camada convolucional - 4
se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 8;
descr.step = 1;
descr.window_out = 9;
descr.activation = LReLU;
descr.otimização = ADAM;
se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 7: Camada convolucional - 4: Dados passados com sucesso.\n");
//--- camada 8 | camada convolucional - 5
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 9;
descr.step = 1;
descr.window_out = 7;
descr.activation = LReLU;
descr.otimização = ADAM;
se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 8: Camada convolucional - 5: Dados passados com sucesso.\n");
//--- camada 9 | camada convolucional - 6
se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 7;
descr.step = 1;
descr.window_out = 5;
descr.activation = LReLU;
descr.otimização = ADAM;
se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 9: Camada convolucional - 6: Dados passados com sucesso.\n");
//--- camada 10 | camada convolucional - 7
se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = 5;
descr.step = 1;
descr.window_out = 4;
descr.activation = LReLU;
descr.otimização = ADAM;
se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 10: Camada convolucional - 7: Dados passados com sucesso.\n");
// Camada 11 | Camada de atenção multicamada com várias cabeças - 3
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.otimização = ADAM;
Se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 11: Camada de atenção multicabeça multicamadas - 3: Dados passados com sucesso.\n");
// Camada 12 | Camada de atenção multicabeça multicamadas - 4
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.otimização = ADAM;
Se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 12: Camada de atenção multicabeça multicamadas - 4: Dados passados com sucesso.\n");
// Camada 13 | Camada de atenção multicabeça multicamadas - 5
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.otimização = ADAM;
Se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 13: Camada de atenção multicamada com várias cabeças - 5: Dados passados com sucesso.\n");
//--- camada 4
se(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.optimisation = ADAM;
descr.activation = LReLU;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 5
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 1024;
descr.activation = LReLU;
descr.otimização = ADAM;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
// Camada 13 | Camada de atenção multicamada com várias cabeças - 5
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.otimização = ADAM;
Se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 13: Camada de atenção multicamada com várias cabeças - 5: Dados passados com sucesso.\n");
//--- camada 6
se(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConcatenate;
descr.count = LatentCount;
descr.window = prev_count;
descr.step = AccountDescr;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
excluir descr;
return false;
}
//--- camada 16 | Camada Softmax
se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronSoftMaxOCL;
descr.count = 1024;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada Softmax: dados passados com sucesso.\n");
//--- camada 7
se(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 8
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 8
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 2048;
descr.activation = LReLU;
descr.optimisation = ADAM;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 9
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronSoftActorCritic;
descr.count = NActions;
descr.window_out = 32;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- Crítico
critic.Clear();
//--- Camada de entrada
Se(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.window = 0;
descr.activation = None;
descr.optimisation = ADAM;
se(!critic.Add(descr))
{
excluir descr;
return false;
}
//--- camada 1
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronConcatenate;
descr.count = 1024;
descr.window = prev_count;
descr.step = 6;
descr.optimisation = ADAM;
descr.activation = LReLU;
se(!critic.Add(descr))
{
excluir descr;
return false;
}
//--- camada 2
se(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
se(!critic.Add(descr))
{
excluir descr;
return false;
}
//--- camada 3
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!critic. Add(descr))
{
excluir descr;
return false;
}
--- camada 4
se(!( descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1;
descr.optimisation = ADAM;
descr.activation = None;
if(!critic. Add(descr))
{
excluir descr;
return false;
}
//---
return true;
}
 
//--- Ator
ator.Clear();
//--- Camada de entrada
Se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
int prev_count = descr.count = (HistoryBars * BarDescr);
descr.window = 0;
descr.activation = None;
descr.optimisation = ADAM;
se(!actor.Add(descr))
{
excluir descr;
return false;
}
// Camada 1 | Camada de atenção multicamada com várias cabeças - 1
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.otimização = ADAM;
Se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 1: Camada de atenção multicamada com várias cabeças - 1: Dados passados com sucesso.\n");
//--- camada 2 | camada de normalização de lote
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBatchNormOCL;
descr.count = prev_count;
descr.batch = 1024;
descr.activation = None;
descr.otimização = ADAM;
se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 2: camada de normalização em lote: dados passados com sucesso.\n");
// Camada 3 | Camada de atenção multicamada com várias cabeças - 2
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.otimização = ADAM;
Se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 3: Camada de atenção multicamada com várias cabeças - 2: Dados passados com sucesso.\n");
//--- camada 4
se(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count - 1;
descr.window = 2;
descr.step = 1;
descr.window_out = 8;
descr.activation = LReLU;
descr.otimização = ADAM;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 5
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = 8;
descr.step = 8;
descr.window_out = 8;
descr.activation = LReLU;
descr.otimização = ADAM;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 6 | camada convolucional - 4
se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 8;
descr.step = 1;
descr.window_out = 9;
descr.activation = LReLU;
descr.otimização = ADAM;
se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 7: Camada convolucional - 4: Dados passados com sucesso.\n");
//--- camada 7 | camada convolucional - 5
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 9;
descr.step = 1;
descr.window_out = 7;
descr.activation = LReLU;
descr.otimização = ADAM;
se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 8: Camada convolucional - 5: Dados passados com sucesso.\n");
//--- camada 8 | camada convolucional - 6
se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = BarDescr;
descr.window = 7;
descr.step = 1;
descr.window_out = 5;
descr.activation = LReLU;
descr.otimização = ADAM;
se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 9: Camada convolucional - 6: Dados passados com sucesso.\n");
//--- camada 9 | camada convolucional - 7
se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConvOCL;
prev_count = descr.count = prev_count;
descr.window = 5;
descr.step = 1;
descr.window_out = 4;
descr.activation = LReLU;
descr.otimização = ADAM;
se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 10: Camada convolucional - 7: Dados passados com sucesso.\n");
// Camada 10 | Camada de atenção multicamada com várias cabeças - 3
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.otimização = ADAM;
Se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 11: Camada de atenção multicabeça multicamadas - 3: Dados passados com sucesso.\n");
// Camada 11 | Camada de atenção multicabeça multicamadas - 4
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.otimização = ADAM;
Se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 12: Camada de atenção multicamada com várias cabeças - 4: Dados passados com sucesso.\n");
//--- camada 12
se(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronLSTMOCL;
descr.count = 1024;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 13
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = 1024;
descr.activation = LReLU;
descr.otimização = ADAM;
se(!actor.Add(descr))
{
excluir descr;
return false;
}
// Camada 14 | Camada de atenção multicamada com várias cabeças - 5
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.otimização = ADAM;
Se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 13: Camada de atenção multicamada com várias cabeças - 5: Dados passados com sucesso.\n");
//--- camada 15
se(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConcatenate;
descr.count = LatentCount;
descr.window = prev_count;
descr.step = AccountDescr;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
if(!actor.Add(descr))
{
excluir descr;
return false;
}
//--- camada 16 | Camada Softmax
se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronSoftMaxOCL;
descr.count = 1024;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
se (!actor.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada Softmax: dados passados com sucesso.\n");
//--- camada 17
se(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activation = LReLU;
descr.optimisation = ADAM;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 18
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 19
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 20
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1024;
descr.activation = LReLU;
descr.optimisation = ADAM;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- camada 21
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronSoftActorCritic;
descr.count = NActions;
descr.window_out = 32;
descr.optimisation = ADAM;
descr.activation = SIGMOID;
se(!ator.Add(descr))
{
excluir descr;
return false;
}
//--- Crítico
critic.Clear();
//--- Camada de entrada
Se(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronBaseOCL;
prev_count = descr.count = LatentCount;
descr.window = 0;
descr.activation = None;
descr.optimisation = ADAM;
if(!critic.Add(descr))
{
excluir descr;
return false;
}
// Camada 1 | Camada de atenção multicamada com várias cabeças - 4
Se (!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronMLMHAttentionOCL;
descr.count = 512;
descr.activation = LReLU;
descr.otimização = ADAM;
se (!critic.Add(descr))
{
excluir descr;
return false;
}
PrintFormat("[Ator] Camada 12: Camada de atenção multicamada com várias cabeças - 4: Dados passados com sucesso.\n");
//--- camada 2
se(!(descr = new CLayerDescription()))
return false;
descr.type = defNeuronConcatenate;
descr.count = 512;
descr.window = prev_count;
descr.step = 6;
descr.optimisation = ADAM;
descr.activation = LReLU;
se(!critic.Add(descr))
{
excluir descr;
return false;
}
//--- camada 3
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activation = LReLU;
descr.optimisation = ADAM;
se(!critic.Add(descr))
{
excluir descr;
return false;
}
//--- camada 4
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activation = LReLU;
descr.optimisation = ADAM;
se(!critic.Add(descr))
{
excluir descr;
return false;
}
//--- camada 5
se(!(descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 512;
descr.activation = LReLU;
descr.optimisation = ADAM;
if(!critic. Add(descr))
{
excluir descr;
return false;
}
--- camada 6
se(!( descr = new CLayerDescription())))
return false;
descr.type = defNeuronBaseOCL;
descr.count = 1;
descr.optimisation = ADAM;
descr.activation = None;
if(!critic. Add(descr))
{
excluir descr;
return false;
}
//---
return true;


A imagem também pode ser simplesmente arrastada para o texto ou colada com Ctrl+V
 
A pesquisa não consegue obter nenhuma transação positiva. Não há arquivos no diretório de dados. O arquivo SoftAC.bd na pasta de dados compartilhados parece estar vazio (12 bytes). O estudo não está aderindo ao gráfico. Você pode me dizer o que fazer?
 
star-ik #:
A pesquisa não consegue obter nenhuma transação positiva. Não há arquivos no diretório de dados. O arquivo SoftAC.bd na pasta de dados compartilhados parece estar vazio (12 bytes). O estudo não está aderindo ao gráfico. Você pode me dizer o que fazer?

1. a diferença de negociações positivas nas primeiras passagens da pesquisa é bastante natural, pois são usadas redes absolutamente aleatórias. E as negociações serão igualmente aleatórias. Ao iniciar o Expert Advisor, defina o MinProfit como o mais negativo possível. Em seguida, o arquivo SoftAC.bd será preenchido com exemplos para o treinamento inicial do modelo.

2. Há uma verificação no arquivo Study. Ela não funciona na ausência de exemplos no SoftAC.bd. Ele não tem dados para o treinamento do modelo.

 
Obrigado, isso ajudou. Os pontos verdes começaram a aparecer. Eu não sabia que o MinProfit poderia ser definido em um intervalo negativo. Mas há mais uma pergunta. Tenho que excluir o primeiro banco de dados manualmente? E qual arquivo?
 
star-ik #:
Obrigado, isso ajudou. Os pontos verdes começaram a aparecer. Eu não sabia que o MinProfit poderia ser definido em um intervalo negativo. Mas há mais uma pergunta. Tenho que excluir o primeiro banco de dados manualmente? E qual arquivo?

Todo o banco de dados de exemplo está em SoftAC.bd. Excluí o primeiro manualmente. Mas há uma constante MaxReplayBuffer 500 no Expert Advisor, que limita o tamanho do banco de dados de exemplos a 500 trajetórias. Se quiser, você pode alterar e recompilar os arquivos. Isso permite que você mantenha apenas as últimas 500 trajetórias no banco de dados de exemplos.

 
Dmitriy Gizlyk #:

Todo o banco de dados de exemplo está em SoftAC.bd. Excluí o primeiro manualmente. Mas o Expert Advisor tem uma constante MaxReplayBuffer 500, que limita o tamanho do banco de dados de exemplos a 500 trajetórias. Se quiser, você pode alterar e recompilar os arquivos. Isso permite que você mantenha apenas as últimas 500 trajetórias no banco de dados de exemplos.

Mais uma vez, obrigado.

 

Dmitry, ao preencher o banco de dados de exemplos e adicionar novos exemplos, os exemplos mais antigos são excluídos ou são excluídos acidentalmente? Ou é necessário ter um banco de dados de exemplos para todo o número de negociações, levando em conta as adições no treinamento, um banco de dados de 1.000 trajetórias?

E está escrito que você fez o teste com o Expert Advisor Test.mqh (após 500.000 iterações de treinamento) 10 vezes, se entendi corretamente. E então você disse que fez a coleta - treinamento - teste mais 15 vezes (ciclos). E você obteve um modelo funcional. Então, não entendi: você executou o Expert Advisor Test.mqh 10 vezes em cada estágio do ciclo ou não? O problema que tenho é que, se eu fizer isso, terei mais exemplos negativos na base e o Expert Advisor eventualmente começará a negociar no negativo.

Digamos que eu tenha coletado uma base de 200 trajetórias. Eu a treinei por 100.000 iterações. Em seguida, adicionei 10 passagens do teste e o Research.mqh adicionou 10 a 15 novos exemplos ao banco de dados. Defino o limite do MinProfit, por exemplo, -3000.

Faço o próximo treinamento (100.000 iterações). Novamente, adiciono 10 passagens de teste e 10-15 do Research.mqh. Defino o MinProfit, por exemplo, como -2500.

Treino novamente (100.000 iterações). Novamente 10 testes e 10-15 exemplos de Research.mqh. MinProfit=-2000.

E assim por diante. Estou entendendo? O que me confunde é o fato de que o teste geralmente dá passes negativos muito grandes com -7000 ou até -9000. E haverá muitos deles na base. A rede não foi treinada para negociar no negativo de propósito?

E o que fazer se os testes derem um resultado pior que o anterior? Devo alterar o MinProfit para o lado negativo? E o que fazer se o Research.mqh não conseguir encontrar e adicionar nada ao banco de dados para 100 passagens com um limite especificado (por exemplo, MinProfit=-500) ?

 
Viktor Kudriavtsev número de negócios, levando em conta as adições no treinamento, uma base de, digamos, 1.000 trajetórias?

As mais antigas são excluídas. Ele é organizado de acordo com o princípio FIFO - primeiro a entrar, primeiro a sair.

 
Viktor Kudriavtsev #:

E aqui está escrito que você fez o teste com o Expert Advisor Test.mqh (após 500.000 iterações de treinamento) 10 vezes, se entendi corretamente. E então você disse que fez a coleta - treinamento - teste mais 15 vezes (ciclos). E você obteve um modelo funcional. Então, não entendi: você executou o Expert Advisor Test.mqh 10 vezes em cada estágio do ciclo ou não? O problema que tenho é que, se eu fizer isso, obtenho mais exemplos negativos na base e o Expert Advisor acaba começando a negociar no negativo.

Condicionalmente, faço 10 execuções únicas no testador de estratégia para estimar os limites de dispersão dos resultados do modelo. E escolho o quantil superior para selecionar as melhores trajetórias durante a coleta subsequente de trajetórias no modo de otimização.