Discussion de l'article "SQL et MQL5 : Travailler avec la base de données SQLite"

 

Un nouvel article SQL et MQL5 : Travailler avec la base de données SQLite a été publié :

Cet article est destiné aux développeurs qui seraient intéressés par l'utilisation de SQL dans leurs projets. Il explique les fonctionnalités et les avantages de SQLite. L'article ne nécessite pas de connaissance particulière des fonctions SQLite, mais une compréhension minimale de SQL serait bénéfique.

Une fois le script appliqué au compte, il insère instantanément les transactions du compte dans le tableau.

Les statistiques sont affichées dans le journal du terminal

Vous pouvez jouer avec le script : commentez les lignes contenant BEGIN, ROLLBACK et COMMIT. S'il y a plus de centaines d'offres sur votre compte, vous verrez immédiatement la différence. En fait, selon quelques tests, les transactions SQLite fonctionnent plus rapidement que dans MySQL ou PostgreSQL.

Auteur : ---

 

Il y a quelques ajouts importants (et des suggestions d'amélioration :))

1. l'auteur utilise la fonction sqlite_open(), mais il existe une fonction plus flexible sqlite_open_v2(), qui peut travailler avec des drapeaux d'ouverture, ce qui signifie : - contrôler la délimitation de l'accès au fichier de base de données ; - créer des bases de données temporaires en mémoire ; - travailler avec la base de données par URI, pas seulement dans le système de fichiers local, etc.

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

2. J'ai utilisé sqlite pour résoudre le problème de l'accélération de l'optimisation de l'EA lorsqu'il utilise un indicateur "lourd" en calculs. La solution logique dans une telle situation est de sauvegarder les lectures de l'indicateur pour la période d'optimisation dans la base de données lors de la première exécution, et lors des exécutions suivantes - d'extraire directement les lectures déjà calculées de la base de données. Ainsi, si vous utilisez le moteur sqlite dans la "forme par défaut", le processus d'envoi d'un grand nombre de requêtes INSERT et SELECT commence à prendre beaucoup de temps. En pratique, il a été constaté que la solution consiste à utiliser soit 1) une base de données en mémoire, ce qui n'est pas toujours bon si nous voulons laisser les données pour plus tard, soit 2) les #pragma-directives du moteur SQL.

La deuxième option est préférable, car elle élimine la nécessité de transférer la base de données de la mémoire vive vers le disque. La procédure est la suivante : avant de créer la première table dans la base de données, il est nécessaire de lui envoyer les requêtes suivantes :

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

Bien, et après cela, vous pouvez

"CREATE TABLE IF NOT EXISTS"

etc.

Bonne chance à tous !

 
alsu:

Il y a quelques ajouts importants (et des suggestions d'amélioration :))

1) L'auteur utilise la fonction sqlite_open(), mais il existe une fonction sqlite_open_v2() plus flexible qui peut travailler avec des drapeaux d'ouverture, ce qui signifie : - contrôler la délimitation de l'accès au fichier de la base de données ; - créer des bases de données temporaires en mémoire ; - travailler avec la base de données par URI, pas seulement dans le système de fichiers local, etc.

2. J'ai utilisé sqlite pour résoudre le problème de l'accélération de l'optimisation de l'EA lorsqu'il utilise un indicateur "lourd" en calculs. La solution logique dans une telle situation est de sauvegarder les lectures de l'indicateur pour la période d'optimisation dans la base de données lors de la première exécution, et lors des exécutions suivantes - d'extraire directement les lectures déjà calculées de la base de données. Ainsi, si vous utilisez le moteur sqlite dans la "forme par défaut", le processus d'envoi d'un grand nombre de requêtes INSERT et SELECT commence à prendre beaucoup de temps. En pratique, il a été constaté que la solution consiste à utiliser soit 1) une base de données en mémoire, ce qui n'est pas toujours une bonne chose si nous voulons laisser les données pour plus tard, soit 2) les #pragma-directives du moteur SQL.

La deuxième option est préférable, car elle élimine la nécessité de transférer la base de données de la mémoire vive vers le disque. La procédure est la suivante : avant de créer la première table dans la base de données, vous devez lui envoyer les requêtes suivantes :

