Discussion de l'article "SQLite Gestion native des bases de données SQL dans MQL5" - page 2

 

Renat Fatkhullin:

Au sein de différents Expert Advisors MQL5 lancés dans un même terminal, vous pouvez partager la même base de données.
.

J'ai testé le fonctionnement de deux Expert Advisors avec la même base de données dans un terminal. Cela fonctionne sans erreur - les deux Expert Advisors écrivent les données dans un fichier avec un minuteur de 2 secondes.

Les fichiers sont joints, ils ne diffèrent que par le nom de l'Expert Advisor.

2020.02.19 17:56:14.624 SecondExpertDataBase (GBPUSD,H1)        16:56:14: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:16.627 SecondExpertDataBase (GBPUSD,H1)        16:56:16: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:18.616 SecondExpertDataBase (GBPUSD,H1)        16:56:18: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:20.630 SecondExpertDataBase (GBPUSD,H1)        16:56:20: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:22.078 FirstExpertDataBase (USDCHF,H1)         16:56:21: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:22.629 SecondExpertDataBase (GBPUSD,H1)        16:56:22: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:24.071 FirstExpertDataBase (USDCHF,H1)         16:56:24: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:24.619 SecondExpertDataBase (GBPUSD,H1)        16:56:24: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:26.070 FirstExpertDataBase (USDCHF,H1)         16:56:26: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:26.619 SecondExpertDataBase (GBPUSD,H1)        16:56:26: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:28.079 FirstExpertDataBase (USDCHF,H1)         16:56:27: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:28.625 SecondExpertDataBase (GBPUSD,H1)        16:56:28: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:30.079 FirstExpertDataBase (USDCHF,H1)         16:56:30: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:30.617 SecondExpertDataBase (GBPUSD,H1)        16:56:30: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:32.069 FirstExpertDataBase (USDCHF,H1)         16:56:32: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:32.627 SecondExpertDataBase (GBPUSD,H1)        16:56:32: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:34.073 FirstExpertDataBase (USDCHF,H1)         16:56:33: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:34.627 SecondExpertDataBase (GBPUSD,H1)        16:56:34: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:36.616 SecondExpertDataBase (GBPUSD,H1)        16:56:36: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:38.079 FirstExpertDataBase (USDCHF,H1)         16:56:38: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:38.615 SecondExpertDataBase (GBPUSD,H1)        16:56:38: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:40.072 FirstExpertDataBase (USDCHF,H1)         16:56:40: added 1 record on USDCHF to timer.sqlite
2020.02.19 17:56:40.618 SecondExpertDataBase (GBPUSD,H1)        16:56:40: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:42.630 SecondExpertDataBase (GBPUSD,H1)        16:56:42: added 1 record on GBPUSD to timer.sqlite
2020.02.19 17:56:44.617 SecondExpertDataBase (GBPUSD,H1)        16:56:44: added 1 record on GBPUSD to timer.sqlite


Voici à quoi ressemble la base de données dans MetaEditor


 
Chiripaha:

Ce qui est décrit pour µl5 peut-il être utilisé dans µl4 ?

Dans MQL4, vous pouvez travailler avec le fichier natif Sqlite3_32.dll à travers le wrapper pour MQL.

/*
 * Interface SQLite pour MT4
 */

#import "sqlite3_wrapper.dll"
int sqlite_exec (string db_fname, string sql);
int sqlite_table_exists (string db_fname, string table);
int sqlite_query (string db_fname, string sql, int& cols[]);
int sqlite_next_row (int handle);
string sqlite_get_col (int handle, int col);
int sqlite_free_query (int handle);
#import

Il s'agit d'un wrapper pour MQL, à ne pas confondre avec SQLite3Wrapper.dll.

Je ne sais pas s'il est toujours en ligne, mais je l'utilisais auparavant.

UPD : https://github.com/Shmuma/sqlite3-mt4-wrapper
Shmuma/sqlite3-mt4-wrapper
Shmuma/sqlite3-mt4-wrapper
  • Shmuma
  • github.com
Database file is by default stored to . If you specify a full path as database filename, it's used. Terminal data path TERMINAL_DATA_PATH can be known by the following instruction. Open MT4 Open [File] menu Click "Open Data Folder" Sample Many sample scripts in under . Precautions Argument mess MT4 build 610 has a weird bug when dll function...
 
fxsaber:

