Wednesday, 14 December 2016

Forex Sql Database

MetaTrader 5 - Intégration Comment accéder à la base de données MySQL à partir de MQL5 (MQL4) Introduction Le problème de l'interaction de MQL avec les bases de données n'est pas nouveau, mais il reste pertinent. L'utilisation des bases de données peut grandement améliorer les possibilités de MetaTrader: le stockage et l'analyse de l'historique des prix, la copie des métiers d'une plateforme de négociation à l'autre, fournissant des devis / métiers en temps réel, lourds calculs analytiques sur le serveur et / La surveillance et la télécommande de comptes utilisant des technologies web. Quoi qu'il en soit, il y avait beaucoup de tentatives de bénéficier de la combinaison de MQL et MySQL, certaines solutions sont disponibles dans la CodeBase. Par exemple MySQL enveloppe - bibliothèque pour MetaTrader 4 est le projet, à partir de laquelle de nombreux programmeurs démarrer leurs propres développements avec des ajouts supplémentaires. À mon avis, l'un des inconvénients de cette solution est l'allocation de tableaux spéciaux pour lire les données de la base de données. Un autre projet MySQL logger 1 - EA pour MetaTrader 4 est hautement spécialisé, il n'utilise pas de wrapper pour accéder à la bibliothèque standard libmysql. dll. Par conséquent, il ne fonctionne pas dans MetaTrader4 Build 600, car les caractères char ont été remplacés par wchart. Et l'utilisation du type int au lieu du pointeur de structure TMYSQL provoque des fuites de mémoire dans le projet (la mémoire allouée ne peut pas être contrôlée / libérée). Un autre projet intéressant est EAXMysql - bibliothèque MySQL - bibliothèque pour MetaTrader 5. C'est une bonne mise en œuvre. La liste des inconvénients énoncée par l'auteur impose certaines restrictions à son utilisation. Quiconque a besoin d'utiliser des bases de données dans ses projets MQL a deux options: soit développer sa propre solution et connaître chaque partie de celle-ci, soit utiliser / adapter toute solution tierce, apprendre à l'utiliser et détecter tous ses défauts qui Peuvent entraver leur projet. J'ai fait face à une telle nécessité et les deux options tout en développant un robot commercial assez complexe. Après avoir cherché à travers des projets existants et étudié un très grand nombre de solutions, j'ai réalisé que non des implémentations trouvées pourraient aider à apporter mon robot commercial au niveau professionnel. De plus, il y avait aussi des solutions absurdes, par exemple: les opérations DML / DDL (insérer / mettre à jour / supprimer des données, créer / supprimer des objets dans la base de données) ont été effectuées en utilisant le libmysql. dll standard, et la sélection des données (SELECT) Demande HTTP (à l'aide d'inet. dll) à un script PHP situé sur le serveur Web du côté du serveur MySQL. Les requêtes SQL ont été écrites dans le script PHP. En d'autres termes, pour exécuter le projet, il faut garder les composants suivants disponibles, configurés et exécutés: serveur MySQL, serveur web Apache / IIS, scripts PHP / ASP côté serveur. Une combinaison d'un assez grand nombre de technologies. Bien sûr, dans certaines circonstances cela peut être acceptable, mais quand la seule tâche est de sélectionner des données de la base de données - c'est absurde. En outre, le soutien d'une telle solution encombrante prend du temps. La plupart des solutions n'avaient aucun problème à insérer des données, à créer des objets, etc. Le problème était la sélection des données, car les données devaient être retournées à l'environnement appelant. J'ai pensé que l'utilisation de tableaux à cet effet était impraticable et gênant, tout simplement parce qu'au cours du développement / débogage / support du projet principal, les requêtes select à la base de données peuvent être modifiées, alors que vous devez également contrôler l'allocation de mémoire correcte pour les tableaux. Eh bien, cela peut et doit être évité. L'interface ci-après, MQL lt-gt MySql, est basée sur une approche typique utilisée dans Oracle PL / SQL, MS SQL T-SQL, AdoDB - utilisation de curseurs. Cette interface a été développée pour faciliter la programmation et la maintenance, ainsi qu'un minimum de composants. Il est implémenté en tant que wrapper DLL à la bibliothèque standard libmysql. dll et un ensemble de fonctions d'interface en tant que fichier. mqh. 1. MQL lt-gt Interface MySQL L'interaction entre le terminal MetaTrader (via les programmes MQL) peut être implémentée à l'aide des composants suivants: 1. La bibliothèque d'interface MQLMySQL. mqh. Il est ajouté au projet en utilisant le répertoire include et peut être modifié à votre goût. Il contient les directives pour l'importation de fonctions de la bibliothèque dynamique MQLMySQL. dll, ainsi que des fonctions pour les appeler et traiter les erreurs. 2. La bibliothèque dynamique MQLMySQL. dll. Il s'agit d'un wrapper pour accéder aux fonctionnalités de la bibliothèque standard libmysql. dll. En outre, la bibliothèque MQLMySQL. dll traite les résultats des opérations et l'accès partagé aux connexions et aux curseurs de base de données. Cela signifie que vous pouvez créer et utiliser plusieurs connexions à la fois (à partir d'un ou plusieurs programmes MQL), garder quelques curseurs ouverts, avec des requêtes vers une ou plusieurs bases de données. Les mutex sont utilisés pour séparer l'accès aux ressources partagées. 3. La bibliothèque dynamique standard libmysql. dll est un pilote d'accès natif. Vous pouvez le copier à partir de n'importe quelle distribution de base de données MySql dans C: WindowsSytem32 ou ltTerminalgtMQL5Libraries (pour MetaTrader 4 dans ltTerminalgtMQL4Libraries). En fait, il est responsable de l'envoi des requêtes à la base de données et de la récupération des résultats. Permettez-nous de s'attarder sur les points principaux, tels que: ouverture / fermeture de la connexion, l'exécution de requêtes DML / DDL et la sélection des données. 1.1. Ouverture et fermeture de la connexion La fonction MySqlConnect a été implémentée pour ouvrir la connexion avec la base de données MySQL: Cette fonction implémente la connexion avec la base de données et retourne un identificateur de connexion. Cet ID sera nécessaire pour interroger la base de données. En cas de défaillance de connexion, la valeur de retour est -1. Pour les détails d'erreur, vérifiez les variables MySQLErrorNumber et MySqlErrorDescription. En règle générale, cette fonction est appelée lors de la manipulation de l'événement OnInit () dans le programme MQL. Le nom DNS ou l'adresse IP du serveur MySQL Utilisateur de la base de données (par exemple, root) Le mot de passe de l'utilisateur de la base de données Le nom de la base de données Le port TCP / IP de la base de données (habituellement 3306) ) La combinaison de drapeaux spéciaux (généralement 0) La fonction d'interface MySqlDisconnect a été implémentée pour la fermeture de la connexion: Cette fonction ferme la connexion avec la base de données MySQL. En règle générale, cette fonction est appelée lors de la manipulation de l'événement OnDeinit () dans le programme MQL. Il convient de noter que la base de données MySQL peut fermer la connexion de son propre chef en cas de défaillance matérielle, de congestion réseau ou de timeout (lorsque aucune requête n'est envoyée à la base de données pendant longtemps). Souvent, les développeurs utilisent l'événement OnTick () pour écrire des données dans la base de données. Cependant, quand vient le week-end et le marché est fermé, la connexion est toujours suspendue. Dans ce cas, MySQL fermera son timeout (la valeur par défaut est de 8 heures). Et lundi, quand le marché est ouvert, les erreurs se trouvent dans le projet. Par conséquent, il est fortement recommandé de vérifier la connexion et / ou de se reconnecter à la base de données après un intervalle de temps inférieur au délai spécifié dans les paramètres du serveur MySQL. 1.2. Exécution des requêtes DML / DDL Les opérations DML sont utilisées pour les manipulations de données (D ata M anipulation L anguage). Les manipulations de données comprennent l'ensemble suivant d'instructions: INSERT, UPDATE et DELETE. Les opérations DDL sont utilisées pour la définition des données (D af fi nition de D définitions). Cela comprend la création (CREATE) d'objets de base de données (tables, vues, procédures stockées, déclencheurs, etc.) et leur modification (ALTER) et suppression (DROP). Ses instructions DML / DDL ne sont pas toutes, mais DCL (D ataControl L anguage) est utilisée pour séparer l'accès aux données, mais nous ne nous intéresserons pas aux fonctionnalités de SQL. L'une de ces commandes peut être exécutée à l'aide de la fonction d'interface MySqlExecute: En tant que requête SQL, vous pouvez également utiliser la commande USE pour sélectionner la base de données. Je voudrais mentionner l'utilisation de requêtes multi-instructions. Il s'agit d'un ensemble de commandes SQL séparées par le caractère. Pour activer le mode multi-instructions, la connexion avec la base de données doit être ouverte avec l'indicateur CLIENTMULTISTATIONS: Dans ce fragment, 3 entrées seront insérées dans la table EURUSD avec un seul appel à la base de données. Chacune des requêtes stockées dans la variable SQL est séparée par. Cette approche peut être utilisée pour l'insertion fréquente / mise à jour / suppression d'un ensemble de commandes nécessaires est combiné en un seul paquet, ce qui soulage le trafic réseau et améliorer les performances de la base de données. La syntaxe INSERT dans MySQL est assez bien développée en termes de gestion des exceptions. Par exemple, si la tâche consiste à déplacer l'historique des prix, une table doit être créée pour les paires de devises avec la clé primaire du type datetime, car la date et l'heure d'une barre sont uniques. En outre, il convient de vérifier si les données d'une barre particulière existent dans la base de données (pour améliorer la stabilité de la migration des données). Avec MySQL cette vérification n'est pas nécessaire, puisque l'instruction INSERT supporte ON DUPLICATE KEY. Dans les mots plus simples, si une tentative est faite pour insérer des données et que la table a déjà une entrée avec la même date et l'heure, l'instruction INSERT peut être ignorée ou remplacée par UPDATE pour cette ligne (voir. Dev. mysql / doc / Refman / 5.0 / fr / insert-on-duplicate. html). 1.3. Sélection des données L'instruction SQL SELECT est utilisée pour récupérer les données de la base de données. La séquence d'actions ci-dessous est utilisée pour sélectionner les données et récupérer le résultat de la sélection: Préparation de l'instruction SELECT. Ouverture du curseur. Obtention du nombre de lignes renvoyées par la requête. Boucler et récupérer chaque ligne de la requête. Extraction de données aux variables MQL à l'intérieur de la boucle. Fermeture du curseur. Bien sûr, il s'agit d'un schéma général, donc pas toutes les opérations sont nécessaires pour chaque cas. Par exemple, si vous voulez vous assurer qu'une ligne existe dans la table (par n'importe quel critère), il suffira de préparer une requête, d'ouvrir un curseur, d'obtenir le nombre de lignes et de fermer le curseur. En fait, les parties obligatoires sont - la préparation de l'instruction SELECT, l'ouverture et la fermeture du curseur. Qu'est-ce qu'un curseur? C'est une référence à la zone de mémoire de contexte, en fait - l'ensemble de valeurs résultant. Lorsque vous envoyez la requête SELECT, la base de données alloue de la mémoire pour le résultat et crée un pointeur vers une ligne que vous pouvez déplacer d'une ligne à l'autre. Ainsi, il est possible d'accéder à toutes les lignes dans l'ordre d'une file d'attente définie par la requête (clause ORDER BY de l'instruction SELECT). Les fonctions d'interface suivantes sont utilisées pour la sélection des données: Ouverture du curseur: l'identificateur de curseur retourné par MySqlCursorOpen La fermeture d'un curseur est une opération critique. N'oubliez pas de fermer les curseurs. Imaginez que vous ouvrez le curseur et oubliez de le fermer. Supposons que les données soient récupérées sur le curseur à chaque virgule lors de la manipulation de l'événement OnTick (), et chaque fois qu'un nouveau curseur est ouvert, la mémoire est allouée pour lui (côté client et serveur). À un certain moment, le serveur refusera le service parce que la limite des curseurs ouverts est atteinte, ce qui pourrait provoquer le débordement de la mémoire tampon. Bien sûr, son exagéré, un tel résultat est possible lorsque vous travaillez avec libmysql. dll directement. Toutefois, la bibliothèque dynamique MQLMySQL. DLL distribue la mémoire pour les curseurs et refuse d'ouvrir un curseur qui dépasse la limite autorisée. Lors de la mise en œuvre des tâches réelles, il suffit de garder 2 ou 3 curseurs ouverts. Chaque curseur peut gérer une mesure cartésienne de données en utilisant deux à trois curseurs simultanément (imbriqués, par exemple, lorsqu'un paramètre dépend d'un autre curseur) couvre deux ou trois dimensions. C'est parfaitement bien pour la plupart des tâches. En outre, pour la mise en œuvre de la sélection de données complexes, vous pouvez toujours utiliser ces objets pour représenter la base de données (VIEW), les créer sur le côté serveur et leur envoyer des requêtes à partir du code MQL en tant que tables. 1.4. Informations supplémentaires Les éléments suivants peuvent être mentionnés comme des caractéristiques supplémentaires: 1.4.1. Lecture de données à partir d'un fichier. INI Souvent, le stockage des informations sur les connexions à la base de données (adresse IP du serveur, port, nom d'utilisateur, mot de passe, etc.) directement dans le code MQL (ou paramètres de l'Expert Advisor, indicateur de script) n'est pas Rationnel, parce que le serveur peut être déplacé, son adresse peut changer dynamiquement, etc. Vous aurez besoin de modifier le code MQL dans ce cas. Ainsi, toutes ces données devraient être mieux stockées dans le fichier. INI standard, alors que seul son nom devrait être écrit dans le programme MQL. Ensuite, utilisez la fonction ReadINI pour lire les paramètres de connexion et les utiliser. Par exemple, le fichier INI contient les informations suivantes: Pour obtenir l'adresse IP du serveur, exécutez les opérations suivantes: Le fichier INI se trouve à C: MetaTrader5MQL5Experts et est appelé MyConnection. ini, vous accédez à la clé Server de la section MYSQL. Dans un fichier INI, vous pouvez stocker des paramètres sur différents serveurs utilisés dans votre projet. 1.4.2. Tracer les zones problématiques La bibliothèque d'interface fournit le mode trace, qui peut être activé pour le débogage de requêtes SQL n'importe où dans un programme MQL. Spécifiez les éléments suivants dans la zone de problème: Si vous activez le traçage au début du programme MQL et ne le désactivez pas, tous les appels à la base de données seront enregistrés. Le journal est conservé dans la console de terminal (à l'aide de la commande Imprimer). 2. Exemples Cette section fournit quelques exemples de connexion et d'utilisation des bibliothèques développées. Les voir et estimer l'utilité de la solution logicielle. L'exemple MySQL-003.mq5 montre ce qui suit: connexion à une base de données (les paramètres de connexion sont stockés dans le fichier. ini), création d'une table, insertion de données (également à l'aide d'instructions multiples) et déconnexion de la base de données. Exemple MySQL-004.mq5 montre la sélection des données d'une table créée par le script MySQL-003.mq5. Les exemples ci-dessus contiennent le traitement typique des erreurs utilisé dans les projets réels. En fait, chaque requête utilisée dans un programme MQL doit être débogée dans n'importe quel client MySQL (PHPMyAdmin, DB Ninja, console MySQL). Personnellement, j'utilise et recommande des logiciels professionnels pour le développement de base de données Quest TOAD for MySQL. Conclusion Cet article ne décrit pas les détails de la mise en œuvre de MQLMySQL. DLL développé dans l'environnement Microsoft Visual Studio 2010 (C / C). Cette solution logicielle est conçue pour une utilisation pratique et a plus de 100 implémentations réussies dans divers domaines du développement de logiciels MQL (de la création de systèmes de négociation complexes à la publication Web). Les versions des bibliothèques pour MQL4 et MQL5 sont jointes ci-dessous. Les pièces jointes incluent également un fichier zip avec le code source de MQLMySQL. DLL La documentation est incluse dans les archives Pour utiliser les exemples, n'oubliez pas de spécifier les paramètres de connexion à votre base de données dans le fichier ScriptsMyConnection. ini. Download Free Forex Data Download Étape 1: Sélectionnez l'Application / Platform et TimeFrame. Dans cette section, vous serez en mesure de sélectionner pour quelle plate-forme vous aurez besoin des données. MetaTrader 4 / MetaTrader 5 Cette plate-forme permet l'utilisation des données M1 (1 Minute Bar) uniquement. Ces fichiers sont bien adaptés pour les stratégies de trading backtesting sous MetaTrader 4 et MetaTrader 5 plate-forme. Veuillez sélectionner: Cette plate-forme permet l'utilisation des données M1 (1 Minute Bar) et Tick avec une seconde résolution. Ces fichiers sont bien adaptés pour les stratégies de trading backtesting sous les dernières versions de la plate-forme NinjaTrader. Veuillez sélectionner l'intervalle de temps dont vous avez besoin: Cette plate-forme permet l'utilisation des données M1 (1 minute) uniquement. Ces fichiers sont bien adaptés pour les stratégies de trading backtesting sous la plateforme MetaStock. Veuillez sélectionner: Pour un usage générique, ce format permet d'importer des données M1 (1 minute) dans une 3ème application. Veuillez sélectionner: J'ai récemment téléchargé la plate-forme MetaTrader Terminal (MT4). J'ai mon propre moteur de test arrière qui stocke une certaine sortie dans ma base de données SQL-server. La sortie dépend du modèle que je teste. Cependant, la sortie peut être aussi simple que le temps d'entrée d'un métier. Ce que je voudrais savoir Est-il possible dans MQL4 de télécharger des données d'une base de données de serveur de SQL et puis annoter le diagramme avec un B simple pour une entrée d'achat ou S pour une entrée de vente Donc j'ai exécuté une simulation de retour d'essai (ie EURUSD De 2010 à 2011) et stocké le temps des entrées d'achat et de vente. Je voudrais alors aller à ma plate-forme MetaTrader 4 et exécuter un script qui permettrait de télécharger le temps de tous les acheter et vendre des entrées de ma base de données SQL et sur mon étiquette graphique EURUSD ces XTO-s. A demandé le support syntaxique pour l'importation de services basés sur DLL, qui permettent la ré-intégration des outils, la syntaxe fermée Du MQL4 ne permet pas de gagner de manière plus naturelle. De cette façon, votre code, que ce soit MQL4-Script ou MQL4-ExpertAdvisor peut communiquer avec des processus externes, y compris. Tout SGBD raisonnablement efficace. Il y a peu de caractéristiques importantes qu'une architecture de conception de code et d'intégration devrait garder à l'esprit. MQL4, depuis les premiers jours, n'est pas un simple processeur séquentiel, à savoir le MQL-CustomIndicator est loin de ce paradigme. Le code (à l'exception du cas de MQL4-Script) agit comme une usine événementielle, qui est initiée par flux asynchrone des événements de marché entrants. L'utilisateur est responsable de toutes les mesures pour ne pas violer la stabilité en temps réel de ce principe d'Oméga Omega principe de MQL4-principes. En d'autres termes, une mauvaise conception, qui peut obtenir un I / O-blocage (en raison de RDBMS traitement et al), sera probablement une raison pour Trading Terminal crash (es), qui est la dernière chose que tout le monde est prêt à l'expérience (Que ce soit en live-trading ou de back-testing phase), n'est-il pas Ainsi, un son non-bloquant, hétérogène, parallèle multi-process de l'architecture d'intégration amp code-design doit être utilisé pour cette tâche. Il fonctionne très bien, si fait professionnellement Garder le dit à l'esprit permet très intelligent, rapide et (presque) des architectures illimitées à travailler avec Terminal (s) de négociation. Avoir plusieurs cas avec la messagerie en temps quasi-réel entre le code MT4 / MQL4 et le moteur AI / ML via python, moteur de flux rapide FIX-Protocol pour l'entrée de données en temps réel du fournisseur de Liquidity Pool, utilisant un tissu de calcul NVIDIA / GPU distant Co-integrated IRC / skype / email Canaux d'approvisionnement de signal. Ainsi, une philosophie peut faire est en place. SQL n'est rien d'extra dans ce sens. Mettre des étiquettes est trivial dans le même sens. Juste de votre imagination, MQL4 permet de construire (encore une fois en utilisant une conception en temps quasi réel) une couche GUI réactive / interactive qui permet, en quelques millisecondes de barrière de stabilité, de travailler avec le Terminal de trading de manière purement graphique Il ya bien longtemps avant qu'une étiquette de vente de One-Click-Trading soit venu avec juste un click-To-Buy / click-To-Sell) travaillant entièrement interactivement avec les aides visuelles visuelles contrôlées par ligne / graphiques-objets, (Avec une configuration GUI indirecte du jeu de règles) ou pour un style de négociation Augmented. Oui, vous pouvez faire de votre MT4 Trading Terminal une sorte d'affichage de cartographie programmable à distance, piloté non pas par FX-Market, mais par un processeur Cloud, où votre Remote Strategy Testing Engine rulez. Comme je le comprends (corrigez-moi si I39m mal) l'Expert Advisor amp Indicateur personnalisé sont événementielles donc quand un événement sur le marché se produit ils sont appelés. Un script n'est même pas conduit donc c'est là que je devrais créer mon code. Est-il possible d'arrêter la mise à jour des tableaux pour contourner le problème de stabilité Comme I39m dos test I39m pas concerné par la mise à jour des cartes. Ndash mHelpMe Oct 27 14 at 9:58 Droit, MQL4-Script n'a pas de déclencheur à partir d'une file d'attente d'événements, correct. Pourtant, je ne compterais pas sur l'envoi d'un ampli aveugle SQL-querry en attente, mais plutôt de mettre en œuvre une asynchrone proxy-interface, qui permettrait de médiation MQL4-front-end / SQL-back-end traitement de la file d'attente-gestion, , Pour éviter à la fois le blocage MQL4 et le cas de surcharge MQL4, lors de l'obtention d'une avalanche d'octets dans la réponse quotblock-buster (sans mentionner les échelles de cas HFT comme un premier problème dans la liste): ndash user3666197 Oct 27 14 À 10:06 Demandez demandé ci-dessus, votre code ne sait pas, si le MT4-Graph est en ligne, ou un hors-ligne. Vous pouvez facilement activer votre code MQL4-Script sur un graphique hors ligne, il ne quotlistenquot à aucune mise à jour néanmoins by-design. Une autre question est d'avoir des données OHLCV quotrelevant déjà disponibles dans le MT4-HistoryCentre (une base de données, à partir de laquelle votre graphique obtiendra des données PriceDOMAIN pour tracer bougies / barres) - mais c'est un autre sujet à l'adresse. Ndash user3666197 Oct 27 14 at 10:12


No comments:

Post a Comment