Bien, et après cela, vous pouvez

etc.

Bonne chance à tous !

Les données de lecture des indicateurs lors de l'exécution du testeur sont par nature un simple tableau, un flux à accès séquentiel, il est donc redondant et peu rationnel de les sauvegarder et de les lire dans la base SQL.

Il en va de même pour la liste des opérations commerciales proposée par l'auteur de l'article comme exemple d'application de SQLite.

Par conséquent, nous devons nous rendre compte que l'efficacité de l'utilisation de modèles de données relationnels et multiliés dépend principalement des tâches à résoudre et, dans ces exemples, il se peut qu'elle ne soit que "tirée par les oreilles".
.

 
Il existe un SGBD SQL en colonnes appelé MonetDB. Il s'agit d'un SGBD gratuit conçu pour stocker des données en colonnes, cette base de données a une bonne vitesse et une bonne fiabilité. Si je ne me trompe pas, n'importe quel SGBD SQL peut être connecté à MT de la manière présentée dans la rubrique.
 
revers45:

Les données relatives aux relevés d'indicateurs pendant l'essai sont par nature un simple tableau, un flux avec accès en série, de sorte qu'il est redondant et peu rationnel de les enregistrer et de les lire dans la base SQL.

Lisez-le à nouveau, même si c'est redondant et non rationnel : pour optimiser l'Expert Advisor


 

Il est possible de l'utiliser et c'est une bonne chose. Par ailleurs, SQLite ne devrait pas être utilisé pour des projets sérieux. En tout cas, je ne le recommande pas. J'ai moi-même été confronté plus d'une fois au problème des collisions. Par exemple, si un robot de trading est attaché à différents graphiques, mais utilise la même base, et que l'accès se fait à une table à usage général (par exemple les sessions d'enregistrement/de changement, les comptes), vous obtiendrez dans tous les cas une erreur du type "table verrouillée". Et peu importe que toutes les transactions soient terminées, que les curseurs soient fermés et que la base de données ait été ouverte en mode partagé. Ce problème est également connu des développeurs de SQLite.

À mon avis, MS Access est la meilleure des bases de données de fichiers avec support SQL. Vous avez beau gronder les adeptes des petits logiciels, j'ai quitté SQLite pour MS Access et je ne le regrette pas du tout. Le pilote OleDB Jet 4.0 est installé même avec Win98, de sorte que les projets fonctionnent sur tous les systèmes d'exploitation Windows.

 
Merveilleuse idée et article, je n'y avais pas pensé. Ce serait bien cependant d'avoir un support natif en mql5, afin de pouvoir l'utiliser dans le produit de Market.
 

Tout d'abord un grand merci pour votre travail !

Je l'ai porté sur mql4 avec succès ! (quelques #property strict, résolvent les erreurs de compilation).

Et comme j'utilise une plateforme 32bit, j'ai dû commenter et supprimer certaines fonctions d'importation liées au 64bit. Le terminal utilise le early binding, donc la dll 64 bits essaye aussi de se charger pendant le chargement du programme. (bien qu'elle ne soit pas utilisée, seulement la dll 32bit).Cela a provoqué une erreur.

Mais quoi qu'il en soit, j'aime votre implémentation ! (J'aimerais pouvoir écrire un programme aussi bon que le vôtre).

 
J'utilise une version 64 bits de MetaTrader 5 et je n'arrive pas à faire fonctionner le code. J'ai essayé de supprimer les références au code 32 bits mais j'obtiens toujours l'erreur "Sqlite3_32.dll" ne peut pas se charger. Pouvez-vous me dire si le code fait référence à cette dll quelque part ? J'ai besoin de le faire fonctionner en 64 bits.
 

Le script ne fonctionne pas, hors de la boîte ne fonctionne pas, à la poubelle de tels projets.

Dans la console, il donne 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:

Le script ne fonctionne pas, il n'est pas prêt à l'emploi.

fumez le manuel si vous ne comprenez pas ce qu'il faut faire et comment le faire.