Si quelqu'un a trouvé la solution, qu'il nous montre la mise en œuvre d'une telle tâche.

  1. Il y a deux terminaux.
  2. Il est nécessaire de transférer les cotations en temps réel d'un symbole du terminal 1 vers le symbole personnalisé correspondant du terminal 2.

Il y a une autre nuance - sauvegarder dans la base de données des données cohérentes avec une valeur croissante, ne se dispersant pas, comme les cotations (avec une date croissante) - une opération TRÈS coûteuse. L'arbre n'est pas équilibré, une branche pousse indéfiniment, et le moteur rééquilibre l'arbre régulièrement (c'est pire que le ramassage des ordures). Peut-être que cela ne s'applique qu'à la table indexée, je ne m'en souviens plus. Ou peut-être que pendant les quelques années où je ne l'ai pas utilisé, le problème a déjà été résolu. Il faudra que j'essaie. Peut-être même que les développeurs l'analyseront, cela devrait les intéresser.

 

Importation de la base de données()

script simple

void OnStart()
  {
  string filename="DOMdb.db";
  int database=DatabaseOpen(filename, DATABASE_OPEN_READWRITE  );
  DatabaseImport(database,             // identifiant de la base de données reçu lors de l'ouverture de la base de données
                     "DOMtb",             // nom de la table pour l'insertion des données
                     "AllDOM.csv",          // nom du fichier pour l'importation des données
                       0,             // combinaison de drapeaux
                      ";",         // séparateur de données 
                        0,         // nombre de premières lignes à sauter 
                      "//"     // une chaîne de caractères définissant les commentaires
   );
   
  }

2020.02.20 15:09:27.171 MQL5 'DOMcopy.ex5' a une version plus récente non supportée, veuillez mettre à jour votre terminal client

version 5 build 2323 dernier méta-éditeur est le même et le débogage ne fonctionne pas.

Y a-t-il quelque chose d'inachevé ?

 

Lafonctionnalité DatabaseImport n'a pas encore été rendue publique.

Veuillez attendre la publication.

 
Peut-être pas dans le sujet, mais.. : Je me demande pourquoi les développeurs n'ont pas encore implémenté la connexion à MS SQL Server ?
 
Rashid Umarov:

La fonction DatabaseImport n'a pas encore été rendue publique.

Veuillez attendre sa publication.

version 5 build 2326 même chose, donc attendre une version stable quand ?

 
IuriiPrugov:

version 5 build 2326 la même chose qui est d'attendre une version stable et quand ?

Forum sur le trading, les systèmes de trading automatisés et les tests de stratégies de trading.

Nouvelle version de MetaTrader 5 build 2340 : Gestion des paramètres de compte dans le testeur et extension de l'intégration avec Python

MetaQuotes, 2020.02.20 14:55

