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!
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".
.
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.
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).
Lo script non funziona, non funziona in modo automatico.
fumare il manuale se non si capisce cosa fare e come farlo.
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Accetti la politica del sito e le condizioni d’uso
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: ---