Sistemi Esperti: Esempi tratti dal libro "Reti neurali per il trading algoritmico con MQL5" - pagina 2

 

Buon pomeriggio,

Sto cercando di eseguire il primo script del libro, che genera un file csv.

Si chiama dati_iniziali.mq5.

Quando eseguo lo script nel primo passo:

If(CopyClose(_Symbol, PERIOD_M5, Start, End, close) <= 0 ||

CopyOpen(_Symbol, PERIOD_M5, Start, End, open) <= 0 ||

CopyHigh(_Symbol, PERIOD_M5, Inizio, Fine, high) <= 0 ||

CopyLow(_Symbol, PERIOD_M5, Inizio, Fine, basso) <= 0)

ritorno;

CopyClose è sempre uguale a -1

e lo script si blocca, le riesecuzioni non aiutano e come ho letto nei commenti

questa è una situazione normale e significa che non ci sono dati dal server.

Tuttavia, non capisco bene come viene scritto il percorso dei file di dati in questo script.

È scritto nella documentazione di MQL5:


Ad esempio, i dati dei simboli EURUSD provenienti dal server di trading MetaQuotes-Demo si trovano nella cartellaterminal_directory\bases\MetaQuotes-Demo\history\EURUSD\.


Ho file con risoluzione .hcc e una sottodirectory \cache con file come H4.hc.


Ma nello script initial_data.mq5, c'è solo un punto in cui viene scritto il percorso.

PrintFormat("Coefficienti di correlazione salvati nel file %s\\\\Files\\\\%s",

TerminalInfoString(TERMINAL_DATA_PATH), FileName);


Esito TERMINAL_DATA_PATH

2024.06.16 22:53:39.982 path (EURUSD,M5) dataPath =C:\Users\HPAppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075


Cosa devo fare per specificare correttamente il percorso di questi file o deve agganciarli automaticamente dalla directory del terminale secondo la logica MQL5?

Come scaricare i dati in un file csv?


 
bobozel1 #:

Forum sul trading, sui sistemi di trading automatizzati e sulla verifica delle strategie di trading

Tutte le domande dei principianti su MQL4 e MQL5, aiuto e discussione su algoritmi e codici

Aleksey Vyazmikin, 2024.06.18 06:28 pm

#define FileName  "correlation.csv"
//+------------------------------------------------------------------+
//| Parametri esterni|
//+------------------------------------------------------------------+
input datetime Start = D'2015.01.01 00:00:00';  // Inizio del periodo
input datetime End = D'2020.12.31 23:59:00';    // Fine del periodo
//--- Aprire il file per scrivere i dati
   int handle = FileOpen(FileName, FILE_WRITE | FILE_CSV | FILE_ANSI, "\t", CP_UTF8);
   if(handle == INVALID_HANDLE)
     {
      PrintFormat("Error of open file %s: %d", FileName, GetLastError());
      return;
     }
FileOpen

Parametri

open_flags

