Non per gli sviluppatori di MT! Con cosa sostituire INIT_PARAMETERS_INCORRECT?

 

Ho incontrato questo problema: secondo la logica del programma, c'è la necessità di setacciare le chiamate di funzioni non valide. Io uso INIT_PARAMETERS_INCORRECT per questo. Ma l'ottimizzazione genetica si ferma praticamente subito. Gli sviluppatori si arrabbiano con domande su questa situazione. Consigliano di studiare l'analisi genetica e così via.

Ma a cosa mi serve? Io, come utente, voglio ottenere risultati e non mi interessa come funziona.

Quindi, ecco un esempio su tre funzioni 1, 2 e 3. 0 non deve essere usato.

In una catena, le funzioni non devono ripetersi e non ci deve essere uno 0 tra le funzioni (altrimenti ci possono essere ripetizioni).

Un esempio di catene ammissibili:

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

Esempio di catene inaccettabili:

  • 010
  • 001
  • 110
  • 101
  • 111
  • 121
  • 122
  • 131
  • 133
  • 112
  • 113
  • 102
  • 103
  • 2..
  • 3..
Come potete vedere, ci sono un ordine di grandezza più catene non valide che catene valide. Come eseguire un campionamento? Come sostituire INIT_PARAMETERS_INCORRECT? Dove devo scavare?

 
Annulla i calcoli in On-functions se i parametri sono mancini. L'esecuzione sarà più lenta diINIT_PARAMETERS_INCORRECT, ma non significativamente.
 
Com'è? Posso fare un piccolo esempio?
 

Potresti essere più esplicito sui possibili insiemi di parametri di input, gli insiemi indesiderabili, e perché ci sono troppi insiemi indesiderabili?

Sono pienamente d'accordo con gli sviluppatori che non ci dovrebbero essere troppi set indesiderati. L'optimum è non più del 10%.

 
Сергей Таболин:
Com'è? Posso fare un piccolo esempio?

fxsaber ha ragione.

Se l'insieme dei parametri non è corretto, si restituiscono tutte le funzioni OnTick() in una volta sola. E suTester - si restituisce il risultato minimo.

 
Сергей Таболин:
Com'è? Posso fare un piccolo esempio?
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;
    
  // ...
}
 
Questi non sono insiemi di parametri di ingresso! Sono un insieme di funzioni che non devono essere ripetute! Nell'ottimizzazione lenta, INIT_PARAMETERS_INCORRECT aiuta davvero a costruire catene valide per chiamare queste funzioni, ma ne ho 6. Ho 117649 varianti della catena. Ma queste catene sono inutili senza alcuni parametri di ingresso. Con loro, abbiamo già più di 38.000.000! Non c'è modo di aggirarlo con la forza bruta lenta.
 
Сергей Таболин:
Questi non sono insiemi di parametri di ingresso! È un insieme di funzioni che non devono essere ripetute! Nell'ottimizzazione lenta INIT_PARAMETERS_INCORRECT aiuta davvero a costruire catene valide per chiamare queste funzioni, ma ne ho 6. Ho 117649 varianti della catena. Ma queste catene sono inutili senza alcuni parametri di ingresso. Con loro, abbiamo già più di 38.000.000! Non c'è modo di aggirarlo con la forza bruta lenta.

La genetica morirà perché la superficie del criterio di ottimizzazione dovrebbe essere più o meno continua (liscia). Nel tuo caso, tuttavia, si ottiene un numero enorme di picchi (fallimenti).


Potete impostare il seguente esperimento. Prendete l'Expert Advisor standard e aggiungete alcuni parametri aggiuntivi per l'ottimizzazione - quelli falsi. Rendendo il 90% dei loro set INCORRETTO. GA morirà. Anche se andrà abbastanza bene senza parametri falsi.

 
fxsaber:

Capito. Si tratta solo di selezionare le funzioni giuste e il loro ordine nell'ottimizzatore. E scrivere manualmente tutte le catene irrilevanti.... E come farà allora l'ottimizzatore a trovarli?

 
fxsaber:

La genetica morirà perché la superficie del criterio di ottimizzazione dovrebbe essere più o meno continua (liscia). Nel tuo caso, tuttavia, si ottiene un numero enorme di picchi (dips).

Ho capito questo. Non capisco solo come aggirarlo?

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

Lo capisco. Quello che non capisco è come aggirarlo?

Una ricetta è che gli sviluppatori trattino il risultato dei passaggi INCORRETTI come il più vicino passaggio CORRETTO calcolato in precedenza. Questo uniformerà i buchi nella superficie di ottimizzazione.