Discussione sull’articolo "Creazione di criteri personalizzati di ottimizzazione degli Expert Advisor" - pagina 2

 
Karlson:

Stai dicendo che il codice è del tipo

if (balance < 3000) ExpertRemove();

non funziona?

Funziona. L'ho già capito. interrompe l'ottimizzazione ma visualizza comunque i risultati, per questo pensavo che non funzionasse.


Karlson:

Ma non è quello che ho detto. Che un'interruzione di questo tipo (che almeno prima funzionava) ha portato alla fine all'abbandono della genetica.

Karlson: È così.

Ma se si azzerano i risultati di OnTester() o si fa come sopra (assegnando il valore meno -777), allora la genetica può davvero comportarsi in modo imprevedibile, perché la selezione viene effettuata sui risultati proprio dal valore di ritorno di OnTester().

 
rimane il problema di come rimuovere i risultati non necessari dal report.

Nella MT4 esisteva una cosa del genere:

MT4


Sicuramente si può fare con l'aiuto degli strumenti MQL5, dato che gli sviluppatori hanno eliminato del tutto tali funzioni.

Naturalmente, tutto può essere copiato in Excel, ma vorrei approfittare della nuova piattaforma.

Abbiamo risolto le limitazioni: possiamo farlo con ExpertRemove().

Che ne dite di saltare i risultati inutili nel report?

 
sigma7i:

Che ne dite di saltare i risultati inutili nel report?

Non è possibile farlo nel report standard e non è necessario (io sono contrario). Create il vostro report.

Ora è possibile generare un report in fase di ottimizzazione(https://www.mql5.com/it/docs/optimization_frames) nel formato desiderato.

E presto (hoo-hoo) sarà possibile gestire la genetica da soli.

 

Eccellente.

Grazie al mio precedente lavoro nel campo delle reti neurali e degli algoritmi genetici per la previsione dei futures, mi sono reso conto dell'importanza di una curva azionaria ragionevolmente rettilinea.

e ho scritto alcune routine per tenerne conto. È davvero una misura della "robustezza" di un sistema predittivo.

 
E ora ho finalmente iniziato a testare ed esplorare le possibilità. E sono d'accordo. Si apre un mondo completamente nuovo. È uno strumento molto potente. Grazie ancora per l'articolo
 

Realizzazioni di lavori pratici.

Il modulo sulla rettilineità è un buon inizio, ma incompleto. È possibile ottenere un'ottima valutazione con un profitto pari a zero. Quindi il profitto deve entrare nell'equazione. Aggiungere semplicemente una qualche misura al profitto totale non funziona.

non funziona. Si potrebbe ottenere una linea retta con un buon valore avendo alcune vittorie all'inizio, alcuni drawdown nel mezzo e alcune vincite migliori alla fine. In questo modo si otterrebbe una linea retta uniforme con un buon valore e si otterrebbe un certo profitto. Ma non è questo che stiamo cercando.

Vogliamo una linea di regressione che salga verso l'alto con un buon adattamento. Quindi, per rendere l'idea dell'utilizzo di una linea di regressione con la minor deviazione possibile, il coefficiente per la pendenza verso l'alto deve essere incorporato nell'equazione. Questo è ciò che

vogliamo vedere. Una retta di regressione con pendenza verso l'alto e un buon adattamento. Farò un tentativo per incorporarla. Suggerimenti e assistenza sono benvenuti :-)

 
Il valore del criterio personalizzato viene visualizzato nell'elenco dei risultati insieme al criterio "standard". È possibile creare 2 valori nei criteri personalizzati? Non ho trovato un buon modo per combinare rettilineità e pendenza.
 

Sto provando il codice CSTS.

Trovo questo risultato un po' strano:


Risultato Profitto #Tradizioni Fattore di Frofit DrawDown Payoff atteso Fattore di recupero

0.58 1237 84 1.26 12.70 14.74 0.93

0.57 1598 90 1.38 8.69 17.36 1.76


Ecco un altro esempio

0.61 3175 123 1.33 21.04 25.82 1.48

0.60 4460 145 1.49 11.32 30.77 2.56

Da tutti i punti di vista i valori della seconda linea sono migliori!!! Ma il punteggio è inferiore.

L'unica cosa che posso dedurre è che c'è una penalizzazione su molte operazioni. Io avrei voluto il contrario

E come ultimo punto. Sembra che ci sia esattamente una persona interessata a questo argomento: io.


Per approfondire la questione. Ho commesso un errore nel mio codice che ha fatto sì che gli ordini pendenti non venissero cancellati. Inoltre, ho avuto come risultato solo 5 ordini piazzati per un periodo di test di oltre 12 mesi. Con un buon profitto.

Questo ha fatto salire il risultato dell'ottimizzazione a oltre 100. Chiaramente il valore della "vincita media" era estremamente alto e ha portato a questo punteggio estremo. Tecnicamente è corretto, ma non ha alcun significato

nel contesto del backtesting. Quanto è probabile che trend così lunghi siano rappresentativi? Ho quindi pensato che il numero di operazioni dovesse essere incorporato nell'equazione in qualche modo.

Con alcune prove ed errori di modifica del codice sono arrivato a un metodo che produce risultati che ritengo utili.

modifiche:

// CSTS:
double tssf=real/teor;
if(tssf <= 0) return 0;

work = TesterStatistics( STAT_TRADES );
if( work <= 0) work = 1;
work = MathSqrt(work/4);

tssf = tssf * work;
se( tssf < 1 ) tssf = 0;
se(TesterStatistics(STAT_PROFIT) <= 0) tssf = 0;

return(tssf);

Il metodo originale è probabilmente buono per giudicare un sistema in esecuzione, ma fondamentalmente inutile per basare i parametri su un'esecuzione di backtest.

Documentation on MQL5: Standard Constants, Enumerations and Structures / Trade Constants / Order Properties
  • www.mql5.com
Standard Constants, Enumerations and Structures / Trade Constants / Order Properties - Documentation on MQL5
 

Eccomi di nuovo qui, il lupo solitario di questo universo :-)

Ho provato i Criteri personalizzati di rettilineità cercando di inserire nell'equazione la pendenza della linea retta calcolata. Così com'è può dare una valutazione molto alta su un profitto molto debole. La semplice aggiunta del profitto finale

nel calcolo non migliora la situazione. Nel tentativo di aggiungere la pendenza effettiva nell'equazione, ho modificato il codice come illustrato di seguito.

Non è una soluzione perfetta, ma si avvicina a ciò che voglio vedere. L'utilizzo del risultato insieme al saldo o al profitto funziona bene con questo codice


//---------------------------------------------------------------------
// Ottenere il valore del risultato dell'ottimizzazione:
//---------------------------------------------------------------------
double  TBalanceSlopeCriterion::GetCriterion()
  {
// Proviamo a calcolare la pendenza della curva di equilibrio:
   double   current_slope=1000.0*this.balance_Ptr.CalcSlope();

// Se è inclinato verso il basso:
   if(current_slope<0.0)
     {
      return(-1.0);
     }

   double   temp=this.balance_Ptr.GetCurrentSKO();
   if(temp>0.0)
     {
      
   // return(this.scale/temp); //Questo restituisce solo il grado di aderenza dei risultati a una linea retta che può essere qualsiasi cosa, da una linea di livello a una linea che punta verso l'alto
      double temp2 = this.scale/temp;   // ha aggiunto Ingvar
      
      return(temp2 * current_slope);    // ha aggiunto Ingvar
      
     }

   return(0.0);
  }
 
ingvar_e:

Eccomi di nuovo qui, il lupo solitario di questo universo :-)

Ho provato i Criteri personalizzati di rettilineità cercando di inserire nell'equazione la pendenza della linea retta calcolata. Così com'è può dare una valutazione molto alta su un profitto molto debole. La semplice aggiunta del profitto finale

nel calcolo non migliora la situazione. Nel tentativo di aggiungere la pendenza effettiva nell'equazione, ho modificato il codice come illustrato di seguito.

Non è una soluzione perfetta, ma si avvicina a ciò che voglio vedere. L'utilizzo del risultato insieme al saldo o al profitto funziona bene con questo codice


ingvar_e, non è così solo, mi piace molto quest'area e sono rimasto sorpreso dalla tua evoluzione, perché anch'io credo in questa linea di pensiero.

Per esempio, per gli algoritmi genetici, è necessario avere un buon algoritmo di fitness, e sicuramente creare un criterio personalizzato allineato a questo fitness.

Non sono sicuro che calcolare la pendenza della curva di equilibrio sia il modo migliore, dal momento che abbiamo diversi altri modi, comunque conta su di me per esplorare e discutere queste idee.