Il problema del trasferimento da MT4 a MT5. O, più precisamente, l'impossibilità di eseguire alcuni algoritmi in MT5 senza 'err. - pagina 11

 

Informazioni per la riflessione.

Guardando alcuni degli sviluppi EA pubblicati sul mercato. O alcuni articoli.

Spesso specificano un piccolo spread nei requisiti di selezione del broker per l'EA.

E, a mio parere, MT5 è stato ampiamente sintonizzato per reagire rapidamente ai cambiamenti del mercato. Questo spiega perché tutti i freni con attesa di aggiornamento delle quotazioni sono spenti.

Significa che se c'è un aggiornamento delle quotazioni, il terminale negherà l'accesso alle serie temporali. Per non interferire con alcuni algoritmi veloci.

Questo paradigma ha il diritto di esistere. In questo caso il trading è breve. Viene inserito rapidamente. Raccogli qualche punto. Uscire rapidamente.

Ma c'è un altro paradigma.

Ci sono alcune situazioni estreme nel mercato dove si sono formate inversioni di mercato.

Queste estremità possono essersi formate anche diversi anni fa. Ma continuano a influenzare la situazione attuale del mercato.

I cambiamenti momentanei sulla storia dei tick o dei minuti in questo caso possono essere presi in considerazione. Ma non sono decisivi.

In questo caso è possibile aspettare l'aggiornamento delle citazioni senza uscire dal gestore a causa dell'interruzione dell'accesso. E funziona solo in MT4.

Alcune immagini con spiegazioni di ciò che è stato detto.

Prendiamo il tf mensile. Gli estremi di marzo 1995, ottobre 2000 e luglio 2007 continuano a influenzare il mercato.

Anche l'estremo del febbraio 1985 ha un effetto:


Si può vedere che le linee costruite con questi estremi sono notate dal mercato.

Passiamo ad altri timeframe. Approssimativamente in un rapporto come se stessimo facendo markup a onda. Questa scelta può portare allo sviluppo di un livello d'onda in ogni TF

Tf settimanale:

D1:

H4:

M30:

M5:

M1:

Vediamo che gli estremi formati molto indietro nella storia hanno un impatto sul momento attuale del mercato.

----------------------------------

Ci dovrebbe essere un accesso continuo ai preventivi per tali costruzioni.

Continuerò oltre. Fondamentalmente tutto ciò che è mostrato nelle immagini è usato nel trading manuale.

Ma. È possibile alimentare quotazioni di diversi timeframes agli input di diverse reti neurali, per esempio rappresentate nelle immagini. Ogni NS elaborerà i propri dati. E dare in uscita la propria comprensione di ciò che sta accadendo. Le uscite delle reti neurali saranno sincronizzate secondo il tempo di ricezione delle barre.

In questo caso i segnali del NS di una priorità superiore a quelli di una inferiore.

I segnali ricevuti dalle reti neurali sono alimentati all'ingresso del seguente NS con qualche considerazione di priorità. Qui ci possono essere delle varianti.

Il primo strato delle reti neurali, per esempio, può essere del tipo LSTM. Per strato in questo caso intendiamo le reti neurali che ottengono le quotazioni ognuna dal suo timeframe. Ogni rete neurale del primo strato può avere diversi strati di neuroni.

La rete neurale sommatoria può avere una propria architettura. Questo è più un compito di ingegneria.

È possibile allenarsi, per esempio, con qualche algoritmo di apertura degli scambi. Nel primo strato delle reti neurali. Cioè ogni rete neurale del primo strato è addestrata separatamente. Apriamo i trade, per esempio, alla fine di una barra nel livello corrispondente. Puoi anche aprire trade in diverse direzioni. Gli scambi sono condizionati. Alla fine di questi accordi viene inviato un segnale per addestrare il NS.

Così, la rete neurale aggregata ha il diritto di scegliere la migliore modalità di trading.

Così otteniamo un algoritmo in qualche modo simile a quello implementato in Alfa Zero dal team di DeepMinde.

Dovreste addestrare tale rete sull'intera storia per tutti i periodi di tempo selezionati. L'unica cosa da tenere in considerazione è che tutte le serie temporali in MT5 sono basate su minuti. Questo non è vero. I file NCC sugli eurodollari fino al 1993 sono costituiti da serie temporali. Ci deve essere un algoritmo che ricostruisce il vero timeframe della serie temporale.

