Automatizzare la ricerca di strategie. - pagina 3

 
Aliaksandr Hryshyn:

In effetti ci sono molte piccole cose.

Sto cercando di creare un sistema universale, in modo che con uno sforzo minimo sia possibile aggiungere diverse possibilità di analisi di indicatori, candele, ecc. Ogni funzione contiene informazioni sui dati con cui può lavorare e su quali dati verranno emessi. Verranno inoltre descritti gli indicatori e il tipo di dati che forniscono. I dati sono suddivisi in tipi, sia semplici che complessi, ad esempio {double} e {int,double}. Sono suddivisi in categorie, ad esempio "prezzo" e "posizioni sul grafico", un altro esempio: "linea retta" (può essere utilizzata per definire i canali), ecc. Sono suddivisi per "tipo di scala", ad esempio "costante" (parametro della strategia), "indice" (esiste un minimo e un massimo), "rapporto" (esiste un solo punto di riferimento, ad esempio prezzo, volume), ecc. È necessario modificare la strategia in modo coerente, perché c'è una sfumatura tale che la modifica in un punto può influenzare le condizioni di modifica in un altro punto.

Proprio così... Per ridurre il numero di combinazioni della ricerca e utilizzato le restrizioni di cui sopra (tipo, scala, categoria), per ora sarà sufficiente e punto modifiche (aggiunta / rimozione di uno / pochi funzioni).

"Anche la ricombinazione è spontanea, ma di soluzioni intere già pronte" - mi è venuto in mente questo pensiero), è difficile immaginare come si possa realizzare. Un gruppo di funzioni combinate avrà molto probabilmente più connessioni con il "mondo esterno" rispetto a una singola funzione, quindi ci saranno meno opportunità di incastrare il tutto. L'algoritmo diventa molto complicato, rimandiamo a tempi migliori)).

Permettetemi di chiarire il concetto. Per ridurre il numero di varianti e la modifica di una non influisce sugli altri blocchi dovrebbe essere ancora più universale. Il problema è che gli stessi compiti possono essere realizzati con metodi diversi e spesso non è chiaro in anticipo quale sia il migliore. Ad esempio, abbiamo definito un certo compito universale chiamato TRASFORMAZIONE. Esistono circa una dozzina di oscillatori che definiscono questo compito universale ciascuno a modo suo. Supponiamo che nello script dell'oscillatore abbiamo impostato il compito di provare TUTTI gli indicatori o tutti i metodi. Dobbiamo quindi standardizzare l'interazione di questi blocchi con il resto del codice. Supponiamo di aver scelto come standard di interazione le percentuali del top. Il generatore inserisce in sequenza nel codice un blocco chiamato Oversold1, trova le variabili da testare in questo particolare blocco, esegue un volkin-forward e ricorda i risultati del test. Poi prepara una nuova versione dell'Expert Advisor, già con il blocco Oversold 2, che fornisce anche percentuali, nonostante il fatto che l'indicatore originale mostri numeri interi, e persino con un segno diverso dallo zero, ecc. Alla fine del test, lascia il blocco di maggior successo e passa a un altro compito.

Allo stesso tempo, non è necessario preparare tanti blocchi all'inizio: 2 o 3 blocchi saranno sufficienti. La cosa principale è stabilire un'interazione.

Lo stesso vale per le dipendenze. Ci sono A, B, C. Per prima cosa, se A è maggiore di B, allora è vero C. Poi se B è maggiore di A, e così via.

Poi si può passare a interazioni più complesse.

 

"Per ridurre il numero di opzioni e la modifica di una non influisce sulle altre, i blocchi dovrebbero essere MOLTO più versatili." => "Diciamo che abbiamo scelto lo standard di interazione - percentuali del top". - Ho capito il tuo punto di vista)). Si tratta di portare gli indicatori a un'unica visione, cioè a una preelaborazione. Nel mio sistema è tutto troppo formalizzato, vorrei mantenere tutto, sto già lavorando per implementare cose come la scala, la categoria, ho già capito come fare, c'è proprio una connessione di alcuni blocchi che influisce sulla connessione di blocchi in altri punti. La standardizzazione degli indicatori passa attraverso la descrizione dell'indicatore stesso e, in base ad essa, alcuni blocchi saranno automaticamente collegati. Uno dei blocchi può essere facilmente il calcolo della percentuale di un valore rispetto a un altro, solo che questi valori devono avere una connessione tra loro, che sarà controllata, ad esempio:

  1. Percentuale( Apertura[0] , Apertura[3] )
  2. Percentuale(Apertura[0], Alligatore[3])
  3. Percentuale(Volume[0], Alligatore[3])

La prima e la terza opzione sono buone e logiche, ma la terza non ha senso.

Verranno calcolati anche gli indici, ad esempio Open[ Max_on_position(iAC,0,30) ] ]

 
Youri Tarshecki:

