Os resultados da otimização diferem dos testes individuais sobre eles - página 6

 

Vejo que a questão dos testes de propagação tem sido levantada repetidas vezes. Recentemente cheguei a um sistema que parece mais ou menos sério (em termos de comércio real) e, portanto, requer testes minuciosos. E também se preocuparam com esta questão. Como resultado, escrevi um roteiro simples que estabelece o spread necessário para os testes offline.

O princípio é bem conhecido, no arquivo symbols.sel Ask é sobregravado. Assim, no terminal offline, copie-o da pasta de histórico para a pasta experts/files, abra o script, depois feche o terminal, copie símbolos.sel de volta e abra o terminal novamente.

P.S. Substituindo o roteiro, uma pequena supervisão era, se alguém de repente tivesse tempo de pegar SetSpread e não SetSpread_1, precisaria baixar novamente.

Arquivos anexados:
 
O mesmo problema. Eu obtenho os mesmos resultados durante a otimização, mas os resultados são drasticamente diferentes durante as corridas simples. Graças ao Mathemat por me indicar a direção certa.

Mathemat:
Tenha cuidado com os objetos durante os testes. É melhor não usá-los de forma alguma.

Compartilharei o que aconteceu e como foi resolvido, talvez alguém o considere útil. Eu escrevi meu próprio indicador, utilizando linhas de tendência. O indicador passou o número de linhas de tendência quebradas para a variável global do terminal. Foi assim:

GlobalVariableSet("GV_name", number);

e no Consultor Especialista assumiu o valor de

int dc = GlobalVariableGet("GV_name");

Tudo estava bem no visualizador e em testes únicos. Assim, decidi economizar ao declarar uma variável "extra" para reduzir o tamanho do código. Depois de corrigir o código da seguinte maneira, tudo começou a funcionar com resultados idênticos tanto no otimizador quanto nos testes únicos.

string GlobVar = "GV_name";  // объявил переменную в индикаторе на глобальном уровне программы

int start(){
  GlobalVariableSet(GlobVar, number);
}
string GlobVar;  // объявил переменную в советнике на глобальном уровне программы
int dc;

int start(){
  dc = GlobalVariableGet(GlobVar);
}

Assim, a definição de variáveis globais no indicador e na EA fez com que tudo funcionasse corretamente.

 

Boa noite, colegas.

Decidi reanimar este tópico, pois encontrei um problema idêntico.

Meu Expert Advisor não utiliza objetos gráficos. Eu estabeleço um spread personalizado que é o mesmo em todos os lugares. No entanto, os testes únicos são muito diferentes dos resultados de otimização. Além disso, eu fiz testes individuais em computadores diferentes e todos eles são parecidos, mas não coincidem com os resultados da otimização.

Talvez alguém tenha encontrado uma solução?

 
Andrey Kaunov:

Boa noite, colegas.

Decidi reanimar este tópico, pois encontrei um problema idêntico.

Meu Expert Advisor não utiliza objetos gráficos. Eu estabeleço um spread personalizado que é o mesmo em todos os lugares. No entanto, os testes únicos são muito diferentes dos resultados de otimização. Além disso, eu fiz testes individuais em computadores diferentes e todos eles são parecidos, mas não coincidem com os resultados da otimização.

Talvez alguém tenha encontrado uma solução?

Por que eles deveriam ser os mesmos? Se apenas por uma análise total dos parâmetros e seleção da melhor opção. Mas isto é caro e exige muitos recursos. É por isso que usamos algoritmos genéticos. E eles são essencialmente construídos assim: amostragem aleatória de conjuntos de parâmetros a partir daqueles que estão sendo otimizados e depois escolher o melhor e uma busca mais detalhada lá. Por exemplo, 6 parâmetros. Apresentar a melhor solução é como a maior densidade em espaço de 6 dimensões. E pode haver muitos pontos de densificação. Um bom algoritmo dá clareamentos volumétricos 6-dimensionais suaves com não muitas densidades e a otimização os encontrará, e se o algoritmo der densidades acentuadas, então os resultados podem ser aleatórios. ou seja, a otimização encontrará densidades, mas não sempre o mesmo conjunto de parâmetros (mesmos modelos).

 

Valery, em vez de responder apenas para citar, permita-me...

eugene-last:

Um... Acho que muitas pessoas simplesmente se recusam a entender o problema. Ou se afastar deliberadamente.

O que é otimização e o que é um único teste? Resposta: a otimização é vários testes individuais.
O que isso significa? Resposta: significa teoricamente que o resultado da otimização é o mesmo e acaba tendo o mesmo resultado que o teste único.

