L'apprendimento automatico nel trading: teoria, modelli, pratica e algo-trading - pagina 2333

 


....

 

Facile, buon articolo sulle possibilità di programmazione genetica

https://blog.ephorie.de/symbolic-regression-genetic-programming-or-if-kepler-had-r

 

Ho trovato (per me) un modo interessante per testare i miei script mql su python, così come accelerare significativamente alcune funzioni in esso, utilizzando dll.

Ecco la funzione iniziale in mql5, che voglio mettere in python. Cerca semplicemente i minimi e i massimi di un prezzo usando il suo modello lisciato.

void get_loc_extremum(double &x[],double &x2[],double &loc_max[],double &loc_min[],bool real_price)
  {
   int N = ArraySize(x);
   for(int i=1; i<N-1; i++)
     {
      if(x[i-1]<x[i]&& x[i]>x[i+1])
        {
         ArrayResize(loc_max,ArraySize(loc_max)+1);
         if(real_price)
            loc_max[ArraySize(loc_max)-1]=x2[i];
         else
            loc_max[ArraySize(loc_max)-1]=x[i];
        }

      if(x[i-1]>x[i]&& x[i]<x[i+1])
        {

         ArrayResize(loc_min,ArraySize(loc_min)+1);
         if(real_price)
            loc_min[ArraySize(loc_min)-1]=x2[i];
         else
            loc_min[ArraySize(loc_min)-1]=x[i];
        }

     }

Questo viene fatto in diversi passi

1. Da qualche parte, in visual studio o in codeblock compilate la vostra dll. Nel file .cpp scriviamo la nostra funzione, nel file .h la dichiariamo. Un esempio che ha funzionato per me nell'allegato al post. Nella cartella codeblox project file, main .cpp file, main .h file, nella cartella bin\Debug file my_lib.dll. In breve, ecco l'header della funzione in c++:

void DLL_EXPORT GetLocalMaxMin(double* x_sm[],double* x_rl[], double* loc_max[], double* loc_min[], int N, bool real_price)
{
...
}

2 In python fate come segue:

from ctypes import *

my_dll = cdll.LoadLibrary("my_dll/my_lib.dll") 					#загружаем  свою DLL
my_dll.GetLocalMaxMin.argtypes = [POINTER(c_double), 
        POINTER(c_double), POINTER(c_double), POINTER(c_double), c_int, c_bool] #определяем  типы входных аргументов функции через атрибуты ctypes
my_dll.GetLocalMaxMin.restype = None                                            #определяем  типы выходных данных 

...
#  y - список цен
#  y_sm - список сглаженных цен
#  len(y)=len(y_sm) - длина списков одинаковая

x_sm = (c_double * len(y))(*y_sm)    				  #создаем  указатель на массив x_sm размером len(y_sm) предаем туда указатель на массив y_sm
x_rl = (c_double * len(y))(*y)       			       	  #создаем  указатель на массив x_rl размером len(y) предаем туда указатель на массив y
loc_max = (c_double * len(y))()      				  #создаем  указатель на массив loc_max размером len(y) заполный 0.0 
loc_min = (c_double * len(y))()     				  #создаем  указатель на массив loc_min размером len(y) заполный 0.0 
my_dll.GetLocalMaxMin(x_sm, x_rl, loc_max, loc_min, len(y), True) #вызываем  функцию и передаем туда все что насоздавали

print(list(loc_max),list(loc_min)) #смотрим  что получилось

Questa non è la verità finale, hanno eventuali aggiunte, o altre opzioni, scrivere.

File:
my_lib.zip  36 kb
 
welimorn:

Ho trovato (per me) un modo interessante per testare i miei script mql su python, così come accelerare significativamente alcune funzioni in esso, utilizzando dll.

Ecco la funzione iniziale in mql5, che voglio mettere in python. Cerca semplicemente i minimi e i massimi di un prezzo usando il suo modello lisciato.

Questo viene fatto in diversi passi

1. Da qualche parte, in visual studio o in codeblock compilate la vostra dll. Nel file .cpp scriviamo la nostra funzione, nel file .h la dichiariamo. Un esempio che ha funzionato per me nell'allegato al post. Nella cartella codeblox project file, main .cpp file, main .h file, nella cartella bin\Debug file my_lib.dll. In breve, ecco l'header della funzione in c++:

2 In python fate quanto segue:

Questa non è la verità finale, eventuali aggiunte, o altre opzioni, scrivete.

Cosa vuoi ottenere?
Se la velocità, allora non usare
ArrayResize(loc_max,ArraySize(loc_max)+1);

all'interno del ciclo, e una volta prima di chiamare la funzione, impostate la dimensione che volete, come avete fatto in C++ e python, o riservatela con il 3° parametro

ArrayResize(loc_max,ArraySize(loc_max)+1, max_size);

Ora ogni chiamata ad ArrayResize, crea un nuovo blocco in memoria, copia il vecchio in esso e cancella il vecchio. Questo è molto, molto lento.

И

ArraySize(loc_max)

non devi farlo ogni volta, puoi memorizzarlo in una variabile.


Provatelo, forse non dovrete tradurre una semplice funzione in 3 diversi linguaggi di programmazione. Gli sviluppatori dicono che MQL è paragonabile in velocità al C++, e più veloce in alcune cose.

Perché avete bisogno di Python se potete chiamare la DLL direttamente da MQL?

O ha qualche altro scopo?
 
elibrarius:
Cosa vuoi ottenere?
Se la velocità, non usare

all'interno del ciclo, e 1 volta prima di chiamare la funzione, impostate la dimensione che volete, come avete fatto in C++ e Python, o riservatela con il 3° parametro

Ora ogni chiamata ad ArrayResize crea un nuovo blocco in memoria, vi copia il vecchio blocco e cancella quello vecchio. Questo è molto, molto lento.

И

non devi farlo ogni volta, puoi memorizzarlo in una variabile.


Provatelo, forse non dovrete tradurre una semplice funzione in 3 diversi linguaggi di programmazione. Gli sviluppatori dicono che MQL è paragonabile in velocità al C++, e più veloce in alcune cose.

Perché avete bisogno di Python se potete chiamare la DLL direttamente da MQL?

O ha qualche altro scopo?

La funzione di ricerca dell'estremo nel messaggio è fornita solo come esempio per mostrare il principio che c'è dietro.

Lo scopo è che è conveniente cercare le dipendenze delle caratteristiche e dell'obiettivo in Python e scegliere i modelli, mentre MQL ha un buon tester che, se non per ingannare se stessi, vi darà una chiara stima dei vostri risultati.

Mi trovo bene a lavorare con Python, ma sto appena imparando e non riesco a scrivere nessuna funzione in mql5 con cicli in Python usando calcoli vettoriali. Scrivere codice senza di loro è una perdita di tempo, poiché python è molto lento. Alcune funzioni possono essere chiamate su ogni barra e questo rende molto difficile da trovare. Ho usato algib ovunque poiché hanno soluzioni sia per python che per mql5. Ma quando si tratta della mia folle immaginazione, ho qualche problema.

Il codice per mql5 può essere facilmente convertito in c++ e compilato in dll. Come risultato uso una stessa funzione nel tester e nello script python.

 
welimorn:

La funzione di ricerca degli estremi nel messaggio è data semplicemente come esempio per mostrare il principio su di essa.

Lo scopo è che Python è utile per la ricerca di dipendenze di caratteristiche e target e l'adattamento di modelli, mentre MQL ha un buon tester che, se non ti imbroglia, ti permette di ottenere una chiara stima dei tuoi risultati.


Quindi, avete trovato le dipendenze in Python, scelto, addestrato e testato il modello. E come si prova in un tester? Python non è amichevole con il tester o MKL5.

 
Se il tempo medio di mantenimento della posizione per un TS è di 10 minuti. E la posizione attuale è in bilico da 10 ore, allora il suo risultato è un quid pro quo (completamente non sistematico)?
 
fxsaber:
Se il tempo medio di mantenimento della posizione per il TS è di 10 minuti. E la posizione attuale è stata sospesa per 10 ore, allora il suo risultato è un gambit (completamente non sistemico)?

Dipende da come sono scritte le logiche/regole del TS. Il "forse" è un risultato probabilistico, non determinato dalla logica di TC. Se la logica ha funzionato sicuramente per tutte le 10 ore, allora è solo un caso raro.

 
Valeriy Yastremskiy:

Se tutte le 10 ore di logica hanno funzionato definitivamente, è solo un caso raro.

Solo perché la logica ha funzionato non rende il risultato sistematico.

 
fxsaber:

Il fatto che la logica abbia funzionato non rende il risultato sistematico.

La domanda non specifica a cosa applicare il quid pro quo e la sistematicità. Se al TC, allora dipende dal TC, se alle condizioni esterne, allora i casi rari non sono intrinsecamente sistemici. E possono esserci eccezioni alla regola. Eurodollaro 14 da maggio a marzo '15. Non è un caso sistematico.