MetaTrader 5 - Exemples MetaTrader 5 et MATLAB Interaction Introduction Mon premier article L'interaction entre MetaTrader 4 et MATLAB Engine (Virtual MATLAB Machine) a été remarquée par MQL-community. Certains lecteurs (1Q2W3E4R5T) ont même été en mesure de déplacer ce projet de Borland à VS2008. Mais le temps avance sans relâche et (triste mais vrai) MetaTrader 4 disparaît, laissant place à son successeur MetaTrader 5 avec MQL5, qui a introduit pointeurs et mémoire dynamique. Grâce à ces innovations, nous avons la possibilité d'écrire une bibliothèque universelle d'interaction avec la machine virtuelle MATLAB Engine et de lier directement les bibliothèques générées par MATLAB avec MetaTrader 5. Cet article couvre une telle fonctionnalité. Cet article poursuit logiquement le précédent et couvre plus complètement le problème de l'interaction entre MetaTrader 5 et MATLAB. Pour rendre la portée de cet article plus compréhensible pour les lecteurs non préparés, nous allons le diviser en trois parties: la théorie, la référence et la pratique. La théorie couvrira les types de données utilisées dans MQL5 et MATLAB, ainsi que leur conversion mutuelle. Dans Reference, vous apprendrez les structures linguistiques et la syntaxe des fonctions, nécessaires pour créer une DLL. Et en pratique, nous analyserons les pièges de cette interaction. Les lecteurs expérimentés peuvent ignorer la théorie et la référence, et commencer par la pratique. D'autres sont invités à lire la théorie et la référence, et seulement ensuite passer à la pratique. Il vaut également la peine de lire des livres mentionnés dans la section Littérature. 1.1 Types de données dans MATLAB et MQL5 1.1.1 Types de données simples Tout d'abord, nous devons nous familiariser avec les mondes intérieurs de MQL5 et de MATLAB. Tableau 1. Types de données dans MATLAB et MQL5 Il existe une différence majeure: les variables dans MQL5 peuvent être simples ou composites (complexes), et dans MATLAB toutes les variables sont multidimensionnelles (Complexe) - c'est-à-dire matrice. Vous devez toujours vous souvenir de cette différence 1.1.2 Types de données complexes Dans MQL5, il existe 4 types de données complexes: les tableaux, les chaînes, les structures et les classes. Le type de données complexe est constitué de plusieurs types de données simples, combinés en blocs de mémoire de certaine longueur. Lorsque vous utilisez ces données, vous devez toujours connaître la taille du bloc mémoire en octets ou le nombre d'éléments (à l'exception des classes). Nous ne sommes intéressés que par les tableaux et les chaînes, car soumettre des classes et des structures MQL5 à MATLAB n'a aucun sens. Lorsque vous passez des tableaux de tout type que vous devez savoir: type (dimension) et nombre d'éléments à l'aide de la fonction ArraySize (). Une attention particulière doit être accordée à l'indexation dans MetaTrader 5 - généralement il est vers l'arrière (c'est-à-dire le premier élément contient des données plus récentes que la suivante). Vérifiez ceci à l'aide de la fonction ArrayIsSeries (). Et MATLAB a l'indexation suivante: le premier élément contient les données plus anciennes que la suivante - donc vous devez inverser vos tableaux avant de les envoyer à MATLAB, si flag ASSERIES TRUE. Sur la base de ce qui précède, permettez-nous d'accord avec ce qui suit: Inverser les tableaux invisibles aux programmes MQL5, sauf pour les tableaux de type char et les tableaux bidimensionnels - les laisser inchangés. Reverse invisiblement toutes les matrices de MATLAB, et assigner l'indicateur ASSERIES avec TRUE, sauf pour les tableaux de type char et les tableaux bidimensionnels - les laisser inchangés. Dans chaque tableau du programme MQL5, créé selon l'indexation vers l'arrière, l'indicateur ASSERIES doit être TRUE, sauf pour les tableaux de type char et les tableaux bidimensionnels - les laisser inchangés. Mais ce n'est pas la seule limitation lorsque vous travaillez avec des tableaux. Lorsque vous travaillez avec des matrices multidimensionnelles ou des matrices pour être plus correctes, en particulier à partir de MATLAB, nous introduisons la restriction pour des matrices non plus de 2 dimensions. Ici, le drapeau ASSERIES ne peut pas être VRAI, et par conséquent, ces tableaux ne sont pas inversés. N'oubliez pas que les chaînes dans MQL5 ne sont pas des tableaux des éléments de type char. Donc, lors du passage de chaînes vient un léger problème: dans MQL5 chaînes codées en utilisant Unicode, et MATLAB utilise le codage ANSI. Donc, avant de passer une chaîne, il doit être converti en tableau de caractères ANSI à l'aide de la fonction StringToCharArray (). Et vice versa, lorsque vous obtenez un tableau de caractères de MATLAB, convertissez-le en utilisant la fonction CharArrayToString () (voir Tableau 2). Pour éviter toute confusion, acceptez: stocker toutes les chaînes dans les programmes MQL5 en utilisant Unicode, pas de tableaux de type char. 1.2 Comparaison des types de données MQL5 et MATLAB Afin de réduire la quantité de fonctions et de simplifier l'algorithme de la bibliothèque, nous réduirons la quantité de types par conversion automatique, ce qui ne devrait pas affecter l'intégrité des données. Le tableau suivant illustre la règle de conversion de type de données de MQL5 en MATLAB: Avec ce type de conversion, il ya une perte de précision. Nous ne l'utiliserons pas, mais vous pouvez utiliser cette conversion dans vos programmes. Tableau 2. Comparaison des types de données MQL5 et MATLAB Maintenant, vous connaissez les types de données utilisés dans MQL5 et MATLAB. Vous savez quels écueils attendent en passant des données et comment les contourner avec compétence. Vous devez connaître MATLAB Engine API et vous familiariser avec MATLAB Compiler 4. 2. Référence MATLAB Engine API, MATLAB Compiler 4 Référence et C Input Output Library Reference Cette section vous présente les fonctions les plus importantes de MATLAB Engine API, les fonctionnalités de MATLAB Compiler 4 et nombre de fonctions utiles de la bibliothèque de sortie d'entrée standard C. Alors, commençons. 2.1 MATLAB Engine API et fonctions MCR MATLAB Engine - est une interface externe qui permet à d'autres programmes d'utiliser le bureau MATLAB. Il fournit un travail entièrement fonctionnel de tous les paquets MATLAB sans aucune restriction. Bien qu'il ne soit pas dit dans la documentation, mais en termes de programmeur système - c'est juste une machine virtuelle, comme PHP, MySQL, etc qui prend en charge un moyen simple et relativement rapide d'échanger des données entre MetaTrader 4 5 et MATLAB. Cette méthode de connexion des programmes externes avec le package MATLAB est recommandée par les développeurs. L'interface se compose de six fonctions: Engine pEng engOpen (NULL) cette fonction appelle le bureau MATLAB, le paramètre est toujours NULL, renvoie un pointeur vers le descripteur de bureau. Int exitCode engClose (Engine pEng) cette fonction ferme le bureau, renvoie le nombre d'utilisateurs restants du bureau MATLAB, où: Engine pEng pointeur vers le descripteur de bureau. MxArray mxVector mxCreateDoubleMatrix (int m, int n, int ComplexFlag) cette fonction crée une variable (matrice) du bureau MATLAB, renvoie un pointeur à la variable (matrice), où: mxArray mxVector pointeur à la variable matrice. Int m nombre de lignes. Int n nombre de colonnes. ComplexFlag type de nombre complexe, pour MetaTrader 4 5 mxREAL. Void mxDestroyArray (mxArray mxVector) cette fonction détruit la matrice MATLAB, elle est nécessaire pour effacer la mémoire, où: mxArray mxVector pointeur à la variable matrice. Int engPutVariable (Engine pEng, nom char, mxArray mxVector) cette fonction envoie la variable au bureau. Vous devez non seulement créer des variables de type mxArray, mais également les envoyer à MATLAB, où: Engine pEng pointeur vers le descripteur de bureau. Char Nom nom de la variable du type char dans le bureau MATLAB. MxArray mxVector pointeur sur la variable de matrice. MxArray mxVector engGetVariable (Engine pEng, char Name) cette fonction obtient une variable du bureau - l'inverse de la fonction précédente. Seules les variables du type mxArray sont acceptées, où: mxArray mxVector pointeur à la variable de matrice. Moteur pEng pointeur vers le descripteur de bureau. Char Nom nom de la variable du type char dans le bureau MATLAB. Double p mxGetPr (mxArray mxVector) cette fonction obtient un pointeur sur le tableau de valeurs, elle est utilisée pour copier des données avec memcpy () (voir 2.3 C Standard Input Output Library), où: double pointeur p vers tableau du type double. MxArray mxVector pointeur sur la variable de matrice. Int engEvalString (Engine pEng, char Commande) cette fonction envoie des commandes au bureau MATLAB, où: Engine pEng pointeur vers le descripteur de bureau. Char Commande pour MATLAB, chaîne du type char. Vous avez probablement remarqué que l'API MATLAB Engine vous permet de créer la structure mxArray uniquement pour le type double. Mais cette restriction n'affecte pas vos possibilités, mais affectera l'algorithme de votre bibliothèque. MCR (MCR instance) est la bibliothèque spéciale du paquet MATLAB, qui permet d'exécuter des bibliothèques publiques d'applications autonomes, générées par l'environnement MATLAB sur n'importe quel ordinateur. Notez que même si vous avez un package MATLAB complet, vous devez toujours installer la bibliothèque MCR en exécutant le fichier MCRInstaller. exe, situé dans le dossier ltMATLABgtToolboxcompilerdeploywin32. Ainsi, avant d'appeler n'importe quelle fonction de bibliothèque publique, créée par l'environnement MATLAB, vous devez appeler la fonction d'initialisation MCR: bool mclInitializeApplication (const char option, int count) retourne TRUE si le démarrage MCR a réussi, sinon FALSE où: const char option string of Options, comme dans mcc - R est habituellement NULL int count size options chaîne, typiquement 0. En terminant le travail de bibliothèque publique, vous devez appeler: bool mclTerminateApplication (void) retourne TRUE si MCR a été fermé avec succès. 2.2 MATLAB Compiler 4 MATLAB Compiler vous permet de créer les éléments suivants à partir des fonctions M: Applications autonomes qui s'exécutent même si MATLAB n'est pas installé. C C qui peuvent être utilisés sans MATLAB sur les systèmes d'utilisateurs finaux. Compiler prend en charge la plupart des commandes et des packages de MATLAB, mais pas tous. La liste complète des restrictions peut être trouvée sur le site Web de MATLAB. Cette méthode vous permet de créer un paquet indépendant du logiciel MetaTrader 5 et MATLAB, mais contrairement au moteur MATLAB, nécessite un programmeur bien formé et une connaissance approfondie de la compilation. MATLAB Compiler nécessite au moins un des compilateurs C C suivants: Lcc C (généralement fourni avec MATLAB). Son seul compilateur C. Borland C versions 5.3, 5.4, 5.5, 5.6. Microsoft Visual C C versions 6.0, 7.0, 7.1. MATLAB Compiler 4, contrairement à ses prédécesseurs, génère uniquement le code d'interface (wrapper), c'est-à-dire ne traduit pas m-fonctions en code binaire ou CC, mais crée un fichier spécial basé sur la technologie CTF (Component Technology File) Intégrations de différents paquetages, nécessaires pour prendre en charge les fonctions m. MATLAB Compiler crypte également ce fichier avec unique (non répétée) clé 1024 bits. Maintenant, considérons l'algorithme de MATLAB Compiler 4, car l'ignorance de ce sujet entraînera de nombreuses erreurs stupides au moment de la compilation: l'analyse des dépendances à ce stade détermine toutes les fonctions, les fichiers MEX et les fichiers P, dont les fonctions m compilées dépendent . Création d'archives - Le fichier CTF est créé, il est crypté et compressé. En générant le code objet de l'enveloppe à ce stade, tous les codes sources sont créés, nécessaires pour le composant: C C code d'interface pour les fonctions m spécifiées dans la ligne de commande (NameFilemain. c). Fichier de composant (NameFilecomponent. dat), qui contient toutes les informations nécessaires pour exécuter m-code (y compris les clés et chemins de cryptage, stockés dans le fichier CTF). C C traduction. À ce stade, les fichiers de code source C C sont compilés dans des fichiers objet. Mise en relation. La dernière étape de la construction du projet. Lorsque vous utilisez le compilateur (mcc), vous devez en apprendre plus sur les clés afin d'avoir un plan détaillé des actions. Tableau 4. Lignes de la table de conversion de Matlab mbuild (version 4) Tableau 4 listes Les touches principales. Pour plus d'informations, utilisez les commandes help mbuild ou doc mbuild. 2.3 C Bibliothèque de sortie d'entrée standard L'utilisation de la bibliothèque de sortie d'entrée standard fournit la copie de données correcte. Son utilisation vous sauvera des erreurs stupides qui surgissent pendant la phase de conception du programme (par exemple: de nombreux programmeurs novices copient uniquement le pointeur vers le bloc de mémoire au lieu de copier le bloc de mémoire entier). Cette fonction copie (clone) tableau variable de pOut à pIn avec la taille des octets nSizeByte, où: void pointeur pIn Tableau, où copier. Void pOut le pointeur vers le tableau, à partir duquel la copie est effectuée. Int nSizeByte la taille des données copiées, ne doit pas dépasser la taille du tableau pIn, sinon une erreur d'accès à la mémoire se produira. 3. Pratique Maintenant, nous sommes faits avec la théorie et nous pouvons procéder à la réalisation de MetaTrader 5 amp MATLAB interaction. Comme vous l'avez probablement deviné, cela se fera de deux façons: en utilisant la machine virtuelle MATLAB Engine et en utilisant les bibliothèques générées par MATLAB Compiler. Tout d'abord, considérez un moyen simple, rapide et polyvalent d'interaction via MATLAB Engine. Cette partie de l'article doit être lue du début à la fin, car, malgré la différence apparente entre les méthodes d'interaction, ils ont une philosophie et une syntaxe familière des constructions du langage, et apprendre des choses nouvelles est plus facile avec des exemples simples. 3.1 Développer la bibliothèque universelle de MetaTrader 5 amp MATLAB Engine Interaction Cette méthode d'interaction ne peut pas être appelée élégante et rapide, mais elle est la plus fiable et couvre l'intégralité du package MATLAB. Bien sûr, nous devrions mentionner la vitesse de développement du modèle final. L'essence du développement est d'écrire une bibliothèque universelle-wrapper pour MetaTrader 4 5 amp MATLAB Engine interaction. Après cet expert MetaTrader 4 5 script expert peut gérer MATLAB bureau virtuel. Et tout l'algorithme mathématique peut être stocké dans le programme MQL sous forme de chaînes, vous pouvez donc l'utiliser pour protéger votre propriété intellectuelle (pour plus de détails, voir l'article Protégez-vous, développeurs). Il peut également être stocké dans m-fonctions ou fonctions P-fichiers séparés dans le dossier ltMetaTrader 5gtMQL5Libraries. Les domaines d'application possibles de cette interaction: Pour tester ou démontrer des idées de modèles mathématiques sans avoir à écrire des programmes complexes (la protection de la propriété intellectuelle peut être organisée comme dans le programme MQL et au moyen du paquet MATLAB - en utilisant les fonctions P). Ecrire des modèles mathématiques complexes en utilisant toutes les caractéristiques de MATLAB. A tous ceux qui ne vont pas distribuer leurs scripts indicateurs experts. Commençons. J'espère que vous avez lu les 1.1 types de données dans MATLAB et MQL5. 1.2 Comparaison des types de données MQL5 et MATLAB. 2.1 Fonctions MATLAB Engine API et MCR et 2.3 C Standard Input Output Library, car nous ne les suspendrons pas et ne les analyserons plus. Lisez attentivement le schéma suivant, qui illustre l'algorithme de la future bibliothèque: Figure 1. Schéma de bloc de l'algorithme de bibliothèque Comme on le voit sur la figure 1, la bibliothèque se compose de trois blocs principaux. Considérons leurs buts: Bloc MQL5, préparation préliminaire des données reçues reçues: Matrices inversées. Conversion de types. Conversion des encodages de chaînes. C Bloc C: Convertit le tableau dans la structure mxArray. Passe les commandes MATLAB Engine. MATLAB Système de calcul de bloc moteur. Maintenant, nous allons traiter des algorithmes. Eh bien commencer par bloc MQL5. Lecteur attentif a déjà remarqué qu'il se concentrera sur la mise en œuvre de ce qui a été écrit dans les types de données dans MATLAB et MQL5 section. Si vous avez manqué, vous ne comprenez pas pourquoi tout cela est nécessaire. Algorithme des fonctions mlnput ltvariabletypegt est presque identique. Discuter de son travail en utilisant la fonction mlInputDouble () qui fournit l'entrée des variables du type double à MATLAB machine virtuelle. Bool mlInputDouble (double amparray, int sizeArray, chaîne NameArray). Où: référence de tableau à variable ou tableau du type double. SizeArray taille du tableau (nombre d'éléments, pas d'octets). Chaîne NameArray, contenant le nom de variable unique pour la machine virtuelle MATLAB (le nom doit correspondre aux exigences MATLAB). Convertir la chaîne NameArray en char array en utilisant la fonction StringToCharArray (). Vérifiez le type d'indexation à l'aide de la fonction ArrayIsSeries (). Si le type d'indexation est une valeur de passe normale à la fonction mlxInputDouble (). Indexation ELSE du tableau timeseries: reverse array et valeur passée à la fonction mlxInputDouble (). End, passez la valeur renvoyée à la fonction mlxInputDouble (). L'algorithme des fonctions mlGet ltvariabletypegt est également presque identique. Discuter de son travail à l'aide de la fonction mlGetDouble (), qui retourne la variable du type double de la machine virtuelle MATLAB. Int mlGetDouble (double amparray, int sizeArray, chaîne NameArray). Où: référence de tableau à variable ou tableau du type double. SizeArray taille du tableau (nombre d'éléments, pas d'octets). Chaîne NameArray, contenant le nom de variable unique pour la machine virtuelle MATLAB. Convertir la chaîne NameArray en char array en utilisant la fonction StringToCharArray (). Trouvez la taille du tableau à l'aide de la fonction mlxGetSizeOfName (). Si la taille est plus que zéro. Allouer le tableau récepteur de taille nécessaire en utilisant la fonction ArrayResize (), obtenir des données de mlxGetDouble (). Retourner la taille du tableau. Si la taille est ZÉRO. Erreur de retour, c'est-à-dire valeur nulle. Thats it Les fonctions mlGetInt () et mlGetLogical () produisent la conversion d'ombre des types double - gt int bool. Dans ce but, ces fonctions créent un tampon de mémoire temporaire dans leur corps. Il s'agit d'une mesure forcée, car malheureusement, l'API MATLAB ne permet pas de créer des structures mxArray pour les types de données autres que le double. Cependant, ceci ne signifie pas que MATLAB opère exclusivement les doubles types. C C est beaucoup plus facile - il devrait fournir la traduction de données du type double dans la structure mxArray. Il est fait en utilisant le mxCreateDoubleMatrix (). MxGetPr () et memcpy (). Ensuite, à l'aide de la fonction engPutVariable (), elle transmet des données à la machine virtuelle MATLAB, et pour extraire des données, elle utilise la fonction engGetVariable (). Encore une fois, attention aux fonctions avec les préfixes Int et Logical comme vu dans le schéma de bloc, ils n'interagissent pas directement avec MATLAB, mais utilisez les fonctions mlxInputDouble mlxGetDouble et mlxInputChar (). Algorithme de leur comportement est simple: appel de la mlxInputDouble mlxGetDouble les valeurs de sortie d'entrée de fonction comme double () et envoyer l'ombre commande MATLAB pour convertir le type de données via la fonction mlxInputChar (). MATLAB bloc moteur est encore plus facile. Il ne fournit que des fonctions mathématiques. Son comportement dépend de vos commandes et de vos fonctions m p. Maintenant, quand tous les détails du projet sont clairs, il est temps de s'occuper de la construction du projet. Une telle construction commence avec la création de la bibliothèque principale dans notre cas c'est C C bloc. À cet effet, dans n'importe quel éditeur de texte ANSI (Bloc-notes, Bred, etc.) créez un fichier avec l'extension DEF. Il est souhaitable que le nom de ce fichier se compose de caractères latins sans espaces et de ponctuation, sinon vous entendrez de nombreux mots flatteurs de votre compilateur. Ce fichier assure la permanence de vos fonctions. Si ce fichier est absent, le compilateur C C inventera ses propres noms exotiques pour exporter des fonctions. Ce fichier contient: le mot de contrôle LIBRARY, le nom LibMlEngine de la bibliothèque et le deuxième mot de contrôle EXPORTS, puis les noms des fonctions. Comme vous le saviez probablement, les noms des fonctions d'exportation ne peuvent pas avoir d'espaces et de ponctuation. Voici le texte du fichier DllUnit. def de l'archive MATLABEngine. zip: LIBRARY LibMlEngine EXPORTATIONS mlxClose mlxInputChar mlxInputDouble mlxInputInt mlxInputLogical mlxGetDouble mlxGetInt mlxGetLogical mlxGetSizeOfName mlxOpen Donc, nous avons le premier fichier du projet. Ouvrez maintenant l'Explorateur Windows et accédez au dossier ltMATLABgtExterninclude. Copiez le fichier engine. h (fichier d'en-tête de la machine virtuelle MATLAB) dans le dossier où vous avez construit le projet (si vous ne le faites pas, vous devrez spécifier manuellement le chemin du fichier au moment de la compilation). Maintenant son temps pour créer C C bloc. Nous n'inclurons pas le code source complet du programme dans l'article, car ce fichier peut être trouvé dans MATLABEngine. zip comme DllUnit. cpp et il est bien commenté. Notez que son mieux de créer des fonctions en utilisant stdcall convention, c'est-à-dire les paramètres sont passés à travers la pile, et la fonction nettoie la pile. Cette norme est native pour Win32 64 API. Considérez comment déclarer une fonction: extern C declspec (dllexport) ltvariabletypegt stdcall Fonction (lttypegt ltnamegt) extern C declspec (dllexport) indique au compilateur C que la fonction est externe. Ltvariabletypegt type de variable retournée, peut être: void, bool, int, double. Types composites (connus non seulement à Dll, mais aussi au programme appelant) et des pointeurs. Stdcall déclaration sur le passage des paramètres à la fonction et retour, son un standard pour Win32 64 API. Fonctionnez le nom de votre fonction. Lttypegt ltnamegt type et nom de la variable d'entrée, nombre maximal de variables est 64. CC construction de blocs: pour cela, vous devez inclure la bibliothèque de sortie d'entrée standard et ajouter au projet les fichiers suivants (dans votre compilateur: Project-gtAdd Project): DllUnit. Def Dans le répertoire ltMATLABgtExternlibltwin32 64gtltcompilergt, où: ltMATLABgt le dossier principal MATLAB. Ltwin32 64gt ou le dossier win32 pour l'OS 32 bits, ou win64 pour l'OS 64-bit. Ltcompilergt le dossier borland pour Borland C C ver. 5-6, le dossier microsoft pour Microsoft Visual C: libeng. lib libmx. lib Une question commune comme ceci peut se poser: J'ai une version différente du compilateur ou pas un tel compilateur dans la liste (très rarement il n'y a pas de tels fichiers). Permet de voir comment créer manuellement une bibliothèque publique. Nous allons examiner comment il est fait dans Visual C et dans Borland C: Dans FAR ouvert ltMATLABgtBinltwin32 64gt dossier, où: ltMATLABgt dossier principal MATLAB. Ltwin32 64gt ou le dossier win32 pour l'OS 32 bits, ou win64 pour l'OS 64-bit. Pour Borland C, entrez: implib libeng. lib libeng. dll. Idem pour libmx. dll. Pour Visual C, entrez: lib lib. dll. Idem pour libmx. dll. Si autre compilateur. Tout compilateur de n'importe quel langage de programmation doit avoir cet utilitaire - Library Manager, généralement c'est un programme console ltcompiler foldergtbinlib. exe. Soit dit en passant, j'ai oublié de vous avertir - ne pas essayer de faire 64 bits LIB pour le compilateur 32 bits. Tout d'abord, découvrez s'il existe un support d'adressage 64 bits dans l'aide du compilateur. Sinon, recherchez 32-bit MATLAB DLL, ou choisissez un autre compilateur C C. Passons à la compilation, après quoi nous obtenons une bibliothèque, qui doit être placé dans le dossier terminalfolderMQL5Libraries. Commençons maintenant par le bloc MQL. Figure 3. Assistant MQL5: Propriétés générales de la bibliothèque Maintenant, lorsque l'Assistant MQL5 a créé un modèle, procéder à son édition: Notez que MQL 5 vous Peut passer des pointeurs de deux façons: void NameArray Cette méthode de passage de tableau permet uniquement de lire des données. Cependant, si vous essayez d'utiliser cette référence pour éditer son contenu, vous obtiendrez une erreur d'accès mémoire (dans le meilleur des cas pour vous, MetaTrader 5 manipulera tranquillement l'erreur dans le cadre SEH, mais nous avons HAVENT WRITE un SEH-frame, donc Nous pouvons même manquer la raison de l'erreur). Voidamp NameArray Cette méthode de passage vous permet de lire et de modifier le contenu du tableau, mais vous devez conserver la taille du tableau. Si la fonction n'accepte pas ou ne passe pas de paramètres, spécifiez toujours le type de vide. 2. Nous ne décrirons pas toutes les fonctions du bloc MQL, car vous pouvez trouver le code source MatlabEngine. mq5 dans MATLABEngine. zip. Par conséquent, considérons bien les détails de la déclaration et la définition des fonctions externes dans MQL5: Comme vu dans l'exemple, la déclaration et la définition de la fonction sont combinés. Dans ce cas, nous déclarons une fonction nommée mlInputChar () comme external (export), qui retourne la valeur du type bool et accepte la chaîne array comme paramètre. Compilez maintenant. Maintenant que nous avons terminé le dernier bloc de la bibliothèque et compilé, il est temps de le tester en conditions réelles. Pour ce faire, écrivez un script de test simple (ou prenez-le à partir de MATLABEngine. zip, file: TestMLEngine. mq5). Le code de script est simple et bien commenté: Comme vu à partir du script, nous entrons des valeurs, puis obtenons des valeurs. Toutefois, contrairement à MetaTrader 4, où nous avons besoin de connaître la taille du tampon au stade de conception, MetaTrader 5 n'est pas nécessaire, car nous utilisons des tampons dynamiques. Maintenant que vous avez enfin compris MATLAB machine virtuelle, vous pouvez commencer à utiliser DLL construit dans l'environnement MATLAB. 3.2 Directives techniques de construction à l'aide de la DLL générée par MATLAB Compiler 4 Dans la section précédente, vous avez appris comment créer une bibliothèque pour une interaction universelle avec le package MATLAB. Cependant, cette méthode a un inconvénient - il nécessite le paquet MATLAB de l'utilisateur final. Cette restriction crée un certain nombre de difficultés dans la distribution des produits logiciels finis. C'est pourquoi MATLAB package mathématique a un compilateur intégré, qui vous permet de créer des applications autonomes indépendantes du paquet MATLAB. Jetons un coup d'oeil à elle. Par exemple, considérez un simple indicateur - moyenne mobile (SMA). Mettez-le à niveau en ajoutant un filtre de réseau neuronal (GRNN), qui permet de lisser le bruit blanc (rafales aléatoires). Nommez le nouvel indicateur comme NeoSMA et filtrez GRNNFilter. Nous avons donc deux m-fonctions, dont nous voulons créer une DLL, qui peut être appelée à partir de MetaTrader 5. Maintenant, rappelez-vous que le MetaTrader 5 recherche les DLL dans les dossiers suivants: ltterminaldirgtMQL5Libraries ltterminaldirgt Dossier actuel Dossier système ltwindowsdirgtSYSTEM32 ltwindowsdirgt Les répertoires répertoriés dans le Variable d'environnement système PATH. Par conséquent, placez dans l'un de ces répertoires deux m-fonctions (NeoSMA. m et GRNNFilter. m), où nous allons construire DLL. J'attire votre attention sur ce fait de placement, car ce n'est pas fait par accident. Le lecteur attentif connaît déjà la fonctionnalité du compilateur MATLAB - il conserve les chemins lors de la compilation (voir 2.2 MATLAB Compiler 4). Avant de commencer à compiler le projet, vous devez configurer le compilateur. Pour ce faire, procédez comme suit: Dans la ligne de commande MATLAB entrez: mbuild - setup Appuyez sur y pour confirmer la recherche des compilateurs compatibles C C installés dans votre système. Choisissez le compilateur Lcc-win32 C standard. Appuyez sur y pour confirmer le compilateur sélectionné. Figure 4. Compilation du projet Maintenant, nous sommes prêts à passer au processus de compilation des m-fonctions. Nc-N lib: NeoSMA - T lien: lib NeoSMA. m GRNNFilter. m Expliquez les touches: - N pour sauter tous les chemins inutiles - W lib: NeoSMA dit compilateur que NeoSMA est le nom de la bibliothèque - T lien: lib dit Compilateur pour créer une bibliothèque publique avec des noms de liaison NeoSMA. m et GRNNFilter. m m-functions Maintenant, permet de voir ce que le compilateur a créé: mccExcludedFiles. log fichier de log contenant des actions de compilateurs NeoSMA. c C version de la bibliothèque (contient - code de wrapper) Fichier NeoSMA. ctf (voir 2.2 MATLAB Compiler 4) section NeoSMA. h fichier d'en-tête (contient les déclarations des bibliothèques, des fonctions, des constantes) NeoSMA. obj fichier objet (fichier source contenant machine et pseudo-code) NeoSMA. exports noms des fonctions exportées NeoSMA. Dll Dll pour la liaison ultérieure de NeoSMA. lib Dll à utiliser dans les projets CC NeoSMAmcccomponentdata. c Version C sur le composant (utilisé pour la conformité avec le fichier CTF, contient des chemins, etc.) NeoSMAmcccomponentdata. obj objet version du composant (fichier source contenant machine et pseudo Code) Donc laisse manipuler avec DLL, précisément avec sa structure interne. Il se compose de (fonctions de base seulement) de: Fonction principale de n'importe quel DLL - BOOL WINAPI DllMain (). Qui (selon la spécification Microsoft) gère les événements se produisant dans DLL: chargement DLL dans l'espace d'adressage du processus, la création d'un nouveau flux, la suppression du flux et décharger Dll de la mémoire. Fonctions de service de la désinitialisation d'initialisation de DLL. BOOL ltNameLibgtInitialize (void) void ltNameLibgtTerminate (void) sont nécessaires pour lancer l'environnement de travail Math de téléchargement avant d'utiliser les fonctions de la bibliothèque et à la fin de leur utilisation. Exporte des fonctions m void mlfltNameMfilegt (int ltnumberofreturnvaluesgt, mxArray ltreturnvaluesgt, mxArray ltinputvaluesgt.), Où: ltnumberofreturnvaluesgt nombre de variables renvoyées (ne pas confondre avec la taille du tableau, etc.). MxArray ltreturnvaluesgt adresse de la structure mxArray où les résultats de la fonction m-function seront retournés. MxArray ltinputvaluesgt pointeur vers la structure mxArray de la variable d'entrée m-function. Comme vous pouvez le voir, m-functions exportées contiennent des adresses et des pointeurs à la structure mxArray, et vous ne pouvez pas appeler directement ces fonctions à partir de MetaTrader 5, car il ne comprendra pas ce type de données. Nous ne décrivons pas la structure mxArray dans MetaTrader 5, parce que les développeurs MATLAB ne garantissent pas qu'il ne changera pas avec le temps, même dans la même version du produit, donc vous avez besoin d'écrire un simple DLL-adaptateur. Son schéma de blocage est illustré ci-dessous: Figure 5. DLL-Adapter Block-Scheme Il est très semblable à la droite de DLL pour MATLAB Engine, donc nous ne vais pas analyser son algorithme et procéder directement au code. Pour ce faire, créez deux petits fichiers dans votre compilateur CC: nSMA. cpp (à partir de DllMatlab. zip): nSMA. def (à partir de DllMatlab. zip): LIBRARY nnSMA EXPORTATIONS IsStartSMA nSMA Créez le projet dans votre compilateur CC: pour cela vous avez besoin Pour inclure la bibliothèque de sortie d'entrée standard et ajouter au projet les fichiers suivants (dans votre compilateur: Project-gtAdd Project): nSMA. def Dans ltMATLABgtExternlibltwin32 64gtltcompilergt dossier, où: ltMATLABgt dossier principal MATLAB. Ltwin32 64gt ou le dossier win32 pour l'OS 32 bits, ou win64 pour l'OS 64-bit. Ltcompilergt le dossier borland pour Borland C C ver. 5-6, le dossier microsoft pour Microsoft Visual C (j'ai des fichiers pour la version 6): libmx. lib mclmcr. lib NeoSMA. lib créer manuellement (voir 3.1 Développement de la bibliothèque universelle de MetaTrader 5 amp MATLAB Engine Interaction). Le dernier, ce que je veux vous dire dans cette section, concerne les fichiers nécessaires au déplacement du projet vers un autre ordinateur, là où il n'y a pas de MATLAB installé. Voici une liste de fichiers et de chemins sur la machine cible: MCRInstaller. exe n'importe quel dossier (programme d'installation de MCR) extractCTF. exe n'importe quel dossier (pour l'installateur de MCR) MCRRegCOMComponent. exe n'importe quel dossier (pour l'installateur de MCR) unzip. exe n'importe quel dossier (pour MCR Installateur) NeoSMA. dll ltterminaldirgtMQL5Libraries NeoSMA. ctf ltterminaldirgtMQL5Libraries nnSMA. dll ltterminaldirgtMQL5Libraries De nombreux programmeurs avancés ont déjà deviné qu'il est conseillé d'utiliser un programme d'installation (SETUP). Il ya beaucoup d'entre eux sur Internet, y compris les produits gratuits. Maintenant, nous devons tester cette DLL dans MetaTrader 5. Pour ce faire, nous allons écrire un script simple (TestDllMatlab. mq5 à partir de la DllMatlab. zip): Conclusion Donc, vous savez comment créer une bibliothèque universelle pour MetaTrader 5 amp MATLAB interaction, et Comment connecter DLL construite dans l'environnement MATLAB. Mais il ya encore des interfaces de MetaTrader 5 amp MATLAB interaction à décrire, mais cela dépasse la portée de cet article. Le sujet de cet article est couvert en détail. Ive a choisi les moyens les plus efficaces d'interaction, ne nécessitant pas un type spécial d'adaptateurs. Bien que vous puissiez aller d'une autre manière, comme la technologie. NET - Comment exporter des devis de MetaTrader 5 vers des applications. NET à l'aide des services WCF. Beaucoup de lecteurs peuvent avoir une question: quelle méthode choisir La réponse est simple - les deux, parce que pendant le débogage de conception du modèle mathématique la vitesse n'est pas nécessaire. Mais vous aurez besoin de la pleine puissance de MATLAB sans coûts de production spéciaux pour la programmation. MATLAB moteur aidera ici, bien sûr. Cependant, lorsque le modèle mathématique est débogué et prêt à l'emploi, vous aurez besoin de la vitesse, le multitâche (travail de l'indicateur et ou du système commercial à plusieurs tableaux de prix) - ici sans doute vous aurez besoin d'une DLL, construit dans l'environnement MATLAB. Mais tout cela ne vous oblige pas à le suivre. Everybody will give the answer to this question himself, relying primarily on the proportion of programming cost to the scale of the project (number of indicator and or trade system users). It makes no sense to create Dll in the MATLAB environment for one or two users (its easier to install MATLAB on two computers). Many readers, who are unfamiliar with MATLAB, probably have a question: why all of this MQL5 has already mathematical functions The answer is that use of MATLAB enables you to effortlessly implement your mathematical ideas, here is just a partial list of possibilities: dynamic algorithm of fuzzy logic in the indicator and or mechanical trade system dynamic genetic algorithm in mechanical trade system (dynamic strategy tester) dynamic neural network algorithm in the indicator and or mechanical trade system three dimensional indicators simulation of nonlinear management systems So, all in your hands, and do not forget: Mathematics has always been the queen of sciences, and MATLAB package is your scientific calculator. Literature Translated from Russian by MetaQuotes Software Corp. Original article: mql5 ru articles 44Bitfinex announced today the start of mining contracts as a trading product on their platform. In total 100 THS (terahashes per second) with an expiration in 3 months have been made available for trading under the name TH1BTC. The 100 THS are part of a larger pool of 3500 THS so more mining contracts might become available in the future. Interestingly, this marks the first time that it is possible to short a mining contract. Shorting a mining contract means to receive an amount of Bitcoin now (the price we sell it at) and subsequently paying dividends (in Bitcoin) over the following 3 month until the contract expires in the middle of December. A profit is made if the sum of all the dividends paid out (plus the interest we paid to short the contract) is less than what we received at the beginning when we sold the contract (to someone else obviously). This means the price of TH1BTC should depend on 3 variables (in decreasing order of importance): The change of the mining difficulty until 15 December The time remaining until 15 December The interest rate (swap rate) If difficulty increases dividend payments become smaller because 1 THS represents a smaller fraction of the whole network hashing power. Therefore the price of one contract should decrease if difficulty increases. The closer we get to expiration the fever Bitcoins can be mind with 1 THS in total. Therefore the price of one contract should decrease the closer we get to expiration and reach a price of 0 at expiration. The higher the interest rate the more costly it is to enter and keep the contract over the full length of 3 month. Bitfinex does not offer 90 days swaps, therefore entering a contract with the goal to hold it until the end contains quite a bit of interest rate risk because at some point a new swap has to be taken out (at a potentially unfavorable interest rate). This is less of a problem when going long (Bitcoin rates are typically low) than when going short (there is only a maximum of 100 contracts available in total, no naked shorting). To compensate for the risk prices should increase when swap rates are increasing. The big unknown is of course the change in the mining difficulty over the next 90 days. In the following figure we see how difficulty changed over the previous 6 month. The data is from Tradeblock and it shows not only a graphical representation of past changes in the difficulty (difficulty changes every 14 days depending on past hash rate. More info can be found in the wiki ) but also some basic summary statistics. On average difficulty has increased 27 over the last 30 days and 77 over the last 60 days. To estimate the fair price of one TH1BTC we will assume that difficulty will increase on average 15 per month over the next 3 month. Currently the price of buying one contract worth 1 THS is 2 BTC. The pool fee is 3 and we will ignore interest rates. Filling in all the information we get the following results: Hence if we go long one contract based on our assumptions we would make a loss of about 0.39 Bitcoin (a bit more in reality since we will start mining in the middle of September until the middle of December) because the expected dividends (monthly revenue) is not going to cover our initial costs of 2 BTC before the contract expires. On the other hand, going short at a price of 2 Bitcoin would have generated a profit of about 0.39 Bitcoin per contract. Keep in mind that we didn8217t include swap costs which are currently at around 1 per day (). There are two ways to look at the results. Either we could say prices for TH1BTC are currently overvalued and should be closer to around 1.5 BTC. If we assume difficulty will increase more than 15 per month then prices should be even lower than that. Or we could say that the market is efficient and prices are correct, which would imply that the market is expecting difficulty to decrease on average about 2 per month over the next 90 days. Either way, results will be known with certainty in 90 days. Struggling to recover from the most recent Bitcoin flash crash which originated on Bitfinex only four days go. Bitcoin prices took another dive today as margin traders got their positions liquidated on BTC-e. The event started at 1:36 PM (UTC1) when large sell orders began to show up on the third largest western Bitcoin exchange BTC-e. Downwards momentum increased steadily as the orderbook became increasingly thin, crashing prices to a low of USD 309 per Bitcoin at 1.43 PM. In the following minutes prices rebounded swiftly on thin volume back to around USD 442 as arbitrage traders started to take advantage of the discount relative to other exchanges. BTC-e is one of the few large exchanges that offer margin trading to their clients via the MetaTrader platform since November 2013, but the details of who excactly provides the funds necessary for margin trading have remained unclear. The shape and especially timing of the crash points towards margin traders being liquidated (or stop orders being executed), similar to what happened on Bitfinex a couple of days ago. However, unlike Bitfinex which is transparent about open swap positions. BTC-e does not provide important data which would be needed to provide a more thorough analysis and so this last statement can only be considered a good guess. Unlike Bitfinex, which relies on a hidden algorithm in an effort to control the order flow. BTC-e seems to have no special safeguards in place to mitigate such events. The fall below 400 was mainly due to a lack of bids in the orderbook and not because the market believed that the true value was below 400, as the rebound back to over 440 only minutes later basically proved. Hence, halting trading during extreme downwards volatility could have easily averted the bloodshed among margin traders by giving other market participants more time to thicken the orderbook. Update 4:58PM (UTC1): BrCapoeira posted on Reddit an interesting graph based on data from the Metatrader platform: This graph implies that a single large order was the cause of this event. Whether this order was created due to a margin call, a simple mistake, to manipulate the market, or to open a large short position remains unclear. Common sense would suggest that it was probably the result of a margin call of a single large trader. My previous post on this topic has been brought up during discussions in the aftermath of the most recent Bitcoin flash crash. Coindesk was one of the first to pick it up and since then various posts about transparency and the possible responsibilty of exchanges to actively manage order execution started to appear. As a result of those events Josh Rossi, Vice President of Business Development at Bitfinex, went on Reddit to openly address some of the issues brought up against the exchange. The facts we know for sure are that there were some large sell orders shortly before the crash started, for example a 500 sell order on Bitstamp at 9.49am (UTC1), about 6 minutes before a large sell order on Bitfinex triggered the crash. However, the data does not tell us whether it was insider trading, some form of market manipulation. or a simple mistake. Fact is that after the Bitcoin flash crash open swap positions decreased from around 28m to 24m which indicates about 8400 margin long positions were closed (assuming an average of 475) in one way (margin call) or another (stop order hit). The data does not tell us what the ratio is but according to Josh only about 650 Bitcoins were sold as the result of margin calls. As correctly pointed out by Jonathan Levin. fact is that starting about 24 hours before the bitcoin flash crash until the crash itself an additional 1000 Bitcoins were taken out in short positions and about 2500 shorts were subsequently closed during the crash. Whether those shorts were opened to hedge existing positions, as a malicious attempt to trigger a margin call, or a way to front-run the market using private information cannot be determined from the available data (it does look oddly suspicious though). What was unexpected Personally, the interesting point is not that Bitcoin flash crashed. Sudden price fluctuations happened in the past and will happen in the future, especially in illiquid markets such as Bitcoin. The interesting point is the involvement of Bitfinex and how they actively managed order execution without informing market participants in advance. The Bitfinex matching engine was not halted during the whole crash though it did slow down (but nowhere as bad as the infamous 70 minute order lag on the now defunct MtGox exchange during the crash in 2012 ). However, what Bitfinex did was they introduced something they now refer to as speed bumps. What it means is that they essentially flag orders they deem as invalid or potentially dangerous and slow them down intentionally . At first sight this might seem like a nice idea. Who doesn8217t want a filter to remove or slow down malicious orders However, as so often with those kind of things the devil is in the detail. The problem is that Bitfinex has not (and possibly never will ) make public how exactly they categorize an order as 8220bad8221 and 8220slow it down8221. If a market participant decides to put up a large sell order against a thin orderbook then that8217s his decision. Whether his action was intended or not is not up to the exchange to decide. It might be that this market participant was simply the first person to react to a major event and is entirely willing to bear the additional costs of the resulting slippage in anticipation of a major price move. There simply does not exist a way to accurately classify orders a priori as 8220good8221 or 8220bad8221 since that would automatically assume knowledge of all immediate future events. What can be improved Mistakes (8220fat finger8221, algorithm going havoc) happen, margins get called and people try to game the system in every possible way. Logically there have to be safeguards in place to protect markets and its participants. Bitfinex was definitely aware of potential toxic order flow and prepared counter measures. The only thing they forgot was to inform their clients about the hidden safety features. Hiding those safeguards from the public adds uncertainty to the market (especially now that we know they exist and sometimes do something) and essentially puts every traders trust into the hands of Bitfinex. At this point a trader can only hope that Bitfinex will always act in the best intentions of their clients. This hope might be futile though, since Bitfinex makes money from trading fees, independently whether a trader actually makes any money. One does not have to think for long to realize the hidden potential for abuse in such a system. The main reason brought up by Josh why Bitfinex does not intend to publicise their algorithm is to avoid giving traders the possibility to exploit it is bogus and the following shows why. Those are the official market wide circuit breakers used by NASDAQ, posted online and entirely transparent for every market participant. Those rules are certainly not perfect but they are simple, transparent, and work for one of the largest stock markets in the world. Now, I have great respect for the people working on the Bitfinex platform, but I doubt that they managed to come up with an algorithm which protects market participants better than the ones used by a major exchange trading more than 900 million shares per day on average. And if they did, now is the chance for Bitfinex to prove it to the world and possibly write history by teaching the big boys how to properly run an exchange. When it comes to public exchanges transparency is a must, not just for Bitfinex but for any exchange. Market participants have to know exactly what happens when they place an order and should under no circumstances have to rely on good faith alone. Safeguards are important because accidents happen and markets crash but it is not up to the exchange to engage in secret order discrimination. There are different ways to safeguard financial markets and none of them is perfect. Adding complexity usually increases the chance for unintended side effects and therefore a simple, transparent approach seems more appropriate than a hidden, complex one. Two days ago BitMEX reduced their trading fees to 0 and celebrated it by releasing a basic market making bot on Github. BitMEX is currently running a trading challenge until August 29, 2014 to promote their new platform. Releasing a market marking bot is probably an interesting and effective way to increase API traffic and stress test the platform a bit. Of course I couldn8217t resist and had a look. Market-maker is a forked off Liquidbot. which was original designed to run on the now obsolet MtGox exchange. There were some minor changes (new api class to connect to BitMEX, some additional prints to console, changes to adapt for futures contracts, and a huge and unnecessary print to console when starting up) but no significant changes to the trade logic. The algorithm uses REST and only checks for changes every 60 seconds. This already disqualifies the bot as it is essential too slow to react to ongoing changes in the orderbook. BitMEX limits requests to the REST API to 150 per 5 minutes so you can try reducing the 60 seconds to something like 3 but it won8217t change the fact that as soon as markets start to move you will hit the limit and be stuck with open positions. To be fair, BitMEX provides the bot more as a marketing stunt and explicitly states that switching to WebSocket will be highly beneficial as it allows real time updates. Overall, the algorithm is solidly written, technically works and is easy to setup, but it won8217t make you any money in the long run. If someone seriously considers to employ this bot I would recommend the following small changes to make the code more usable: 1. Change to Websocket 2. Exit position on close: 3. Build orders starting from the midpoint:In addition I would advise to measure volatility in some way and adapt the distance between orders dynamically as well as the size. During my testing the API was always responsive and accurate. Volume on the exchange is still low but the fundamentals of the platform look promising. This bot is a fun tool to introduce users into the world of market making and algorithmic trading but it won8217t stand a chance against established algorithms. Note: If you consider using this algorithm keep in mind that market making is a full time job. Anything less than complete dedication, fast reaction time, and 100 uptime will cause you to lose money. Edit: Follow up on the aftermath here Today Bitcoin prices took a dive as margin traders on one of the largest exchange Bitfinex got their orders liquidated. For many close market observers and more sophisticated traders this did not come as a surprise. In fact, long positions have been building up continuously over the last couple of months in anticipation of a new bubble in Bitcoin prices and reached as high as 30m in outstanding swap positions on Bitfinex. Now, this wouldn8217t be a problem all by itself as long as there is enough capital backing the loan. Unfortunately, most of those long positions were entered around 600 8211 640 USD BTC and the collateral was mostly provided in Bitcoins itself. The following chart nicely shows the buildup of long positions, peaking around July 14 with close to 32m in swaps. Running some quick math based on the maintenance margin of Bitfinex of 13 and assuming Bitcoin as collateral we find that margin calls should start around the 520 8211 540 USD BTC mark. Yesterday, prices came close and today they finally jumped over the cliff. The problem is that once margin calls set in you have a cascading effect which rips through the order book, causing even more orders to reach the point of no return and increasing the downward momentum further. These kind of events are not limited to Bitcoin exchanges but can also occur on major exchanges such as during the 2010 flash crash in the US. The cause of such a flash crashe can vary and goes from fat finger mistakes to programming errors to cascading margin calls. It is interesting to see how the exchanges deal with these events. In the US, Nasdaq implemented market wide circuit breakers which will cause trading to stop under such extreme circumstances. Bitcoin markets are not yet as advanced and usually continue trading. If we look at the order action on Bitfinex today we see something very peculiar: It seems (and this is just a guess as there is no official comment from the exchange) as if Bitfinex is running an algorithm to handle the margin calls. The algorithm starts selling but limits itself to a 10 drop in prices within 1 minute. If prices drop more than 10 in 1 minute it will stop selling and wait for buy orders to come in. Once there are again a certain amount of buy orders in the orderbook the algorithm starts selling again until all margin calls are met. Edit: LeMogawai was the first to point this out in this post and it matches my personal observation at the time of the event. This seems to be an interesting way to deal with cascading margin calls but can also be considered as borderline market manipulation from the exchange side. By spreading out the sell orders over time the downwards momentum is reduced, however traders end up trading against the exchange itself and not the market anymore. The exchange has an informational advantage at that point and is therefore more likely to profit than the traders. Fortunately, this only lasted for about 10 minutes after which control was given back to the market. Other exchanges which also offer margin trading such as BTC-e and OKcoin are now in a favorable position and can learn from todays events. Implementing a system more closely resembling the circuit breakers of big exchanges such as Nasdaq might be a smart first move. Recently I am working to get my new trading platform going. This new version is based on Python, uses MySQL to keep a database of all time series of different virtual currencies with automatic backfill from BitcoinCharts and integrates the 3 major exchanges MtGox, BTC-E and Bitstamp. The platform will be used as way to backtest some strategies and engage in automatic trading. During the run-up to this I decided to pull some data of BTC against USD from BitcoinCharts and based on the ideas of a paper by Hashem and Timmermann (1995) implemented a simple trading strategy. The idea is to forecast the sign of the t1 period return based on a regression, which is estimated on an automatic selection of technical indicators during the last n period up until t . Then, after t1 happened, we refresh the model and try to predict t2 using all the data available of the last n periods until t1 and so on. For my Bachelor Thesis I examined four different technical trading rules in Forex markets. It uses MCS and SPA test to search for valid models among different parameters that are not subject to data snooping. Taking into account realistic transaction costs we find no evidence of excess returns, which is consistent with market efficiency. With this code you should be able to look for Bitcoin arbitrage opportunities within BTC-e. It uses the idea of one price and applies triangular arbitrage, taking into account costs and spread. The reason I post this here is despite that it works, chances are you will be too slow to compete with other investors doing the same. Possible improvements would be to take into account the order book depth and split the trades up dynamically, trying to undercut other traders doing the same. Also setting everything up on a dedicated server close to the physical location of the BTC-e match engine should drastically reduce lag and give you a potential edge. Navigation des articles
No comments:
Post a Comment