[ combinazione di flag che definiscono la modalità di lavoro con il file. I flag sono definiti come segue:
FILE_READ il file si apre per la lettura
FILE_WRITEil file si apre per la scrittura
FILE_BINmodalità binaria di lettura-scrittura (nessuna conversione da e a stringa)
FILE_CSVfile di tipo csv (tutti gli elementi scritti sono convertiti in stringhe del tipo appropriato, unicode o ansi, e separati da un delimitatore)
FILE_TXTfile di testo semplice (stesso csv, ma il separatore non viene preso in considerazione)
FILE_ANSIstringhe di tipo ANSI (caratteri a singolo byte)
FILE_UNICODEstringhe di tipo UNICODE (caratteri a doppio byte)
FILE_SHARE_READaccesso condiviso in lettura da parte di più programmi
FILE_SHARE_WRITEaccesso condiviso in scrittura da parte di più programmi
FILE_COMMONposizione del file nella cartella comune di tutti i terminali client \Terminal\Common\Files.

FileOpen

Nota

Per motivi di sicurezza, il lavoro con i file è strettamente controllato nel linguaggio MQL5. I file, che vengono utilizzati per le operazioni sui file con gli strumenti del linguaggio MQL5, non possono essere collocati al di fuori della "sandbox" dei file.

Se un file deve essere letto in una determinata codifica (viene specificato il parametro codepage con il valore di codepage), deve essere impostato il flag FILE_ANSI. Senza specificare il flag FILE_ANSI, il file di testo verrà letto in Unicode senza alcuna conversione.

Il file viene aperto nella cartella del terminale client, nella sottocartella MQL5\Files (o nella directory agent_agent\MQL5\Files in caso di test). Se tra i flag è specificato FILE_COMMON, il file viene aperto nella cartella comune di tutti i terminali client \Terminal\Common\Files.

È possibile aprire "canali denominati" secondo le seguenti regole:

  • Il nome del canale è una stringa che deve avere la forma: "\\servername\pipe\pipename", dove servername è il nome del server sulla rete e pipename è il nome del canale. Se i canali sono utilizzati sullo stesso computer, il nome del server può essere omesso, ma al suo posto si deve usare un punto: "\\.\pipe\pipename". Il client che cerca di connettersi al canale deve conoscere il nome del canale.
  • FileFlush() e FileSeek() devono essere chiamati all'inizio del file tra le successive operazioni di lettura dal canale e di scrittura sul canale.

Nelle righe precedenti viene utilizzato il carattere speciale backslash '\', quindi quando si scrive il nome nel programma MQL5 '\' deve essere raddoppiato, cioè l'esempio precedente dovrebbe essere scritto nel codice come "\\\\servername\pipe\pipename".

Per maggiori dettagli sul funzionamento dei canali denominati, leggere l'articolo "Comunicazione con MetaTrader 5 tramite canali denominati senza DLL".


 
Aleksey Vyazmikin #

Onestamente, non ho capito nulla della risposta, come se un robot stesse scrivendo. So dove viene scritto il file da creare, ma non viene creato.

Ho una domanda specifica, come prendere i dati dai file .hcc e .hc per scriverli in .csv?

Eseguo lo script initial_data.mq5 del libro come risultato:

CopyClose è sempre -1. Come risolvere questo problema?

Ho il sospetto che non veda questi file perché il percorso dei file di dati non è scritto correttamente.

Come si scrive correttamente il percorso dei file di dati?

Nel mio caso, i file di dati si trovano nella cartella terminal_directory\bases\MetaQuotes-Demo\history\EURUSD\ all'interno della sandbox.

Sto lottando con questo problema da una settimana, ho letto tutto, ma non ho trovato una soluzione. Per favore, aiutatemi.

 
bobozel1 #:

Onestamente, non ho capito nulla della risposta, come se un robot stesse scrivendo. So dove viene scritto il file da creare, ma non viene creato.

Ho una domanda specifica, come prendere i dati dai file .hcc e .hc per scriverli in .csv?

Eseguo lo script initial_data.mq5 del libro come risultato:

CopyClose è sempre -1. Come risolvere questo problema?

Ho il sospetto che non veda questi file perché il percorso dei file di dati non è scritto correttamente.

Come specificare correttamente il percorso dei file di dati?

Nel mio caso, i file di dati si trovano nella cartella terminal_terminal_directory\bases\MetaQuotes-Demo\history\EURUSD\ all'interno della sandbox.

Sto lottando con questo problema da una settimana, ho letto tutto, ma non ho trovato una soluzione. Per favore, aiutatemi.

Tutti i dati sono presi dalla piattaforma, all'utente non interessa da dove il terminale li prenda, da quale file.

Lo script lavora con i dati che si riflettono sul grafico.

Verifichi se sul grafico sono presenti le date per le quali sta richiedendo le quotazioni.

 
Aleksey Vyazmikin #:

Tutti i dati vengono presi dalla piattaforma, all'utente non interessa da dove il terminale li prenda, da quale file.

Lo script lavora con i dati riflessi sul grafico.

Verificare se sul grafico sono presenti date per le quali si richiedono le quotazioni.

Spiegare cosa significa.

Nello script è presente un intervallo

input datetime Start = D'2015.01.01.01 00:00:00'; // Inizio periodo

input datetime End = D'2020.12.31 23:59:00'; // Fine del periodo

su M5

Devo prendere il grafico EURUSD su M5, scorrere fino a 2015.01.01 e poi eseguire lo script su di esso?

Oppure posso eseguire lo script su MN? E con i nuovi tick torna all'inizio?
 
bobozel1 #:

Può spiegare cosa significa?

Nello script c'è un intervallo

input datetime Start = D'2015.01.01.01 00:00:00'; // Inizio periodo

input datetime End = D'2020.12.31 23:59:00'; // Fine del periodo

su M5

Devo prendere il grafico EURUSD su M5, scorrere fino a 2015.01.01 e poi eseguire lo script su di esso?

Oppure posso eseguire lo script su MN? E con i nuovi tick si sposta di nuovo all'inizio?

Leggi la guida del terminale. Ed ecco un'altra cosa.

Scoprirete che esiste un'impostazione della profondità della storia attraverso il numero massimo di barre nella finestra. È necessario ricaricare il terminale perché le modifiche abbiano effetto.

Pertanto, è necessario impostare la profondità massima dello storico per tutti i TF in una volta sola, in base al TF più piccolo necessario per lavorare.

È chiaro che 100 barre per i giorni e 100 barre per i minuti daranno la stessa profondità in barre, ma non in date.

Una volta impostato il valore richiesto o "Illimitato" e ricaricato il terminale, se lo storico è disponibile per il periodo richiesto, è possibile eseguire lo script sul TF mensile.


 
Aleksey Vyazmikin #:

Leggete la guida del terminale. Ed eccone un altro.

Imparerete che esiste un'impostazione della profondità della cronologia attraverso il numero massimo di barre nella finestra. Affinché le modifiche abbiano effetto, è necessario ricaricare il terminale.

Pertanto, è necessario impostare la profondità massima dello storico per tutti i TF in una sola volta dal TF più piccolo, che è necessario per lavorare.

È chiaro che 100 barre per i giorni e 100 barre per i minuti daranno la stessa profondità in barre, ma non in date.

Una volta impostato il valore richiesto o "Illimitato" e ricaricato il terminale, se lo storico è disponibile per il periodo richiesto, è possibile eseguire lo script sul TF mensile.


Grazie! Tutto ha funzionato.
 
bobozel1 #:
Grazie! Ha funzionato.

Non c'è di che.

 
L'aspetto più problematico non è questo. La cosa più fastidiosa è che dopo aver ottimizzato i parametri, si può vincere solo per un anno. Se li cambiate per un altro anno, non funzionerà più. Ciò significa che l'idea dell'autore non è realizzabile. I parametri possono variare notevolmente da un anno all'altro. Forse non esiste un insieme di parametri che possa essere redditizio ogni anno!
 

Grazie Dmitry per tutti i tuoi sforzi in questo libro. È davvero utile.

In neuronbase.mqh si implementa il metodo di regolarizzazione ElasticNet come segue, senza spiegazioni nel libro.

m_cWeights.m_matrix -= m_cWeights.m_matrix * Lambda[1] + Lambda[0]

Ma è diverso dalla formula di base (+) o dal codice sorgente di Keras (+), ad esempio.

Spiegate il vostro metodo di implementazione. Perché si usano solo le lambda invece della formula completa e perché si moltiplicano i pesi con una di esse e si fa la somma con un'altra.

Dmitriy Gizlyk
Dmitriy Gizlyk
  • 2024.07.15
  • www.mql5.com
Trader's profile