Puoi allenarti su una coppia di valute. E testarlo su un altro.

------------------------------

Riassunto. Perché in questo approccio è necessario reagire rapidamente a ciò che accade nel mercato?

 
Eugeni Neumoin:


Scusate l'off-topic, ma finché l'argomento è interessante, non posso rinunciare


Vittoria:

Beh, voglio dire così:

MQL ha typename() - restituisce il nome del tipo di stringa, funziona anche

void OnStart()
  {
   Print(typename(Txt()));      // в логе будет       string
  }
string Txt()
{
return(" Txt ");
}

conoscendo il tipo MyFunc() - scrivere una macro (((, ... Naturalmente posso scrivere tutte le macro di tipo _Try_helper ... in generale probabilmente non sono avventuroso, perché non so come

 
Igor Makanu:

Scusa per alcuni off-topic, ma finché è un argomento interessante, non posso smettere


Va bene.

 
Igor Makanu:

MQL ha typename() - restituisce il nome del tipo di stringa, funziona anche

conoscendo il tipo MyFunc() - scrivere una macro (((, ... Naturalmente posso scrivere tutte le macro di tipo _Try_helper ... Beh, credo di non essere un giocatore d'azzardo, perché non so come

typename() in µl non aiuterà, non darà a tempo di compilazione un tipo adatto alla dichiarazione di una variabile, ma solo la stampa. Questo ci lascia con Try_d(), Try_i(), ... . Non so come ottenere la funzionalità decltype in µl.

 
Vict:

typename() in µl non vi aiuterà, non vi darà a tempo di compilazione un tipo adatto alla dichiarazione di una variabile, ma solo la stampa. Questo ci lascia solo con Try_d(), Try_i(), ... . Non so come ottenere la funzionalità decltype in µl.

Hmm, non mi sento affatto un giocatore d'azzardo! Dirò anche assolutamente nessun giocatore d'azzardo! ))) - Non so come, è così che funzionerà qualcosa (davvero non capisco come sia a livello di macchina "tutto gira" - penso che abbiamo un linguaggio strettamente tipizzato?)

void OnStart()
{
  int i = func(1);
  double d = func(1.123);
  string s = func("s");
  Print("i = ",i);
  Print("d = ",d);
  Print("s = ",s);
}

template<typename T>
T func(T invalue)
{
   string s = typename(T);
   if(s=="int") return(invalue);
   if(s=="double") return(invalue);
   if(s=="string") return("Hello word!!!");
return(NULL);
}

2019.07.31 21:07:05.304 tst2 (EURUSD,H1) i = 1

2019.07.31 21:07:05.304 tst2 (EURUSD,H1) d = 1,123

2019.07.31 21:07:05.304 tst2 (EURUSD,H1) s = Ciao parola!!!


potete anche descrivere un puntatore alla funzione

typedef void(*TFuncvoidPTR)(void);

e utilizzare ulteriormente

TFuncvoidPTR      func[];
....
func[0]();
 
Vict:

typename() in µl non aiuterà, non darà a tempo di compilazione il tipo adatto alla dichiarazione della variabile, ma solo la stampa. Questo ci lascia solo da moltiplicare Try_d(), Try_i(), ... . Non so come ottenere la funzionalità decltype in µl.

Una funzione template con una variabile statica di tipo T.

 
Igor Makanu:

Grazie!

Ho letto i tuoi post, purtroppo hai ragione in molti modi, ieri ho corrisposto molto con il moderatore Artem in questo thread, il risultato della conversazione: se è implementato così, allora dovrebbe funzionare così... In generale, come nelle vecchie pubblicità "Basta non saperle cucinare!

Imho, i risultati del compilatore MQL5 sono davvero fantastici (è molto produttivo!), ma il suo uso come terminale di trading... Beh, mettiamola così: richiede una formazione tecnica molto, molto buona e il desiderio di scrivere ~30% di codice in più che "nel vecchio terminale" ( - anche questa frase è un'espressione consolidata sul forum)

Ay-yi-yi... Non ho detto questo :)

Dicevo: usate quello che avete per ottenere il risultato che volete.

Il resto delle mie emozioni lo tengo per me.

 
Igor Makanu:

Non ho detto che il moderatore Artem ha detto una cosa del genere, ho solo scritto il risultato della conversazione - penso che questo sia il mio giudizio, che posso formare solo in base alle mie emozioni e all'analisi della conversazione .... ))))

cioè non so cosa sia passato per la testa di qualcuno, posso solo vedere la mia testa... per fortuna nello specchio per ora )))