Le vendredi 21 février 2020, une version mise à jour de la plateforme MetaTrader 5 sera publiée. La mise à jour contient les changements suivants :

  1. MetaEditor : ajout de la possibilité de travailler de manière pratique avec les bases de données SQLite.

    Lors de la précédente mise à jour de la plateforme, nous avons ajouté la possibilité de travailler avec des bases de données SQLite directement à partir de MQL5. Les fonctions principales sont maintenant disponibles via l'interface utilisateur de MetaEditor :

    .
    • Création et connexion aux bases de données
    • Visualisation des tables et des requêtes de données rapides
    • Création et exécution de requêtes SQL, retour en arrière des modifications

    Comment ça marche
    Pour créer rapidement des bases de données, utilisez l'"Assistant MQL5". Vous pouvez y créer immédiatement la première table et définir la liste de ses champs.




    Après avoir créé une base de données, vous accédez à une nouvelle section du "Navigateur". Tout le travail avec les données est effectué à partir de cette section.

    Dans la partie gauche, les tables de la base de données sont affichées. Pour interroger rapidement les 1 000 premiers enregistrements, double-cliquez sur le nom de la table. Vous pouvez également créer et ouvrir d'autres bases de données et travailler avec des tables.

    La partie principale de l'éditeur est l'endroit où vous travaillez avec la base de données : remplir la table avec des données, effectuer des recherches et des sélections, saisir des requêtes SQL, etc.
    .



    Pour plus de détails sur le travail avec les bases de données dans MetaTrader 5, veuillez lire l'article"SQLite : Native Work with SQL Databases in MQL5".

    .
  2. MetaEditor : Nous continuons à ajouter le support pour les projets multi-langues. Dans cette version, nous avons étendu les fonctions pour travailler avec les scripts Python :

    .
    • Vous pouvez désormais les créer facilement grâce à l'"Assistant MQL5", en incluant immédiatement les dépendances des bibliothèques nécessaires dans le code.
    • Des icônes spéciales pour ces scripts ont été ajoutées dans le navigateur et la coloration syntaxique dans l'éditeur.
    • Lors de l'exécution du script via MetaEditor, les messages de la console Python (stdout, stderr) sont affichés dans la section "Erreurs".




    Pour exécuter le script dans l'éditeur, cliquez sur "Compile" :
    .





    Pour travailler avec Python, n'oubliez pas de spécifier le chemin d'accès dans la section "Paramètres / Compilateurs" dans MetaEditor. Et pour travailler avec la bibliothèque MetaTrader 5, installez-la avec la commande :
    .
    pip install MetaTrader 5
    Pour en savoir plus sur l'intégration avec Python, consultez la documentation:

    .
  3. MQL5 : L'intégration avec Python a été complètement repensée. De nombreuses nouvelles fonctionnalités ont été ajoutées et le nom des commandes a été modifié.

    Nouveau nom de commande
    Les commandes existantes ont été renommées :
    MT5Initialize       -> initialize
    MT5Shutdown         -> shutdown
    MT5TerminalInfo     -> terminal_info
    MT5Version          -> version
    MT5CopyRatesFrom    -> copy_rates_from
    MT5CopyRatesFromPos -> copy_rates_from_pos
    MT5CopyRatesRange   -> copy_rates_range
    MT5CopyTicksFrom    -> copy_ticks_from
    MT5CopyTicksRange   -> copy_tick_range

    Nouvelles commandes
    La liste des commandes prises en charge a été considérablement élargie. Ajout de fonctions de négociation et d'utilisation de l'historique des transactions, d'obtention d'informations sur les instruments financiers et le compte courant.

    • account_info() - permet d'obtenir des informations sur le compte courant. Un analogue de AccountInfoInteger, AcountInfoDouble et AccountInfoString.
    • positions_total() - reçoit le nombre de positions ouvertes. Un analogue de PositionsTotal.
    • positions_get(symbol, ticket) - obtient les positions ouvertes par symbole ou ticket.
    • orders_total() - reçoit le nombre d'ordres. Un analogue de OrdersTotal.
    • orders_get(symbol, ticket) - obtient les ordres en cours par symbole ou ticket.
    • history_orders_total(from, to) - permet d'obtenir le nombre d'ordres dans l'historique au cours d'un intervalle de temps donné.
    • history_orders_get(from, to, position, ticket) - permet d'obtenir les ordres de l'historique dans un intervalle de temps spécifié par ticket ou avec filtrage par position.
    • history_deals_total() - obtient le nombre de transactions dans l'historique. Un analogue de HistoryDealsTotal.
    • history_deals_get(from, to, position, ticket) - permet d'obtenir les offres de l'historique dans un intervalle de temps spécifié par ticket ou avec un filtrage par position.
    • symbol_info(symbol) - permet d'obtenir des informations sur un instrument financier. Un analogue de SymbolInfoInteger, SymbolInfoDouble, SymbolInfoString.
    • symbol_info_tick(symbol) - obtient le dernier tick par symbole. Analogue de SymbolInfoTick.
    • symbol_select(symbol, enable) - active/désactive le symbole dans le "Market Watch". Analogue de SymbolSelect.
    • order_check(request) - Vérifie la marge d'un ordre. Analogue de OrderCheck.
    • order_send(request) - envoi d'un ordre au serveur. Un analogue de OrderSend.
    • order_calc_margin(action, symbol, volume, price) - calcul de la marge pour l'ordre. Un analogue de OrderCalcMargin.
    • order_calc_profit(action, symbole, volume, price_open, price_close) - calcul du profit. Un analogue de OrderCalcProfit.
      .

    Exécution de scripts Python sur les graphiques
    Désormais, les scripts Python peuvent être exécutés directement sur les graphiques de la plateforme, de la même manière que les programmes MQL5. Ils seront affichés avec des icônes spéciales dans le "Navigateur".
    .



    Les messages des scripts seront affichés dans la section "Outils / Experts". Si le script utilise la bibliothèque MetaTrader 5, il pourra recevoir des informations sur l'instrument, le compte et la transaction.

    Les scripts Python peuvent être exécutés sur le même graphique en parallèle avec d'autres scripts MQL5 et Expert Advisors. Pour arrêter un script si son exécution est en boucle, il suffit de le supprimer du graphique.

    Protection supplémentaire
    Pour protéger davantage vos comptes lors de l'utilisation de bibliothèques Python tierces, l'option "Désactiver le trading automatique via l'API Python externe" a été ajoutée aux paramètres du terminal.
    .




    Les scripts Python ne seront autorisés à négocier que si cette option est explicitement désactivée.

    .
  4. MQL5 : Le relancement des programmes MQL5 et la recréation d'indicateurs personnalisés à partir des programmes MQL5 ont été considérablement accélérés. Dans certains cas, la vitesse a augmenté de plusieurs centaines de fois.
    .
  5. MQL5 : Ajout de fonctions pour travailler avec les bases de données :

    DatabaseImport
    Importe les données d'un fichier dans une table.
    long  DatabaseImport(
       int           database,          // identifiant de la base de données reçu lors de l'ouverture de la base de données
       const string  table,             // nom de la table pour l'insertion des données
       const string  filename,          // nom du fichier pour l'importation des données
       uint          flags,             // combinaison de drapeaux
       const string  separator,         // séparateur de données 
       ulong         skip_rows,         // nombre de premières lignes à sauter 
       const string  skip_comments      // une chaîne de caractères définissant les commentaires
       );

    DatabaseExport
    Exporte une table ou le résultat de l'exécution d'une requête SQL vers un fichier CSV. Le fichier est créé en encodage UTF-8.
    long  DatabaseExport( 
       int           database,           // identifiant de la base de données reçu lors de l'ouverture de la base de données 
       const string  table_or_sql,       // nom de la table ou requête SQL 
       const string  filename,           // Nom du fichier CSV pour l'exportation des données 
       uint          flags,              // combinaison de drapeaux 
       const string  separator           // séparateur de données dans le fichier CSV 
       );

    DatabasePrint
    Imprime une table ou le résultat de l'exécution d'une requête SQL dans le journal de l'Expert Advisor.
    long  DatabasePrint(
       int           database,          // identifiant de la base de données reçu lors de l'ouverture de la base de données
       const string  table_or_sql,      // table ou requête SQL
       uint          flags              // combinaison de drapeaux
       );

  6. MQL5 : Ajout de la fonction FileSelectDialog qui appelle le dialogue système pour créer/ouvrir un fichier ou un dossier.
    int  FileSelectDialog(
       string   caption,              // titre de la fenêtre
       string   initial_dir,          // dossier de départ
       string   filter,               // filtre d'extension
       uint     flags,                // combinaison de drapeaux
       string&  filenames[],          // tableau de noms de fichiers
       string   default_filename      // nom de fichier par défaut
       );
    La nouvelle fonction permettra d'implémenter une interaction pratique entre l'utilisateur et le programme MQL5.

    .
  7. MQL5 : DEAL_FEE - paiement pour la réalisation d'une transaction - a été ajouté à l'énumération ENUM_DEAL_PROPERTY_DOUBLE. En fait, il s'agit d'un type de commission distinct qui peut être facturé par un courtier.

    .
  8. Tester : ajout de la possibilité de définir vos propres paramètres de compte de trading lorsque vous testez des stratégies - limites de trading, paramètres de marge et commissions. Ainsi, vous avez encore plus de possibilités de simuler les différentes conditions de trading des courtiers.
    .




    Paramètres généraux
    Dans cette section, vous pouvez définir le nombre maximum d'ordres ouverts et de positions que vous pouvez avoir sur votre compte en même temps. Vous pouvez également définir les sessions pendant lesquelles le programme testé ne sera pas autorisé à négocier.


    Marge
    Vous pouvez ici contrôler entièrement la manière dont la marge sera réservée et le système de comptabilisation des positions qui sera utilisé pendant les tests :

    .
    • Gestion des risques - modèle de gestion des risques : de gré à gré et en bourse, avec compensation et couverture. Des informations détaillées à ce sujet sont disponibles dans l'aide.
      .
    • Niveau "Margin call" - le niveau de fonds sur le compte, lorsqu'il est atteint, il passe à l'état "Margin call".
    • Niveau "Stop out" - le niveau de fonds auquel le compte est obligé de retirer les ordres et de fermer les positions de trading. Les deux niveaux peuvent être spécifiés en pourcentage et en argent. Dans le premier cas, les niveaux sont définis comme la valeur de l'indicateur "Fonds" sur le compte. Si l'option "Pourcentage" est sélectionnée, les niveaux sont définis comme la valeur de l'indicateur "Niveau de marge" sur le compte (Fonds/Marge*100).
    • Non réalisé - ce champ indique comment les bénéfices/pertes non réalisés actuels seront pris en compte dans la marge libre :
      .
      • Ne pas utiliser les profits/pertes non réalisés - les positions ouvertes ne sont pas prises en compte dans le calcul.
      • Utiliser le profit/la perte non réalisé(e) - utiliser la perte et le profit sur les positions ouvertes dans le calcul.
      • Utiliser le bénéfice non réalisé - n'utiliser que le bénéfice.
      • Utiliser la perte non réalisée - utiliser uniquement la perte.
    • Daily fixed - ce champ indique comment le profit/la perte fixé(e) par le trader au cours de la journée de trading sera pris en compte dans la marge libre :
      .
      • Use daily fixed profit/loss - prend en compte le profit et la perte fixés pendant la journée de négociation dans la marge libre.
      • Utiliser la perte fixe quotidienne - ne prendre en compte que la perte fixée au cours de la journée de négociation dans la marge libre. Pendant la journée, le bénéfice accumulé est fixé dans un champ de compte séparé ("Bloqué"). À la fin de la journée de négociation, le bénéfice accumulé est libéré (mis à zéro) et pris en compte dans le solde du compte (comptabilisé dans la marge libre).
    • Libérer les bénéfices accumulés à la fin de la journée - cette option n'est disponible que si l'option "Utiliser la perte fixe quotidienne" est activée. Si elle est activée, à la fin de la journée de trading, le profit accumulé pendant la journée sera libéré et enregistré sur le solde (et donc comptabilisé dans la marge libre). Dans le cas contraire, il ne le sera pas.


    Commission
    Dans cette section, vous avez un contrôle total sur la façon dont les commissions sont facturées sur toutes les transactions.

    .
    • Les commissions peuvent être à un ou plusieurs niveaux, c'est-à-dire qu'elles peuvent être facturées au même montant quel que soit le volume ou le chiffre d'affaires de la transaction ou varier en fonction de leur taille. Les informations pertinentes sont affichées dans le cahier des charges.
    • Les commissions peuvent être facturées immédiatement lors de l'exécution d'une transaction ou à la fin d'un jour/mois de négociation.
    • Les commissions peuvent être facturées en fonction du sens de la transaction : à l'entrée, à la sortie ou pour les deux types de transactions.
    • Les commissions peuvent être facturées par lot ou par transaction.
    • Les commissions peuvent être facturées en différents montants : en argent, en pourcentage ou en pips.



  9. Testeur : travail optimisé et considérablement accéléré en mode "Market Scan", lorsque plusieurs tests sont effectués sur tous les symboles du "Market Watch".
    .
  10. Testeur : Lors du calcul du profit en pips, la taille d'un trade ou d'une position est désormais prise en compte. Auparavant, le calcul était effectué sans tenir compte du volume - comme pour un lot.
  11. Testeur : L'optimisation des résultats de la gestion des graphiques a été améliorée. Lorsque l'on zoome sur un graphique d'optimisation régulier, il est désormais possible de le faire défiler. Un double clic sur un point du graphique met désormais en évidence le résultat correspondant dans le tableau des passes.
    .
  12. MetaEditor : Ajout de l'affichage des fichiers de base de données SQLite (*.db;*.sdb;*.sqlite;*.db3;*.s3db;*.sqlite3) dans le "Navigateur".
  13. MetaEditor : Correction des erreurs lors de l'enregistrement des propriétés du projet.
    .
  14. Mise à jour de la documentation.

La mise à jour sera disponible via le système LiveUpdate.


 

La version stable 5 build 2340 DatabaseImport montre le même DatabaseImport à l'exécution

2020.02.22 14:01:42.338 MQL5 'DOMcopy.ex5' a une nouvelle version non supportée, veuillez mettre à jour votre terminal client.

 

Bonjour !

J'ai essayé de créer une connexion à une base de données dans l'indicateur, mais pour une raison quelconque, cela n'a pas fonctionné.

Pourquoi n'est-il écrit nulle part, dans quels programmes puis-je utiliser des bases de données ?