Bem, na prática, acontece que este não é o caso. E o Expert Advisor (não é uma máxima, a propósito, eu vejo isso incomodando algumas pessoas aqui) não falha porque o único teste mostra exatamente o mesmo resultado. Então por que este único teste de otimização dá um resultado diferente ?!??!??!??!???!??

 
Andrey Kaunov:

Boa noite, colegas.

Decidi reanimar este tópico, pois encontrei um problema idêntico.

Meu Expert Advisor não utiliza objetos gráficos. Eu estabeleço um spread personalizado que é o mesmo em todos os lugares. Entretanto, os testes únicos são muito diferentes dos resultados de otimização. Além disso, eu fiz testes individuais em computadores diferentes e todos eles são parecidos, mas não coincidem com os resultados da otimização.

Talvez alguém tenha encontrado uma solução?

Verifique se todas as variáveis estão inicializadas, embora no passado na MQL4 - variáveis não inicializadas eram iguais a 0, agora eu não sei.

2, se você usa arrays dinâmicos - você precisa verificar o resultado do ArrayResize() - eu tive este problema, fiz EA para 4-5 indicadores, descobri que um indicador comeu toda a memória, e em EA, nem sempre o ArrayResize() marcou o tamanho solicitado do array - funcionou uma vez ou não. Se não estou enganado, a MQL4 tem cerca de 3Gb de memória máxima para os programas MQL, o terminal é de 32 bits.

 
Andrey Kaunov:

Valery, em vez de responder, vou apenas citar...

Eu não sei exatamente, não sei. A otimização não é, afinal de contas, uns poucos testes, mas muitos. Por isso, em nome da velocidade, talvez os dados de entrada possam ser diferentes. Para chegar ao fundo desta questão, precisamos de códigos de problemas simples e reprodutíveis. Então talvez os desenvolvedores respondam.

 
Igor Makanu:

1. verificar se todas as variáveis são inicializadas, embora anteriormente na MQL4 - variáveis não inicializadas eram iguais a 0, agora eu não sei, pela maneira como também se trata de indicadores

2, se você usa arrays dinâmicos - você precisa verificar o resultado do ArrayResize() - eu tive este problema, fiz EA para 4-5 indicadores, descobri que um indicador comeu toda a memória, e em EA, nem sempre o ArrayResize() marcou o tamanho solicitado do array - ele funcionou e não funcionou em nenhuma outra ocasião. Se não me engano, a MQL4 tem cerca de 3Gb de memória no máximo para os programas MQL, o terminal tem 32 bits.

Igor, obrigado pela dica. Vou tentar fazer algumas pesquisas nesse sentido.

Valeriy Yastremskiy:

Não tenho certeza, não sei. Portanto, os dados de entrada podem ser diferentes por causa da velocidade. Para chegar ao fundo desta questão, precisamos de códigos de problemas simples e reprodutíveis. Então talvez os desenvolvedores respondam.

Bem, nada deveria ser diferente, caso contrário, perde-se todo o objetivo da otimização. E os desenvolvedores não respondem a nada há 10 anos...

 
Andrey Kaunov:

Igor, obrigado pela dica. Vou tentar cavar nessa direção.

Bem, nada deveria ser diferente, caso contrário, perde-se todo o objetivo da otimização. E os desenvolvedores não respondem a nada há 10 anos.

Os desenvolvedores não compreendem as palavras e as reclamações. Somente código compreensível que reproduz o problema).

 
Igor Makanu:

1. verificar se todas as variáveis são inicializadas, embora anteriormente na MQL4 - variáveis não inicializadas eram iguais a 0, agora eu não sei, pela maneira como também se trata de indicadores

2, se você usa arrays dinâmicos - você precisa verificar o resultado ArrayResize() - eu tive este problema, fiz EA em 4-5 indicadores, descobri que um indicador comeu toda a memória, e em meu EA, ArrayResize() nem sempre deu o tamanho de arrays solicitado - ele funcionou uma vez ou não. Se não me engano, na MQL4 a memória é cerca de 3Gb máx. para os programas MQL, o terminal é de 32 bits.

Há zeros em 4 e lixo em 5. Da última vez, tais problemas pareciam ter sido resolvidos exatamente por encontrar variáveis que foram inicializadas fora do OnInit e alteradas durante a execução da otimização, ou seja, durante

no passe seguinte, eles não acabaram com seu valor original.

Razão: