Discussione sull’articolo "SQL e MQL5: Lavorare con il database SQLite"

 

Il nuovo articolo SQL e MQL5: Lavorare con il database SQLite è stato pubblicato:

Questo articolo è destinato agli sviluppatori interessati a utilizzare SQL nei loro progetti. Spiega le funzionalità e i vantaggi di SQLite. L'articolo non richiede una conoscenza speciale delle funzioni SQLite, ma sarebbe utile una minima conoscenza di SQL.

Dopo che lo script è stato applicato all'account, inserisce immediatamente le offerte dell'account nella tabella.

Le statistiche vengono visualizzate nel journal del terminale

Puoi giocare con lo script: commenta le righe contenenti BEGIN, ROLLBACK e COMMIT. Se ci sono più di centinaia di offerte sul tuo account, vedrai immediatamente la differenza. A proposito, secondo alcuni test, le transazioni SQLite funzionano più velocemente che in MySQL o PostgreSQL.

Autore: ---

 

Ci sono un paio di aggiunte importanti (e suggerimenti per il miglioramento:))

1. L'autore utilizza la funzione sqlite_open(), ma esiste una funzione più flessibile sqlite_open_v2(), che può lavorare con i flag di apertura, il che significa: - controllare la delimitazione dell'accesso al file del database; - creare database temporanei in memoria; - lavorare con il database tramite URI, non solo nel file system locale, ecc.

#define  SQLITE_OPEN_READONLY         0x00000001  /* Ok per sqlite3_open_v2() */
#define  SQLITE_OPEN_READWRITE        0x00000002  /* Ok per sqlite3_open_v2() */
#define  SQLITE_OPEN_CREATE           0x00000004  /* Ok per sqlite3_open_v2() */
#define  SQLITE_OPEN_DELETEONCLOSE    0x00000008  /* Solo VFS */
#define  SQLITE_OPEN_EXCLUSIVE        0x00000010  /* Solo VFS */
#define  SQLITE_OPEN_AUTOPROXY        0x00000020  /* Solo VFS */
#define  SQLITE_OPEN_URI              0x00000040  /* Ok per sqlite3_open_v2() */
#define  SQLITE_OPEN_MEMORY           0x00000080  /* Ok per sqlite3_open_v2() */
#define  SQLITE_OPEN_MAIN_DB          0x00000100  /* Solo VFS */
#define  SQLITE_OPEN_TEMP_DB          0x00000200  /* Solo VFS */
#define  SQLITE_OPEN_TRANSIENT_DB     0x00000400  /* Solo VFS */
#define  SQLITE_OPEN_MAIN_JOURNAL     0x00000800  /* Solo VFS */
#define  SQLITE_OPEN_TEMP_JOURNAL     0x00001000  /* Solo VFS */
#define  SQLITE_OPEN_SUBJOURNAL       0x00002000  /* Solo VFS */
#define  SQLITE_OPEN_MASTER_JOURNAL   0x00004000  /* Solo VFS */
#define  SQLITE_OPEN_NOMUTEX          0x00008000  /* Ok per sqlite3_open_v2() */
#define  SQLITE_OPEN_FULLMUTEX        0x00010000  /* Ok per sqlite3_open_v2() */
#define  SQLITE_OPEN_SHAREDCACHE      0x00020000  /* Ok per sqlite3_open_v2() */
#define  SQLITE_OPEN_PRIVATECACHE     0x00040000  /* Ok per sqlite3_open_v2() */
#define  SQLITE_OPEN_WAL              0x00080000  /* Solo VFS */

2. Ho utilizzato sqlite per risolvere il problema di accelerare l'ottimizzazione dell'EA quando utilizza un indicatore "pesante" nei calcoli. La soluzione logica in questa situazione è quella di salvare nel database le letture dell'indicatore per il periodo di ottimizzazione durante la prima esecuzione e, durante le esecuzioni successive, di estrarre direttamente dal database le letture già calcolate. Quindi, se si utilizza il motore sqlite nella "forma predefinita", il processo di invio di numerose query INSERT e SELECT inizia a richiedere molto tempo. In pratica, si è scoperto che la via d'uscita consiste nell'utilizzare 1) un database in-memory, il che non è sempre positivo se si vogliono lasciare i dati per un secondo momento e 2) le direttive #pragma del motore SQL.

La seconda opzione è preferibile, perché elimina la necessità di scaricare il database dalla RAM al disco. Si procede nel modo seguente: prima di creare la prima tabella del database è necessario inviargli le seguenti query:

"PRAGMA temp_store = MEMORY;"
"PRAGMA page_size = 65536;"
"PRAGMA cache_size = 16384;"
"PRAGMA journal_mode = OFF;"
"PRAGMA locking_mode = EXCLUSIVE;"
"PRAGMA synchronous = OFF;"

Bene, e dopo di che è possibile

"CREATE TABLE IF NOT EXISTS"

ecc.

Buona fortuna a tutti!

 
alsu:

Ci sono un paio di aggiunte importanti (e suggerimenti per il miglioramento:))

1. L'autore utilizza la funzione sqlite_open(), ma esiste una funzione sqlite_open_v2() più flessibile che può lavorare con i flag di apertura, il che significa: - controllare la delimitazione dell'accesso al file del database; - creare database temporanei in memoria; - lavorare con il database tramite URI, non solo nel file system locale, ecc.