Ci avrei creduto se invece di

il risultato della conversazione: se è implementato in quel modo, allora dovrebbe funzionare... come le vecchie pubblicità " non sai proprio come cucinarli!

era

lamia conclusione è: se è implementato così, allora è così che dovrebbe funzionare... come le vecchie pubblicità: " Non so proprio come cucinarli!".

E così si scopre che una testa dallo specchio citato presumibilmente moderatore Artem...

E bene, se era una conversazione in privato. Ma trarre conclusioni pubbliche sulle mie parole che non ho detto è incastrarmi pubblicamente con la mia presunta opinione completamente sbagliata - io ne ho una completamente diversa da quella presumibilmente espressa nella citazione.

Posso esprimere la mia opinione:

Facciamo il meglio di quello che abbiamo al momento, non piagnucoliamo, aiutiamo a trovare i bug e chiediamo con ansia le correzioni - vengono risolti e appaiono nuove belle caratteristiche.

 
Artyom Trishkin:

Ci crederei se invece di

era

Ma come si scopre, una testa dallo specchio citato presumibilmente moderatore Artem...

E bene, se era una conversazione in privato. Ma trarre conclusioni pubbliche sulle mie parole che non ho detto è incastrarmi pubblicamente con la mia presunta opinione completamente sbagliata - io ne ho una completamente diversa da quella presumibilmente espressa nella citazione.

Posso esprimere la mia opinione:

Non mi sto lamentando, sto aiutando a trovare i bug e a chiedere le correzioni - sono stati risolti e stanno apparendo nuove caratteristiche interessanti.

hmm, come sono diventate complicate le cose.... pulito da solo, la mia opinione... chi se ne frega? cosa cambierà? gli sviluppatori hanno la loro visione dei loro prodotti, è il loro business e la mia opinione ... se non si aggiorna il thread in 2 giorni sarà molto lontano dalla cima


... Come cambierà ... Beh, oggi un buon uomo@Vict- mi ha mostrato alcune tecniche di debug facile, e soprattutto - posso raggiungere la leggibilità del mio codice - questo ha cambiato la mia opinione di MQL5, e in generale, i membri del forum

Ora sto zitto, per fortuna c'è un forum con una lunga storia, non si può andare indietro e leggere troppe risposte alle mie domande nella ricerca di questo forum.

 
Igor Makanu:

fxsaber è corretto - c'è un'opzione

 template <typename T> T Try_helper(T val, bool assign) {
   static T sval;
   if (assign)
      sval = val;
   return sval;
}
#define  Try(EXPR, MES)                    \
   Try_helper(EXPR, true);                \
   if (Try_helper(EXPR, false) <= 0.0) {  \
     printf("Error: %s ", MES);           \
     return;                              \
   }

double f(double) {return DBL_MAX;}
ulong f(ulong) {return ULONG_MAX;}

void OnStart()
{

   double d = Try(f(0.), "double error");
   ulong u = Try(f(0), "ulong error");
}

È un po' kitsch - EXPR sarà calcolato due volte, ma è comunque più flessibile. Non si può dire che sia universale (solo per i tipi aritmetici. Il valore dell'errore deve essere uguale, il che è spiacevole. Ho cercato di evitarlo attraverso la specializzazione esplicita della struttura/funzione, ma potrebbe non essere possibile.

template <typename T> bool Try_helper_is_valid(T val);
template <> bool Try_helper_is_valid<string>(string val) {val==""?false:true;}  // compile-time error

template <typename T>
struct S;
template <>
struct S<string> {...};      // compile-time error

Beh, sembra che non importa dove scaviate nel µl, troverete trappole ovunque. Probabilmente, è meglio limitarsi a una piccola macro altamente specializzata con un tipo fisso.