Allo stesso tempo, non è necessario preparare tanti blocchi all'inizio: 2 o 3 blocchi saranno sufficienti. La cosa principale è stabilire un'interazione.

Lo stesso vale per le dipendenze. Ci sono A, B, C. Verifichiamo prima se A è maggiore di B, poi se C è vero, poi se B è maggiore di A e così via.

Poi possiamo passare a interazioni più complesse.

È già presente.

È implementato come segue:

  1. ci sono i tipi di base int,double,bool
  2. i tipi complessi sono creati dai tipi di base (si possono aggiungere), ad esempio (int,double) - coordinate sul grafico, (x,b) - coefficienti dell'equazione della retta, (a,b,c,d) - supporto per un massimo di 4 valori.
  3. Gli indicatori sono rappresentati come un insieme di tipi complessi con un elemento.
  4. le costanti sono rappresentate come tipi complessi; si tratta dei parametri della strategia che vengono ottimizzati
  5. le funzioni ricevono in ingresso alcuni tipi complessi di variabili, il cui numero non è limitato, e anche l'uscita è costituita da tipi complessi.
  6. Alle funzioni non interessa la provenienza dei dati, l'importante è che ci sia una corrispondenza di tipi.
  7. sono supportati tutti gli ordini disponibili in mql4 (6 pezzi)
  8. la strategia definisce solo un tipo di ordine (acquisto o vendita o buy_stop o...)
  9. per gli ordini non pendenti ci sono 4 nodi nella parte superiore del grafico: condizione di entrata nel mercato, condizione di uscita, tp e sl.
  10. I blocchi (funzioni/nodi del grafico) possono prendere parametri di input da indicatori, costanti, altri nodi, è consentito che molti altri nodi possano prendere dati come parametri di input dal risultato di un nodo, non ci sono restrizioni, tranne il fatto che è impossibile consentire cicli nel grafico.
  11. Il grafico viene quindi tradotto in un codice sequenziale, che verrà inviato all'Expert Advisor per l'esecuzione; non è necessario compilare nulla in MQL.
Ecco un esempio di codice:

#define
 symbol          GBPUSD;
period          60;
repeat_signal_skip      True;
stop_level              60;
trade           op_buy;
max_shift               13;
stack           4;
const           9;
cache           1;
#data
{True},{-1.26761795},{4.67108999},
{2.08088665},{-0.33782435},{22},
{1.63150050},{-11},{-0.22006371};
#program
 push    [0];
push    [1];
push    [2];
call    F_plus_d;
push    [3];
push    [4];
call    F_plus_d;
push    [5];
get     .Ichimoku_2;
call    F_plus_d;
push    [6];
call    F_minus_d;
save    [0];
push    [7];
get     .Open;
call    F_plus_d;
call    F_less;
load    [0];
push    [8];
#end

Non tutto è stato ancora fatto, non tutte le informazioni necessarie sono presenti nel codice, il codice viene eseguito correttamente dal punto di vista del controllo dei tipi, le espressioni senza significato non sono ancora prese in considerazione.

Nel codice vengono utilizzati solo tipi semplici.

 

Presumo che le strategie possano essere trasmesse tramite protocollo HTTP, MQL ha la possibilità di ricevere le strategie in questo modo.

Voglio rendere tutto completamente automatico, cercare le strategie, creare portafogli di strategie, trasferirle all'Expert Advisor, ecc.

Una parte del sistema in MQL è pronta al 90% e funziona con molte strategie (controllo delle posizioni, rischi, gestione degli errori, ecc.)

C'è ancora molto lavoro da fare.

 
Yuriy Asaulenko:
Se cercate una strategia, non è più facile. Non so il resto, non ci ho pensato. Tuttavia, qualsiasi modellazione è più facile in ambienti speciali, non in MT. MT è un prodotto finale, non è stato creato per la ricerca e non è molto adatto ad essa.
Sono d'accordo, inizialmente ho modellato io stesso l'idea in matlab. Tuttavia, il tester MT è una scatola nera.
 
Aliaksandr Hryshyn:
Ecco un altro esempio di espressione priva di significato: =Alto>(Apertura-Chiusura), non passerà nemmeno questa.

Spiegate perché è priva di senso. In realtà, la scriverei così

=High>MathAbs(Open-Close)

ю

 

Aliaksandr Hryshyn:

Il grafico viene quindi tradotto in un codice seriale che viene inviato all'Expert Advisor per l'esecuzione, senza che sia necessario compilare nulla in MQL.


Come, per favore, spiegare?
 

Restituirà sempre vero)).

(Apertura-Chiusura) sarà sempre inferiore a (Alto)

 
Alexey Volchanskiy:

Spiegare come, per favore?
Qual è, la trasmissione o l'esecuzione?
 
Aliaksandr Hryshyn:

Restituirà sempre vero)).

(Apertura-Chiusura) sarà sempre inferiore a (Alto)

Frenata ))))))))))
Motivazione: