Não para desenvolvedores de MT! O que substituir INIT_PARAMETERS_INCORRECT por ?

 

Encontrei este problema: de acordo com a lógica do programa, há uma necessidade de peneirar as chamadas de funções inválidas. Uso INIT_PARAMETERS_INCORRECT para isto. Mas a otimização genética pára praticamente de uma só vez. Os desenvolvedores se irritam com perguntas a respeito desta situação. Eles aconselham o estudo da análise genética, etc. e assim por diante.

Mas para que eu preciso dele? Eu, como usuário, quero obter resultados e não me importo como isso funciona.

Portanto, aqui está um exemplo sobre três funções 1, 2 e 3. 0 não é para ser usado.

Em uma cadeia, as funções não devem se repetir e não deve haver um 0 entre as funções (caso contrário, pode haver repetições).

Um exemplo de correntes permitidas:

  • 100
  • 120
  • 130
  • 123
  • 132
  • 2..
  • 3..

Exemplo de correntes inaceitáveis:

  • 010
  • 001
  • 110
  • 101
  • 111
  • 121
  • 122
  • 131
  • 133
  • 112
  • 113
  • 102
  • 103
  • 2..
  • 3..
Como você pode ver, há uma ordem de magnitude de correntes mais inválidas do que correntes válidas. Como realizar uma amostragem? Como substituir INIT_PARAMETERS_INCORRECT ? Onde eu cavo?

 
Cancelar cálculos em On-funções se os parâmetros forem canhotos. As corridas serão mais lentas queINIT_PARAMETERS_INCORRECT, mas não de forma significativa.
 
Como assim? Posso lhe dar um pequeno exemplo?
 

Você poderia ser mais explícito sobre possíveis conjuntos de parâmetros de entrada, conjuntos indesejáveis e por que existem muitos conjuntos indesejáveis?

Concordo plenamente com os desenvolvedores que não deve haver muitos conjuntos indesejáveis. O ideal é não mais do que 10%.

 
Сергей Таболин:
Como assim? Posso lhe dar um pequeno exemplo?

O fxsaber está certo.

Se um conjunto incorreto de parâmetros for inserido - você retorna todas as funções OnTick() de uma só vez. E onTester - você devolve o resultado mínimo.

 
Сергей Таболин:
Como assim? Posso lhe dar um pequeno exemplo?
input int i = 0; 

bool Incorrect;
 
int OnInit()
{
  Incorrect = !i; // нулевое значение считается некорректным (пример)
  
//  return(Incorrect ? INIT_PARAMETERS_INCORRECT : INIT_SUCCEEDED); // Было
  return(INIT_SUCCEEDED);
}

void OnTick()
{
  if (Incorrect)
    return;
    
  // ...
}
 
Estes não são conjuntos de parâmetros de entrada! Eles são um conjunto de funções que não devem ser repetidas! Na otimização lenta, o INIT_PARAMETERS_INCORRECT realmente ajuda a construir cadeias válidas para chamar estas funções, mas eu tenho 6 delas. Eu tenho 117649 variantes de correntes. Mas estas cadeias são inúteis sem alguns parâmetros de entrada. Com eles, já temos mais de 38.000.000 ! Não há como contorná-lo com força bruta lenta.
 
Сергей Таболин:
Estes não são conjuntos de parâmetros de entrada! É um conjunto de funções que não devem ser repetidas! Na otimização lenta INIT_PARAMETERS_INCORRECT realmente ajuda a construir cadeias válidas para chamar estas funções, mas eu tenho 6 delas. Eu tenho 117649 variantes de correntes. Mas estas correntes são inúteis sem alguns parâmetros de entrada. Com eles, já temos mais de 38.000.000 ! Não há como contorná-lo com força bruta lenta.

A genética morrerá porque a superfície de otimização do critério de otimização deve ser mais ou menos contínua (suave). No seu caso, no entanto, você recebe um número enorme de picos (falhas).


Você pode fazer a seguinte experiência. Pegue o Expert Advisor padrão e acrescente alguns parâmetros adicionais para otimização lá - falsos. Fazendo 90% de seus conjuntos INCORRETOS. GA vai morrer. Embora se saia muito bem sem parâmetros falsos.

 
fxsaber:

Entendi. É apenas uma questão de selecionar as funções corretas e sua ordem no otimizador. E escreva manualmente todas as cadeias impróprias.... E como o otimizador irá encontrá-los então?

 
fxsaber:

A genética morrerá porque a superfície de otimização do critério de otimização deve ser mais ou menos contínua (suave). No seu caso, no entanto, você recebe um grande número de picos (dips).

Eu entendo isso. Eu não entendo apenas como contornar isso?

 
Сергей Таболин:

Eu entendo isso. O que eu não entendo é como contornar isso?

Uma receita é que os desenvolvedores tratem o resultado dos passes INCORRETO como o passe CORRETO mais próximo calculado anteriormente. Isto irá nivelar os buracos na superfície de otimização.

Razão: