Discussione sull’articolo "Algoritmi Genetici - È Facile!" - pagina 7

 
Graff:
Signori! Se non è troppo difficile, per favore datemi qualche esempio di utilizzo della libreria UGA.
Che tipo di esempi (su quale argomento) vi interessano?
 
joo:
Che tipo di esempi (su quale argomento) ti interessano?
Qualsiasi esempio che utilizzi UGA, perché dagli esempi riportati nell'articolo non è del tutto chiaro il suo funzionamento. l'articolo ha un esempio con uno zig-zag, possiamo avere esempi con altri indicatori (RSI, CCI....)?
 
Graff:
che utilizzino UGA, perché dagli esempi riportati nell'articolo non è del tutto chiaro il suo funzionamento. nell'articolo c'è un esempio con lo zig-zag, possiamo avere esempi con altri indicatori (RSI, CCI....)?

Scrivere uno script in cui:

1) caricare nell'array di dati lo strumento necessario per calcolare l'indicatore

2) calcolo dell'indicatore/i con una serie di parametri (i parametri dell'indicatore devono essere ottimizzati).

3) determinazione dei punti di entrata/uscita in base ai segnali dell'indicatore

4) calcolo di un indicatore statistico di interesse (il numero di pip guadagnati tenendo conto dello spread, del drawdown, ecc.)


I punti 2), 3), 4) sono fasi di un'iterazione di GA - calcolo del FF per un individuo. Scrivete un tale script e io, a mia volta, cercherò di aiutarvi ad "avvitare" UGA ad esso.


PS. Dubito che qualcuno pubblicherà un esempio di trading pronto utilizzando UGA - se qualcuno è seriamente impegnato nella ricerca utilizzando questa libreria (o qualsiasi altra libreria simile), allora molto probabilmente questi sviluppi sono privati (il tempo viene speso per studiare qualcosa che non è direttamente correlato al trading).

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
zsazsa:

Ottimo articolo! Grazie.

1) Come vedo, volevi usare UGA per ottimizzare l'addestramento delle NN. Ha avuto successo?

2) Quali erano i geni del cromosoma in questo caso?

3) Avete sviluppato anche una vostra libreria di NN o avete trovato qualche implementazione di NN esistente che supporti l'integrazione con MT5 e GA?

1) Sì.
2) I pesi e i bias dei neuroni di una rete sono rappresentati come geni del cromosoma.
3) Ho scritto una mia realizzazione di una rete neurale.
 

Andrey, buongiorno a te. Grazie per UGA. Sto cercando di imparare ad usare la tua libreria con il "metodo scientifico" (sull'esempio di UGA_script.mq5 e skin.mqh da te proposto). Se non ti dispiace, dammi un'ulteriore introduzione su come impostare correttamente i parametri di input per risolvere il problema dell'addestramento della rete di Kohonen, quando abbiamo un insieme di punti sul piano, che dobbiamo assegnare (classificare) a determinati kernel. Cioè abbiamo N punti con coordinate (x,y), M kernel (che saranno "spostati" dopo l'addestramento), funzione FF - "misura di prossimità". Da quanto ho capito in UGA_script.mq5 i parametri dovrebbero essere impostati come segue: ChromosomeCount_P= ???? (non capisco come impostare), GeneCount_P=2*M (2 coordinate per ogni nucleo), Epoch_P= ???? (non capisco come impostarlo). Grazie in anticipo.

 
kogriv:

Andrey, buongiorno a te. Grazie per UGA. Sto cercando di imparare ad usare la tua libreria con il "metodo scientifico" (sull'esempio di UGA_script.mq5 e skin.mqh da te proposto). Se non ti dispiace, dammi un'ulteriore introduzione su come impostare correttamente i parametri di input per risolvere il problema dell'addestramento della rete di Kohonen, quando abbiamo un insieme di punti sul piano, che dobbiamo assegnare (classificare) a determinati kernel. Cioè abbiamo N punti con coordinate (x,y), M kernel (che saranno "spostati" dopo l'addestramento), funzione FF - "misura di prossimità". Da quanto ho capito in UGA_script.mq5 i parametri dovrebbero essere impostati come segue:

1) ChromosomeCount_P= ???? (non capisco come impostarlo),

2) GeneCount_P=2*M (2 coordinate per ogni nucleo),

3) Epoca_P= ???? (non capisco come impostarlo).

Grazie in anticipo.

1) Imposta 50 per iniziare, se non è sufficiente, aumenta il valore (non esagerare, fino a 200-300, altrimenti rischi di non aspettare il risultato).

2) Sì.

3) Iniziare con 50-100, se non è sufficiente, aumentare il valore (non esagerare, fino a 200-1000, altrimenti si rischia di non ottenere risultati).

I numeri sono empirici, potete modificarli a vostro piacimento, concentrandovi sulla velocità di convergenza o sull'accuratezza del risultato (si tratta, in generale, di requisiti che si escludono a vicenda, la via di mezzo è una via di mezzo - scusate il gioco di parole).

 

Sto curiosando nella libreria.

Andrew, non riesco a capire perché si debba calcolare la funzione di fitness PRIMA di rimuovere i duplicati dalla popolazione. È costoso.

void CycleOfOperators
(
...........
.......
)
{
 ................................
...............

  /Determinare l'idoneità di ciascun individuo nella colonia di discendenti
  GetFitness(historyHromosomes);
................................
..........................
  //Preparare la popolazione per la riproduzione successiva
  RemovalDuplicates();
}// fine della funzione

Io controllerei la presenza di cloni nella fase di generazione dei discendenti. (Cosa che farò, in effetti).

 
MetaDriver:

1) Andrew, non riesco a capire perché si debba calcolare la funzione di fitness PRIMA di rimuovere i duplicati dalla popolazione. È costoso.

2) Controllerei la presenza di cloni nella fase di generazione dei discendenti. (Cosa che farò, in realtà).

1) I calcoli ripetuti di FF non vengono eseguiti, perché il controllo viene effettuato sul database dei cromosomi storici: se almeno una volta FF è stato eseguito in precedenza per tale individuo, il valore viene preso dal database.

2) C'è una sfumatura che riguarda l'insediamento di una nuova colonia nella popolazione. Ma non ne parlerò. :) Fatelo nel modo che ritenete più corretto e ditemi i risultati - dopo di che vi dirò della sfumatura.


PS In generale, e non in relazione a questo commento, è possibile seguire molte strategie diverse di ricerca casuale GA, ogni variante è degna di attenzione in una certa misura. I risultati (tasso di convergenza, accuratezza della ricerca, blocco negli estremi locali) dipendono quasi direttamente dalle strategie di ricerca utilizzate.

 
joo:

1) Non ci sono calcoli ripetuti di FF, perché viene controllato il database storico dei cromosomi: se un FF è stato eseguito almeno una volta in precedenza per un tale individuo, il valore viene preso dal database.

2) C'è una sfumatura che riguarda l'insediamento di una nuova colonia nella popolazione. Ma non ne parlerò. :) Fate quello che pensate sia più corretto e ditemi i risultati - dopo di che vi dirò della sfumatura.

1) Bene, bene, bene. Cantastorie. :) Hai almeno un errore.

Questo è il modo in cui i numeri reali vengono confrontati solo da... mmmm... matematici, sì.

        if (Colony[Ge][chromos]!=historyHromosomes[Ge][Ch1])
          break;

In un confronto di questo tipo, una differenza di quindici cifre dopo una virgola mobile riconosce i geni come diversi. E ci sarà sempre una differenza, perché è il destino. ;)

Almeno così deve essere:

        if (fabs(Colony[Ge][chromos]-historyHromosomes[Ge][Ch1]) > delta)  // per esempio 0,00001 < delta < 0,00000000001
          break;

Non ho dubbi che abbiate testato la rimozione dei duplicati separatamente dall'algoritmo dei geni, quindi dovete illudervi che questo frammento funzioni.


2) Come è misterioso tutto... Dove il sottile è sottile, il lacerato è lacerato. :)

Lì tutto è risolvibile, con o senza sfumature. Ok, vi mostro come ho fatto.

 
MetaDriver:

1) Bene, bene, bene. Cantastorie. :)

2) Hai almeno un errore. I numeri reali vengono confrontati così solo dai... mmmm... matematici, sì. In un confronto di questo tipo, una differenza di quindici cifre dopo una virgola mobile riconosce i geni come diversi. E ci sarà sempre una differenza, perché è il destino. ;)

Almeno così deve essere:

3) E si ha esattamente la stessa cosa quando si rimuovono i duplicati. Non ho dubbi che abbiate testato la rimozione dei duplicati separatamente dall'algoritmo dei geni, quindi dovete avere l'illusione che questo frammento funzioni.

4) Come tutto è misterioso... Dove il sottile è sottile, il lacerato è lacerato:) Lì tutto è risolvibile, con o senza sfumature. Ok, vi faccio vedere come ho fatto.

1) Cantastorie? Purtroppo non ho capito l'umorismo. Il controllo del database avviene nella funzione CheckHistoryChromosomes(chromos,historyHromosomes ) che viene chiamata da GetFitness(historyHromosomes). Ecco perché ho detto correttamente: non ci sono esecuzioni ripetute di FF.

2) La riconciliazione con il database avviene con un controllo per geni. E ogni gene viene normalizzato da SelectInDiscreteSpace(temp,RangeMinimum,RangeMaximum,Precision,3) quando compare un nuovo cromosoma. Quindi anche qui non ci sono "favole".

3) Vedere 2)

4) Nessun mistero. Il codice è aperto e trasparente. C'è effettivamente una sfumatura (non è legata a problemi di implementazione, ma alla qualità della convergenza).