2. Ho utilizzato sqlite per risolvere il problema di accelerare l'ottimizzazione dell'EA quando utilizza un indicatore "pesante" nei calcoli. La soluzione logica in questa situazione è quella di salvare nel database le letture dell'indicatore per il periodo di ottimizzazione durante la prima esecuzione e, durante le esecuzioni successive, di estrarre direttamente dal database le letture già calcolate. Quindi, se si utilizza il motore sqlite nella "forma predefinita", il processo di invio di numerose query INSERT e SELECT inizia a richiedere molto tempo. In pratica, si è scoperto che la via d'uscita consiste nell'utilizzare 1) un database in-memory, il che non è sempre positivo se si vogliono lasciare i dati per un secondo momento e 2) le direttive #pragma del motore SQL.

La seconda opzione è preferibile, perché elimina la necessità di scaricare il database dalla RAM al disco. Si procede nel modo seguente: prima di creare la prima tabella del database, si devono inviare le seguenti query:

Bene, dopodiché è possibile

ecc.

Buona fortuna a tutti!

I dati delle letture degli indicatori durante l'esecuzione del tester sono per natura un semplice array, un flusso con accesso sequenziale, quindi è ridondante e non razionale salvarli e leggerli in SQLite.

Lo stesso si può dire dell'elenco di operazioni di trading proposto dall'autore dell'articolo come esempio di applicazione di SQLite.

Pertanto, dobbiamo renderci conto che l'efficienza dell'utilizzo di modelli di dati relazionali e multilinkati dipende principalmente dai compiti da risolvere e, in questi esempi, IMHO, può essere solo "tirata per le orecchie".
.

 
Esiste un DBMS SQL colonnare chiamato MonetDB. Si tratta di un DBMS gratuito progettato per memorizzare i dati in colonne; questo database ha una buona velocità e affidabilità. Se non sbaglio, qualsiasi DBMS SQL può essere collegato a MT nel modo presentato nell'argomento.
 
revers45:

I dati delle letture degli indicatori durante l'esecuzione del tester sono per loro natura un semplice array, un flusso con accesso seriale, quindi è ridondante e non razionale salvarli e leggerli nella base SQL.

Rileggiamolo, anche se è ridondante e non razionale: per ottimizzare l'Expert Advisor


 

È possibile utilizzarlo e va bene. Un'altra cosa è che SQLite non dovrebbe essere usato per progetti seri. In ogni caso, non lo consiglio. Io stesso ho affrontato più di una volta il problema delle collisioni. Ad esempio, se un robot di trading è collegato a diversi grafici, ma utilizza la stessa base, e l'accesso è a una tabella di uso generale (ad esempio registrazione/modifica delle sessioni, conti), in ogni caso si otterrà un errore del tipo "tabella bloccata". E non importa se tutte le transazioni sono state completate, i cursori sono stati chiusi e il database è stato aperto in modalità condivisa. Questo problema è noto anche agli sviluppatori di SQLite.

A mio parere, MS Access è il migliore dei database con supporto SQL. Non importa quanto si possa rimproverare il popolo delle small-soft, ma io ho lasciato SQLite per MS Access e non me ne sono affatto pentito. Il driver OleDB Jet 4.0 è installato anche con Win98, in modo che i progetti funzionino su tutti i sistemi operativi Windows.

 
Idea e articolo meravigliosi, non ci avevo pensato. Sarebbe bello però avere un supporto nativo in mql5, in modo da poterlo utilizzare nel prodotto di Market.
 

Prima di tutto un caloroso ringraziamento per il tuo lavoro!

L'ho portato su mql4 con successo! (alcune #property strict, risolvono gli errori di compilazione).

Poiché utilizzo una piattaforma a 32 bit, ho dovuto commentare ed eliminare alcune funzioni di importazione relative ai 64 bit. Il terminale utilizza il binding anticipato, quindi anche la dll a 64 bit cerca di caricarsi durante il caricamento del programma. (anche se non viene utilizzata, solo la dll a 32 bit).Si è verificato un errore.

Comunque, mi piace la tua implementazione! (Vorrei poter scrivere un programma così buono come il tuo).

 
Sto utilizzando una versione a 64 bit di MetaTrader 5 e non riesco a far funzionare il codice. Ho provato a rimuovere i riferimenti al codice a 32 bit ma ottengo comunque un errore "Sqlite3_32.dll" non può essere caricato. Potete dirmi se il codice fa riferimento a questa dll da qualche parte? Ho bisogno di farlo funzionare a 64 bit.
 

Lo script non funziona, fuori dalla scatola non funziona, per il cestino tali progetti.

Nella console dà https://s.mail.ru/9dWTNLqx6RT2/img-2015-11-10-20-15-44.png

В таблице https://s.mail.ru/QZyK6HwhMvo9/img-2015-11-10-20-16-18.png

Код https://s.mail.ru/2ooLdMg5MrHP/img-2015-11-10-20-16-56.png

 
delphiec:

Lo script non funziona, non funziona in modo automatico.

fumare il manuale se non si capisce cosa fare e come farlo.