Sunday 12 February 2017

Matlab Handelsindikatoren

Matlab und MT4 Matlab zu Metatrader, einige Ratschläge Vor kurzem habe ich gelernt, wie man ein vollwertiges Handelssystem in Matlab, die sich selbst anpasst, werde ich nicht stören Sie mit den Details jetzt, ich brauche nur einige Ratschläge zu machen. Grundsätzlich, was ich brauche, ist es, einen Datenstrom zwischen metatrader und Matlab zu bekommen, oder zumindest eine DLL, die ich in einem Indikator oder Expertenberater verwenden können. Mein Trading-System optimiert innerhalb von Matlab, sagen alle 6 Stunden oder so. Ich habe gelesen und folgte dem DDE-Artikel auf MQL4, aber es funktioniert nicht für mich, seltsam genug, es gibt keine Fehler, aber keine Daten, die ganze Zeit mit DDE in Metatrader eingeschaltet, auch es geht nur eine Möglichkeit. Jede Beratung über andere Optionen und Ansätze sind mehr als herzlich willkommen im Voraus Parallel Computing und GPUs in Matlab Angewandte Zeitreihenanalyse Matlab. Angewandte Zeitreihenanalyse als herunterladbare Vorlesungen und Matlab Skripte (Forex Daten sind im Wesentlichen eine klassische Zeitreihe Daten, also nicht mit der Tatsache, dass diese nicht direkt mit Forex Daten verwechselt werden verwechselt werden) Applied Time Series AnalysisMetaTrader 4 - Beispiele Interaktion zwischen MetaTrader 4 Und Matlab via CSV-Dateien Einführung Die Matlab-Umgebungen Die Rechenleistung ist bekanntermaßen deutlich besser als die der Programmiersprache MQL4. Eine breite Palette von mathematischen Funktionen, die von Matlab zur Verfügung gestellt werden, ermöglichen es, komplexe Berechnungen durchzuführen, die die theoretische Grundlage der durchgeführten Operationen völlig vernachlässigen. Jedoch stellt die Echtzeit-Interaktion zwischen einem Handelsterminal und Matlab eine nichttriviale Aufgabe dar. In diesem Artikel schlage ich vor, einen Weg, um den Datenaustausch zwischen MetaTrader 4 und Matlab über CSV-Dateien zu organisieren. 1. Interworking Angenommen, bei jedem neuen Balken muss MetaTrader 4 Daten über die letzten 100 Balken an Matlab senden und mit ihren Bearbeitungsresultaten reagieren. Um dieses Problem zu lösen, müssen wir ein Kennzeichen in MetaTrader 4 erstellen, das Daten in eine Textdatei schreiben und die Verarbeitungsergebnisse einer anderen von Matlab erstellten Textdatei lesen würde. MetaTrader 4 muss seine Datendatei bei jedem neuen Bar bilden. Es muss versuchen, die Ergebnisse bei jedem Tick zu lesen, zu. Um das Ergebnis nicht zu lesen, bevor Matlab es aktualisiert, werden wir die Datei, die das Ergebnis enthält, gelöscht, bevor wir unsere Ausgabedatei erstellen. In diesem Fall wird der Leseversuch nur dann erfolgreich sein, wenn Matlab seine Berechnung beendet und eine neue Datei bildet. Matlab muss die in MetaTrader 4 erzeugten Dateiattribute jede Sekunde analysieren und die Verarbeitung starten, wenn sich die Erstellungszeit ändert. Nachdem die Verarbeitung beendet ist, wird die von MetaTrader 4 gelöschte Datei vor dem Start der Datenerfassung neu erstellt. MetaTrader 4 löscht es erfolgreich, lädt neue Daten und wartet auf Antwort. 2. Forming einer Ausgabedatei Es gibt viele Artikel zum Speichern von Daten als Dateien gewidmet, so werde ich nicht arbeiten den Punkt hier. Ich stelle es einfach klar, dass wir Daten in 7 Spalten schreiben: DATE, TIME, HI, LOW, CLOSE, OPEN, VOLUME. Das Trennzeichen ist. Die Barpriorität ist von frühere zu spätere, d. h. die Zeile, die die Null-Balkeneigenschaften enthält, muss die letzte aufgezeichnet werden. Die Datei wird mit einer Zeile mit Spaltennamen versehen. Der Dateiname besteht aus dem Symbolnamen und dem Zeitrahmen. Wir brauchen nicht alle diese Daten, natürlich, aber es ist immer besser, eine sinnvolle Datei als nur eine Reihe von Spalten mit unbekannten Zahlen haben. 3. Erstellung der grafischen Benutzeroberfläche (GUI) Damit ist die Datei fertig. Beginnen wir mit Matlab. Wir sollten eine Anwendung entwickeln, die Textdaten aus Datei lesen, verarbeiten und die Ergebnisse in eine andere Datei aufnehmen. Wir müssen eine GUI erstellen, um den Dateinamen anzugeben, Diagramme anzuzeigen und die Verarbeitung zu starten. Lassen Sie uns jetzt beginnen. Um die GUI zu erstellen, starten Sie den GUIDE Quick Start, indem Sie in der Konsole den Guide eingeben oder das Matlab-Hauptfenster drücken. Im erscheinenden Dialogfenster wählen Sie Create New GUI --gt Leere GUI (Default). Nun können wir sehen, die Schnittstelle für die Erstellung einer GUI mit einem leeren Formular. In dieser Form werden wir die folgenden Objekte platzieren: Edit Text, Push Button, Static Text, Axes, Push Button. Als Ergebnis muss es irgendwie so aussehen: Jetzt sollten wir den visuellen Eigenschaften-Builder für jedes Objekt aufrufen und die Eigenschaften wie folgt festlegen: Statischer Text. HorizontalAlignment left, Tag textInfo, Zeichenfolge - Info. Text bearbeiten: HorizontalAlignment left, Tag editPath, String Path select. Push Button: Tag pushBrowse, String Durchsuchen. Achsen: Box auf, FontName MS Sans Serif, FontSize 8, Tag - axesChart. Schaltfläche: Tag pushSrart, String Start. Durch Ändern der Tag-Eigenschaft wählen wir für jedes Objekt einen eindeutigen Namen. Durch das Ändern anderer ändern wir das Aussehen. Wenn alles fertig ist, starten wir das Interface mit Run, bestätigen das Speichern und Speichern der M-Datei, geben einen Namen (zB FromTo) und drücken Save. Danach wird GUI gestartet und erscheinen, wie es während seiner Arbeit erscheint. Matlab erzeugt die M-Datei als Grundlage für unser zukünftiges Programm und öffnet es im eingebetteten Editor. Wenn das Aussehen nicht passt Sie aus irgendeinem Grund, schließen Sie die Arbeits-GUI und korrigieren Sie Objekt-Anordnung mit dem Editor. Mein Distributor, zum Beispiel, zeigte nicht MS Sans Serif korrekt. Also musste ich es für Sans Serif ändern. 4. Aufbau der Benutzeroberfläche Das Interface-Verhalten kann im M-File Editor mit der Matlab-Sprache programmiert werden. Das von Matlab erzeugte Skelett-Programm stellt eine Liste von Funktionen dar, die vom Benutzer bei der Arbeit mit den Schnittstellenobjekten aufgerufen werden sollen. Die Funktionen sind leer, so dass GUI noch nichts macht. Es ist unsere Aufgabe, Funktionen mit den notwendigen Inhalten zu füllen. 4.1 Programmierung der Browse-Schaltfläche Zunächst benötigen wir Zugriff auf eine von MetaTrader 4 erzeugte Datei, so dass wir mit der Funktion, die durch Drücken von Browse aufgerufen wird, gestartet werden. Der Name der Funktion, die durch Drücken der Taste aufgerufen wird, besteht aus dem Button-Namen (gesetzt durch die Eigenschaft Tag) und dem Postfix Callback. Lassen Sie uns die Funktion pushBrowseCallback im Dateitext finden oder drücken Sie einfach Show Functions in der Symbolleiste und wählen Sie pushBrowseCallback in der Liste aus. Die Syntax der Matlab-Programmiersprache unterscheidet sich von herkömmlichen Codierungsregeln in den C - und C-ähnlichen Sprachen. Insbesondere besteht keine Notwendigkeit, den Funktionskörper mit Klammern zu markieren oder die Art der Daten, die in die Funktion übergeben werden sollen, zu markieren, die Array - (Vektor-) Indizes beginnen mit einem und das Kommentarzeichen ist. So ist der gesamte grüne Text oben kein Programm, sondern ein Kommentar der Matlab-Entwickler, damit wir den Fall erfassen können. Wir müssen einen Dialog für die Eingabe des vollständigen Namens der Datei erstellen. Dazu verwenden wir die Funktion uigetfile: handles hier ist eine Struktur, die Deskriptoren aller Objekte in unserer GUI speichert, einschließlich der Form, in der wir sie platziert haben. Die Struktur wird von einer Funktion zu einer anderen übertragen und ermöglicht den Zugriff auf die Objekte. HObject ist ein Deskriptor des Objekts, das die Funktion aufgerufen hat. Set setzt den Objektwert für einen bestimmten Wert fest und hat die folgende Syntax: set (objectdescriptor, objectpropertyname, propertyvalue). Den Wert der Objekteigenschaften finden Sie über die folgende Funktion: propertyvalue get (objectdescriptor, objectdescriptorname). Aber vergessen Sie nicht, dass der Name ein Wert des String-Typs ist, also muss es in einfachen Anführungszeichen stehen. Das Letzte, was wir über Objekte und ihre Eigenschaften wissen müssen. Die Form, in der wir die GUI-Elemente platziert haben, ist selbst ein Objekt, das im Wurzelobjekt platziert ist (es ist sein Abkömmling). Es hat auch eine Reihe von Eigenschaften, die geändert werden können. Eigenschaften können mit dem Tool namens Objekt-Editor aufgerufen werden, der über die Hauptsymbolleiste des Interface-Editors aufgerufen werden kann. Objektwurzel, wie der Begriff vorschlägt, ist die Wurzel der graphischen Objekte Hierarchie und hat keine Abstammung. Jetzt wollen wir überprüfen, was wir als Ergebnis haben. Wir starten nun unsere GUI, indem Sie auf der Hauptsymbolleiste des M-Datei-Editors auf Ausführen klicken. Klicken Sie auf Durchsuchen, und wählen Sie unsere Datei aus. Ist es auf Schließen Sie die Arbeits-GUI und gehen Sie auf. 4.2 Programmierung der Start-Schaltfläche, Chart-Zeichnung Nun weisen wir die Schaltfläche Start mit dem Aufruf der Funktion auf, die Daten aus der Datei lesen und in einem Diagramm anzeigen möchte. Zuerst wollen wir die Funktion selbst erstellen. Wir benötigen die Struktur von Handles-Objekt-Deskriptoren als Eingaben. Mit einem Zugriff auf Objekte, werden wir in der Lage, sie zu lesen und ihre Eigenschaften zu setzen. Dlmread liest Daten aus der Textdatei mit Trennzeichen und hat folgende Syntax: dlmread (fullfilename, separator, skipstrings, skipcolumns) Länge (qqq) die größere Größe der Matrix qqq jetzt aktuelle Zeit und Datum datestr (jetzt) ​​verwandelt Zeit und Datum in eine Text Sie müssen auch wissen, dass Matlab umfangreiche Hilfeinformationen mit Theorie und Beispielen bietet. Lassen Sie uns unsere Funktion am Ende des Programms (es wird es leichter, es dort zu finden) und fügen Sie seinen Aufruf in pushStartCallback: Starten Sie es mit Run, wählen Sie eine Datei, drücken Sie Start, und genießen Sie das Ergebnis. 4.3 Speichern des Pfads zu einer Datei Alles ist jetzt in Ordnung, aber es ist ein bisschen ärgerlich, permanent mit der Maus eine Datei auszuwählen, nachdem Sie auf Durchsuchen gedrückt haben. Versuchen wir, den gewählten Pfad zu speichern. Wir werden mit dem Lesen beginnen. Der Name einer Datei, die den Pfad speichert, besteht aus dem GUI-Namen und dem Postfix-Saveparam und hat die Erweiterung. mat. Die Funktion FromToOpeningFcn wird direkt nach der Erstellung des GUI-Formulars ausgeführt. Wir werden den Versuch hinzufügen, den Pfad aus der Datei zu lesen. Wenn der Versuch fehlschlägt, wird der Standardwert verwendet. Andere Zeichenfolgen der Funktion FromToOpeningFcn bleiben unverändert. Lassen Sie uns die Funktion pushBrowseCallback wie folgt modifizieren: 4.4 Datenverarbeitung Als Beispiel wollen wir die Spalte OPEN mit einer Polynomfunktion vierten Grades interpolieren. Fügen wir den folgenden Code am Ende unserer Funktion, Prozess: Lets versuchen, starten und drücken Sie Start. Wenn Sie ungefähr das gleiche Ergebnis wie oben gezeigt haben, ist es höchste Zeit, die Daten als Datei zu speichern. 4.5 Speichern von Daten als Datei Speichern von Daten ist nicht komplizierter als sie zu lesen. Die einzige Nettigkeit ist, daß das Vektorfresult heruntergezählt werden muß, d. h. vom letzten zum ersten. Dies wird durchgeführt, um das Lesen der Datei in MetaTrader 4 zu vereinfachen, ausgehend von der Nullleiste und bis die Datei endet. Ergänzen wir den Funktionsprozeß durch den folgenden Code: Stellen Sie nun sicher, dass die Datei, die das Ergebnis enthält, an der gleichen Stelle erstellt wurde, an der die ursprüngliche Datei vorhanden ist, und denselben Namen hat, der durch das Postfix-Ergebnis ergänzt wird. 4.6 Timer Control Dies ist der schwierigste Teil der Arbeit. Wir müssen einen Timer erstellen, der die MetaTrader 4-geformte Dateierzeugungszeit jede Sekunde überprüfen würde. Wenn sich die Zeit ändert, muss der Funktionsprozess gestartet werden. Der Stopp-Timer wird mit Start gestartet. Wenn die GUI geöffnet wird, löschen wir alle zuvor erstellten Timer. Lassen Sie uns einen Timer erstellen, indem Sie den folgenden Code in der Funktion FromToOpeningFcn setzen: Der obige Code muss sofort nach unserer vorherigen Einfügung in diese Funktion eingefügt werden, d. H. Vor den Strings handles. output hObject und guidata (hObject, handles). Durch die Ausführung dieses Codes überprüft Matlab unmittelbar nach der Erstellung der GUI nach Verfügbarkeit der Timer, löscht die vorhandenen und erstellt einen neuen Timer. Der Timer ruft die Funktion checktime jede Sekunde auf und übergibt die Liste der Deskriptoren Handles hinein. Abgesehen von Handles wird der Timer seinen eigenen Deskriptor an die Funktion übergeben, sowie die Struktur, die Gesprächszeit und Grund enthält. Wir können das nicht beeinflussen, aber wir müssen dies berücksichtigen, wenn wir die vom Timer aufzurufende Funktion codieren. Sie können die Funktion selbst finden, wo Sie es wünschen. Lassen Sie es selbst schreiben in der Matlab-Statusleiste die Zeit, als es aufgerufen wurde: Bei der Erstellung wird der Timer gestoppt, jetzt sollten wir es starten. Lassen Sie uns die Funktion pushStartCallback finden. Lassen Sie uns kommentieren Calling-Prozess (Handles) platziert und schreiben Timer-Management in sie: Jetzt wollen wir überprüfen, wie alles funktioniert. Versuchen wir, den Timer mit Start zu aktivieren und zu deaktivieren. Wenn der Timer aktiviert ist, muss die Uhr über dem Pfadeingabefeld funktionieren. Es wäre besser, den Timer mit der X-Taste beim Schließen der GUI zu löschen. Wenn Sie dies tun möchten, fügen Sie am Anfang der Funktion figure1CloseRequestFcn hinzu. Diese Funktion wird beim Schließen der GUI aufgerufen. Sie können auf sie von GUI-Editor zugreifen: Aber, berücksichtigen Sie bitte, dass jetzt, wenn Sie Run des Editors drücken, ohne die operative GUI geschlossen, wird der alte Timer nicht gelöscht, während die neue erstellt werden. Und beim nächsten Mal gibt es noch eine weitere, etc. Sie können mit ungelösten Timer mit Befehl löschen (timerfind) aus der Matlab-Konsole befassen. Wenn alles gut funktioniert, erstellen wir eine Funktion, um die Uhrzeit der letzten Dateiänderung von MetaTrader 4 zu überprüfen: Function dir (fullfilename) gibt eine Struktur zurück, die die Dateiinformationen (name, date, bytes, isdir) enthält. Die Informationen über die vorherige Dateierzeugungszeit werden in der Userdata-Eigenschaft des Timer-Objekts gespeichert. Sein Deskriptor wird an die Funktion checktime mit dem Namen obj übergeben. Wenn Sie eine von MetaTrader 4 erstellte Datei ändern, überschreibt das Programm das Ergebnis. Sie können dies überprüfen, indem Sie die Datei manuell ändern (z. B. Löschen der neuesten Zeichenfolgen) und die Änderungen in dem resultierenden Diagramm oder der Datei verfolgen. Natürlich muss dazu die Start-Taste gedrückt werden. Wenn während des Programmvorgangs ein zusätzliches Fenster mit der Diagrammkopie erstellt wird, fügen Sie am Anfang des Funktionsprozesses den folgenden String hinzu: 5. Zeichnen der Ergebnisse in MetaTrader 4 Jetzt wollen wir zu MetaTrader 4 zurückkehren Funktion, die das Ergebnis aus Datei lesen und zeichnen sie in ein Diagramm. Das Verhalten des Programms wird wie folgt beschrieben: 1. Wenn ein neuer Balken empfangen wird: Löschen der alten Ergebnisdatei, Löschen des Diagramms, Speichern der Datendatei. 2. Wenn die Ergebnisdatei lesbar ist: Lesen Sie die Datei, Zeichnen Sie ein Diagramm, löschen Sie die Ergebnisdatei. Ich werde hier nicht beschreiben, wie der Code unten funktioniert, da das Lesen von Daten aus Datei und Zeichnung Indikatoren finden Sie in anderen Artikeln. Ich bemerke nur, dass die Ergebnisdatei hier gelöscht wird, sofort nachdem sie in das Diagramm eingefügt wurde. So sorgen Sie sich nicht, wenn Sie mehrfache gelesene Fehlermeldungen sehen. Lesefehler treten in zwei Fällen auf: 1. Unmittelbar nachdem eine neue Bar Einnahmen hat, da die Ergebnisdatei noch nicht angelegt wurde. 2. Unmittelbar nachdem das Ergebnis gelesen und die Tabelle gezeichnet wurde, da die Datei gelöscht wurde, um die gleichen Daten nicht erneut zu lesen. Somit behält das Programm seinen Lesefehlerstatus praktisch die ganze Zeit. ) Unten ist mein Endergebnis. Ich hoffe, ich habe keine Fehler gemacht und du wirst es reproduzieren können. Fazit In diesem Artikel haben wir die Art und Weise der Organisation einer Interaktion zwischen MetaTrader 4 und Matlab über CSV-Dateien beschrieben. Diese Methode ist weder einzigartig noch optimal. Der Wert dieses Ansatzes ist, dass es hilft, Daten Arrays ohne besondere Fähigkeiten des Betriebs mit jedem Programmierwerkzeug außer MetaTrader 4 und Matlab. MetaTrader 5 auszutauschen - Beispiele MetaTrader 5 und MATLAB Interaktion Einführung Mein erster Artikel Interaktion zwischen MetaTrader 4 und MATLAB Engine (Virtual MATLAB Machine) wurde von MQL-Community bemerkt. Einige Leser (1Q2W3E4R5T) konnten sogar dieses Projekt von Borland nach VS2008 verschieben. Aber die Zeit läuft unaufhaltsam und (traurig, aber wahr) MetaTrader 4 ist verschwinden und weicht seinem Nachfolger MetaTrader 5 mit MQL5, die Zeiger und dynamisches Gedächtnis eingeführt. Dank dieser Innovationen haben wir die Möglichkeit, eine universelle Interaktionsbibliothek mit der virtuellen Maschine MATLAB Engine zu erstellen und die von MATLAB erzeugten Bibliotheken direkt mit MetaTrader 5 zu verknüpfen. Dieser Artikel behandelt eine solche Funktionalität. Dieser Artikel fährt fort, die vorherige und gründlich deckt das Problem der Interaktion zwischen MetaTrader 5 und MATLAB. Um den Umfang dieses Artikels verständlicher für unvorbereitete Leser zu machen, teilen wir ihn in drei Teile: Theorie, Referenz und Praxis. Die Theorie deckt die Arten von Daten, die in MQL5 und MATLAB verwendet werden, sowie ihre gegenseitige Umwandlung. In der Referenz lernen Sie die linguistischen Strukturen und die Syntax von Funktionen, die für die Erstellung einer DLL benötigt werden. Und in der Praxis werden wir Fallstricke dieser Interaktion analysieren. Erfahrene Leser können Theorie und Literatur überspringen und mit Praxis beginnen. Andere werden aufgefordert, Theorie und Referenz zu lesen, und nur dann weiter zu üben. Auch sein Wert, zum der Bücher zu lesen, die im Literaturabschnitt erwähnt werden. 1.1 Datentypen in MATLAB und MQL5 1.1.1 Einfache Datentypen Zuerst müssen wir die inneren Welten von MQL5 und MATLAB kennenlernen. Es gibt einen großen Unterschied: Die Variablen in MQL5 können einfach oder zusammengesetzt (komplex) sein, und in MATLAB sind alle Variablen multidimensional. Tabelle 1 Datenarten in MATLAB und MQL5 (Komplex) - dh Matrix. Sie müssen immer daran denken, über diesen Unterschied 1.1.2 Komplexe Datentypen In MQL5 gibt es 4 komplexe Arten von Daten: Arrays, Strings, Strukturen und Klassen. Der komplexe Datentyp besteht aus mehreren einfachen Datentypen, die zu einem bestimmten Speicherblock zusammengefasst sind. Beim Umgang mit solchen Daten müssen Sie immer entweder die Größe des Speicherblocks in Bytes oder die Anzahl der Elemente (außer Klassen) kennen. Wir interessieren uns nur für Arrays und Strings, denn das Einreichen von Klassen und MQL5-Strukturen an MATLAB macht keinen Sinn. Beim Übergeben von Arrays beliebigen Typs müssen Sie wissen: Typ (Dimension) und Anzahl der Elemente mit der ArraySize () - Funktion. Besonderes Augenmerk sollte auf die Indexierung in MetaTrader 5 gegeben werden - meistens ist es rückwärts (d. H. Das erste Element enthält neuere Daten als das nächste). Prüfen Sie dies mit der ArrayIsSeries () - Funktion. Und MATLAB hat die folgende Indexierung: das erste Element enthält die älteren Daten als das nächste - also müssen Sie Ihre Arrays rückgängig machen, bevor Sie sie an MATLAB senden, wenn flag ASSERIES TRUE. Auf der Grundlage der oben genannten, können mit den folgenden übereinstimmen: Reverse-Arrays unsichtbar auf MQL5-Programme, mit Ausnahme von Arrays der char-Typ und 2-dimensionale Arrays - lassen sie unverändert. Reverse unsichtbar alle Arrays von MATLAB, und weisen Sie die ASSERIES-Flag mit TRUE, mit Ausnahme von Arrays der char-Typ und 2-dimensionale Arrays - lassen Sie sie unverändert. In jedem Array im MQL5-Programm, das nach Rückwärts-Indexierung erstellt wurde, muss das ASSERIES-Flag TRUE sein, mit Ausnahme von Arrays des char-Typs und zweidimensionaler Arrays - lassen sie unverändert. Dies ist jedoch nicht die einzige Einschränkung bei der Arbeit mit Arrays. Wenn Sie mit mehrdimensionalen Arrays oder Matrizen korrekter arbeiten, insbesondere von MATLAB, führen wir die Einschränkung für nicht mehr als 2-dimensionale Arrays ein. Hier kann das Flag ASSERIES nicht TRUE sein und daher werden diese Arrays nicht rückgängig gemacht. Vergessen Sie nicht, dass Strings in MQL5 keine Arrays der char-Typ-Elemente sind. Also, wenn übergeben Strings kommt ein kleines Problem: in MQL5-Zeichenfolgen codiert mit Unicode, und MATLAB verwendet ANSI-Codierung. Bevor Sie einen String übergeben, sollte er daher mit der Funktion StringToCharArray () in ein Array von ANSI-Zeichen umgewandelt werden. Und umgekehrt, wenn Sie ein Zeichen-Array aus MATLAB erhalten, konvertieren Sie es mit der Funktion CharArrayToString () (siehe Tabelle 2). Um Verwechslungen zu vermeiden, stimmen Sie zu: Speichern Sie alle Zeichenfolgen in MQL5-Programmen mit Unicode, keine Arrays des char-Typs. 1.2 Vergleich von MQL5- und MATLAB-Datentypen Um die Anzahl der Funktionen zu reduzieren und den Bibliotheksalgorithmus zu vereinfachen, reduzieren wir die Anzahl der Typen durch automatische Konvertierung, die die Integrität der Daten nicht beeinträchtigen soll. Die folgende Tabelle veranschaulicht die Regel der Datentypkonvertierung von MQL5 in MATLAB: Bei dieser Art der Umsetzung gibt es einen Verlust an Genauigkeit. Wir verwenden es nicht, aber Sie können diese Umwandlung in Ihren Programmen verwenden. Tabelle 2. Vergleich von MQL5- und MATLAB-Datentypen Nun kennen Sie Datentypen, die in MQL5 und MATLAB verwendet werden. Sie wissen, welche Fallstricke in Datenübertragung erwarten und wie sie kompetent umgehen. Sie müssen die MATLAB Engine-API noch kennen und sich mit MATLAB Compiler 4 vertraut machen. 2. MATLAB-Engine-API-Referenz, MATLAB-Compiler 4 Referenz und C InputOutput-Bibliotheksreferenz In diesem Abschnitt werden die wichtigsten Funktionen der MATLAB Engine-API, die Funktionen des MATLAB-Compilers, erläutert 4 und Anzahl der nützlichen Funktionen der C-Standard-Eingabebibliothek. Also, fangen wir an. 2.1 MATLAB Engine API - und MCR-Funktionen MATLAB Engine - ist eine externe Schnittstelle, die es anderen Programmen ermöglicht, den MATLAB-Desktop zu verwenden. Es bietet eine voll funktionsfähige Arbeit aller MATLAB-Pakete ohne Einschränkungen. Obwohl es nicht in der Dokumentation, sondern in Bezug auf System-Programmierer gesagt wird - es ist nur eine virtuelle Maschine, wie PHP, MySQL, etc., die eine einfache und relativ schnelle Möglichkeit zum Datenaustausch zwischen MetaTrader 45 und MATLAB unterstützt. Diese Methode, externe Programme mit dem MATLAB-Paket zu verbinden, wird von Entwicklern empfohlen. Die Schnittstelle besteht aus sechs Funktionen: Engine pEng engOpen (NULL) Diese Funktion ruft den MATLAB-Desktop auf, der Parameter ist immer NULL, gibt einen Zeiger auf den Desktop-Deskriptor zurück. Int exitCode engClose (Engine pEng) Diese Funktion schließt den Desktop und gibt die Anzahl der verbleibenden Benutzer des MATLAB-Desktops zurück. Dabei gilt: Engine pEng Zeiger auf den Desktop-Deskriptor. MxArray mxVector mxCreateDoubleMatrix (int m, int n, int ComplexFlag) Diese Funktion erzeugt eine Variable (Matrix) des MATLAB-Desktops, liefert einen Zeiger auf Variable (Matrix), wobei: mxArray mxVector Zeiger auf Matrixvariable. Int m Anzahl der Zeilen. Int n Anzahl der Spalten. ComplexFlag-Typ der komplexen Zahl, für MetaTrader 45 mxREAL. Void mxDestroyArray (mxArray mxVector) Diese Funktion zerstört MATLAB-Matrix, es wird benötigt, um Speicher zu löschen, wobei: mxArray mxVector Zeiger auf Matrix-Variable. Int engPutVariable (Engine pEng, char Name, mxArray mxVector) Diese Funktion sendet Variable auf den Desktop. Sie müssen nicht nur Variablen des Typs mxArray erstellen, sondern sie auch an MATLAB senden, wobei: Engine pEng Zeiger auf den Desktop-Deskriptor steht. Char Name der Variablenname des Char-Typs im MATLAB-Desktop. MxArray mxVector Zeiger auf Matrixvariable. MxArray mxVector engGetVariable (Engine pEng, char Name) Diese Funktion wird vom Desktop aus - die Inverse der vorherigen Funktion. Nur Variablen des Typs mxArray werden akzeptiert, wobei: mxArray mxVector Zeiger auf Matrixvariable. Engine pEng Zeiger auf den Desktop-Deskriptor. Char Name der Variablenname des Char-Typs im MATLAB-Desktop. Double p mxGetPr (mxArray mxVector) Diese Funktion erhält Zeiger auf Array von Werten, sie wird verwendet, um Daten zusammen mit memcpy () zu kopieren (siehe 2.3 C Standard InputOutput Library), wobei: double p Zeiger auf Array vom doppelten Typ. MxArray mxVector Zeiger auf Matrixvariable. Int engEvalString (Engine pEng, char Command) Diese Funktion sendet Befehle an den MATLAB Desktop, wobei: Engine pEng Zeiger auf den Desktop Descriptor. Char Befehlsbefehl für MATLAB, Zeichenfolge des char-Typs. Sie haben wahrscheinlich bemerkt, dass die MATLAB Engine API Ihnen erlaubt, mxArray-Struktur nur für den doppelten Typ zu erstellen. Aber diese Einschränkung wirkt sich nicht auf Ihre Möglichkeiten aus, sondern beeinflusst den Algorithmus Ihrer Bibliothek. MCR (MCR-Instanz) ist die spezielle Bibliothek des MATLAB-Pakets, die es ermöglicht, eigenständige, von MATLAB-Umgebungen auf einem beliebigen Computer erstellte Bibliotheken auszuführen. Beachten Sie, dass auch wenn Sie ein komplettes MATLAB-Paket haben, müssen Sie die MCR-Bibliothek mithilfe der MCRInstaller. exe-Datei installieren, die sich im Ordner ltMATLABgtToolboxcompilerdeploywin32 befindet. Vor dem Aufrufen einer beliebigen Bibliothek, die von der MATLAB-Umgebung erstellt wurde, müssen Sie die MCR-Initialisierungsfunktion aufrufen: bool mclInitializeApplication (const char option, int count) gibt TRUE zurück, wenn der MCR-Start erfolgreich war, andernfalls FALSE, wobei: const char option string von Optionen, wie in mcc - R ist in der Regel NULL int count Größe Optionen String, in der Regel 0. Am Ende der öffentlichen Bibliothek Arbeit müssen Sie aufrufen: bool mclTerminateApplication (void) gibt TRUE, wenn MCR erfolgreich abgeschlossen wurde. 2.2 MATLAB-Compiler 4 Mit dem MATLAB-Compiler können Sie aus M-Funktionen Folgendes erstellen: Standalone-Anwendungen, die auch dann ausgeführt werden, wenn MATLAB nicht installiert ist. CC-Share-Bibliotheken, die ohne MATLAB auf Endbenutzersystemen verwendet werden können. Compiler unterstützt die meisten Befehle und Pakete von MATLAB, aber nicht alle. Eine vollständige Liste der Einschränkungen finden Sie auf der MATLAB-Website. Diese Methode ermöglicht es Ihnen, ein softwareunabhängiges Bündel von MetaTrader 5 und MATLAB zu erstellen, erfordert aber im Gegensatz zur MATLAB Engine einen gut ausgebildeten Programmierer und fundierte Kenntnisse der Zusammenstellung. MATLAB-Compiler erfordert mindestens einen der folgenden CC-Compiler: Lcc C (meist mit MATLAB). Sein einziger C-Compiler. Borland C Versionen 5.3, 5.4, 5.5, 5.6. Microsoft Visual CC-Versionen 6.0, 7.0, 7.1. Der MATLAB Compiler 4 erzeugt im Gegensatz zu seinen Vorgängern nur den Schnittstellencode (Wrapper), dh er übersetzt keine m-Funktionen in Binär - oder CC-Code, sondern erzeugt eine spezielle Datei auf Basis der CTF-Technologie (Component Technology File) Integrationen verschiedener Pakete, die zur Unterstützung von m-Funktionen erforderlich sind. MATLAB-Compiler verschlüsselt diese Datei auch mit einem einmaligen (nicht wiederholten) 1024-Bit-Schlüssel. Nun können wir den Algorithmus von MATLAB Compiler 4 berücksichtigen, da Ignoranz dieses Themas bei der Kompilierung zu vielen dummen Fehlern führt: Abhängigkeiten analysieren in diesem Stadium alle Funktionen, MEX-Dateien und P-Dateien, die m-Funktionen kompiliert haben . Archiv erstellen - CTF-Datei wird erstellt, verschlüsselt und komprimiert. Beim Generieren des Objektcodes des Wrappers werden zu diesem Zeitpunkt alle Quellcodes erzeugt, die für die Komponente benötigt werden: CC-Schnittstellencode für m-Funktionen, die in der Befehlszeile (NameFilemain. c) angegeben sind. Component-Datei (NameFilecomponent. dat), die alle notwendigen Informationen enthält, um m-Code auszuführen (einschließlich Verschlüsselungsschlüssel und Pfade, gespeichert in CTF-Datei). CC-Übersetzung. In diesem Stadium werden CC-Quellcodedateien in Objektdateien kompiliert. Verknüpfung. Die letzte Phase des Projekts. Wenn Sie mit dem Verhalten von MATLAB-Compiler-Algorithmen vertraut sind, müssen Sie bei der Verwendung von Compiler (mcc) mehr über Schlüssel lernen, um einen detaillierten Aktionsplan zu haben: Tabelle 4. Matlab mbuild Linker - (Version 4) - Tasten Tabelle 4-Listen Die wichtigsten Tasten. Für weitere Informationen verwenden Sie die Hilfe mbuild oder doc mbuild Befehle. 2.3 C Standard InputOutput Library Die Standard InputOutput Library bietet die korrekte Datenkopierung. Seine Verwendung erspart Ihnen dumme Fehler, die während der Programmentwurfsphase auftreten (zum Beispiel: viele Anfängerprogrammierer kopieren nur den Zeiger auf den Speicherblock, anstatt den gesamten Speicherblock zu kopieren). Von der gesamten InputOutput Library sind wir nur in einer Funktion interessiert: void pIn memcpy (void pIn, void pOut, int nSizeByte) Diese Funktion kopiert (clones) variablearray von pOut in pIn mit der Größe von nSizeByte Bytes, wobei: void pIn Zeiger auf array, Wo zu kopieren. Void pOut Zeiger auf Array, von dem aus kopiert wird. Int nSizeByte die Größe der kopierten Daten sollte die Größe des pIn-Arrays nicht überschreiten, da sonst Speicherzugriffsfehler auftreten. 3. Praxis Jetzt sind wir mit der Theorie fertig und wir können mit der Realisierung der MetaTrader 5 Ampere MATLAB-Interaktion fortfahren. Wie Sie wahrscheinlich vermutet haben, wird dies auf zwei Arten geschehen: Verwenden der virtuellen MATLAB Engine und der Verwendung von Bibliotheken, die vom MATLAB Compiler generiert werden. Betrachten Sie zunächst eine einfache, schnelle und vielseitige Art der Interaktion über MATLAB Engine. Dieser Teil des Artikels muss von Anfang bis Ende gelesen werden, da sie trotz des scheinbaren Unterschieds zwischen den Methoden der Interaktion eine Philosophie und eine vertraute Syntax von Sprachkonstrukten haben und mit einfachen Beispielen leichter zu lernen ist. 3.1 Entwickeln der Universalbibliothek von MetaTrader 5 amp MATLAB-Engine-Interaktion Diese Methode der Interaktion kann nicht elegant und schnell genannt werden, ist aber zuverlässig und deckt das gesamte MATLAB-Paket ab. Natürlich sollten wir die Geschwindigkeit der endgültigen Modellentwicklung erwähnen. Das Wesen der Entwicklung ist es, einen universellen Bibliotheks-Wrapper für MetaTrader 45 amp MATLAB Engine Interaktion zu schreiben. Nach diesem MetaTrader 45 scriptindicatorexpert verwalten kann MATLAB virtuellen Desktop. Und der gesamte mathematische Algorithmus kann im MQL-Programm als Strings gespeichert werden, so dass Sie es verwenden können, um Ihr geistiges Eigentum zu schützen (weitere Details finden Sie im Artikel Schützen, Entwickler). Es kann auch in m-Funktionen oder P-Funktionen separate Dateien im Ordner ltMetaTrader 5gtMQL5Libraries gespeichert werden. Mögliche Einsatzgebiete einer solchen Interaktion: Um mathematische modelideas zu testen oder zu demonstrieren, ohne komplexe Programme schreiben zu müssen (Schutz des geistigen Eigentums kann wie im MQL-Programm und mittels MATLAB-Paket unter Verwendung von P-Funktionen organisiert werden). Um komplexe mathematische Modelle mit allen Merkmalen von MATLAB zu schreiben. Um alle diejenigen, die nicht zu vertreiben ihre scriptsindicatorsexperts. Lass uns weiter. Ich hoffe, dass Sie die 1.1 Datentypen in MATLAB und MQL5 gelesen haben. 1.2 Vergleich der MQL5- und MATLAB-Datentypen. 2.1 MATLAB Engine API und MCR Funktionen und 2.3 C Standard InputOutput Bibliothek Abschnitte, da wir nicht pausieren und analysieren sie nicht mehr. Lesen Sie das folgende Blockschema sorgfältig durch, das den Algorithmus der zukünftigen Bibliothek illustriert: Abbildung 1. Blockschema des Bibliotheksalgorithmus Wie in Abbildung 1 zu sehen, besteht die Bibliothek aus drei Hauptblöcken. Betrachten Sie ihre Zwecke: MQL5-Block, Vorbereitung von sentreceived Daten: Reverse-Arrays. Typenkonvertierung. Strings codiert die Konvertierung. CC-Block: Konvertiert Array in die Struktur mxArray. Übergibt MATLAB Engine-Befehle. MATLAB Motorblockberechnungen. Nun, beschäftigen wir uns mit Algorithmen. Nun beginnen mit MQL5-Block. Aufmerksamen Leser hat bereits festgestellt, dass es auf die Umsetzung, was in den Datentypen in MATLAB und MQL5 Abschnitt geschrieben wurde konzentrieren. Wenn Sie es verpasst, youll kaum verstehen, warum all dies notwendig ist. Der Algorithmus der Funktionen mlInput ltvariabletypegt ist nahezu identisch. Lets diskutieren seine Arbeit mit der mlInputDouble () - Funktion, die Eingabe von Variablen des doppelten Typs auf MATLAB virtuelle Maschine zur Verfügung stellt. Bool mlInputDouble (double amparray, int sizeArray, Zeichenfolge NameArray). Dabei gilt: Arrayverweis auf Variable oder Array des doppelten Typs. SizeArray-Arraygröße (Anzahl der Elemente, nicht Byte). NameArray-Zeichenfolge, die einen eindeutigen Variablennamen für die virtuelle MATLAB-Maschine enthält (der Name muss den MATLAB-Anforderungen entsprechen). Konvertieren Sie NameArray-Zeichenfolge zu char-Array mit der Funktion StringToCharArray (). Überprüfen Sie die Art der Indexierung mithilfe der ArrayIsSeries () - Funktion. Wenn die Art der Indexierung normaler Wert für die Funktion mlxInputDouble () ist. ELSE-Indizierung von timeseries array: Reverse-Array und übergeben Wert an die Funktion mlxInputDouble (). End-Funktion übergeben Sie den zurückgegebenen Wert an die Funktion mlxInputDouble (). Der Algorithmus der Funktionen mlGet ltvariabletypegt ist ebenfalls nahezu identisch. Lets diskutieren ihre Arbeit mit der mlGetDouble () - Funktion, die Variable der doppelten Typ aus MATLAB virtuelle Maschine zurückgibt. Int mlGetDouble (double amparray, int sizeArray, string NameArray). Dabei gilt: Arrayverweis auf Variable oder Array des doppelten Typs. SizeArray-Arraygröße (Anzahl der Elemente, nicht Byte). NameArray string, containing unique variable name for MATLAB virtual machine. Convert NameArray string to char array using the StringToCharArray() function. Find the size of array using the mlxGetSizeOfName() function. IF size is MORE THAN ZERO . allocate the recipient array of needed size using the ArrayResize() function, get data of mlxGetDouble() . return array size. IF size is ZERO . return error, i. e. null value. Thats it The mlGetInt() and mlGetLogical() functions produce shadow conversion of types double - gt intbool . For this purpose these functions create a temporary memory buffer in their bodies. This is a forced measure, because unfortunately MATLAB API does not allow to create mxArray structures for data types other than double . However, this does not mean that MATLAB operates exclusively the double types. CC block is far easier - it should provide data translation from the double type into the mxArray structure. It is done using the mxCreateDoubleMatrix() . mxGetPr() and memcpy() functions. Then, using the engPutVariable() function it passes data to MATLAB virtual machine, and to extract data it uses the engGetVariable() function. Again, pay attention to functions with prefixes Int and Logical as seen in the block-scheme, they dont directly interact with MATLAB, but use the mlxInputDoublemlxGetDouble and mlxInputChar() functions. Algorithm of their behavior is simple: call of the mlxInputDoublemlxGetDouble function inputoutput values as double() and send the shadow MATLAB command to convert data type via the mlxInputChar() function. MATLAB Engine block is even easier. It provides only mathematical functions. Its behavior depends on your commands and your mp-functions. Now, when all the details of the project are clear, its time to deal with project building. Any such build begins with the creation of main library in our case it is CC block. For this purpose, in any ANSI-text editor (Notepad, Bred, etc.) create a file with the DEF extension. It is desirable that the name of this file consist of Latin characters with no spaces and punctuation, otherwise you will hear many flattering words from your compiler. This file provides the permanence of your functions. If this file is absent, CC compiler will invent his own exotic names to export functions. This file contains: LIBRARY control word, LibMlEngine name of the library, and EXPORTS second control word, then come the names of functions. As you probably knew, the names of export functions cant have spaces and punctuation. Here is the text of the DllUnit. def file from MATLABEngine. zip archive: LIBRARY LibMlEngine EXPORTS mlxClose mlxInputChar mlxInputDouble mlxInputInt mlxInputLogical mlxGetDouble mlxGetInt mlxGetLogical mlxGetSizeOfName mlxOpen So, we have the first file of project. Now open Windows Explorer and go to the ltMATLABgtExterninclude folder. Copy the engine. h file (header file of MATLAB virtual machine) to folder, where you project is built (if you wont do this, you will have to manually specify the path to file at the stage of compilation). Now its time to create CC block. We will not include the entire source code of program in the article, because this file can be found in MATLABEngine. zip as DllUnit. cpp and it is well commented. Note that its better to create functions using stdcall convention i. e. parameters are passed through the stack, and function cleans the stack. This standard is native for Win3264 API. Consider how to declare a function: extern C declspec(dllexport) ltvariabletypegt stdcall Function(lttypegt ltnamegt) extern C declspec(dllexport) tells C compiler that function is external. ltvariabletypegt type of returned variable, may be: void, bool, int, double . composite types (known not only to Dll, but also to calling program) and pointers. stdcall declaration about passing parameters to function and back, its a standard for Win3264 API. Funcion your function name. lttypegt ltnamegt type and name of input variable, maximal number of variables is 64. CC block building: for this you need to include standard inputoutput library and add to project the following files (in your compiler: Project-gtAdd Project): DllUnit. def In ltMATLABgtExternlibltwin3264gtltcompilergt folder, where: ltMATLABgt MATLAB main folder. ltwin3264gt either win32 folder for 32-bit OS, or win64 for 64-bit OS. ltcompilergt the borland folder for Borland CC ver. 5-6, the microsoft folder for Microsoft Visual C: libeng. lib libmx. lib A common question like this may arise: I have different version of compiler or no such a compiler in the list (Very rarely there are no such files) . Lets see how to manually create a public library. We will consider how its done in Visual C and in Borland C: In FAR open ltMATLABgtBinltwin3264gt folder, where: ltMATLABgt MATLAB main folder. ltwin3264gt either win32 folder for 32-bit OS, or win64 for 64-bit OS. For Borland C enter: implib libeng. lib libeng. dll. The same for libmx. dll. For Visual C enter: lib libeng. dll. The same for libmx. dll. If other compiler . any compiler of any programming language must have this utility - Library Manager, usually this is a console program ltcompiler foldergtbinlib. exe. By the way, I forgot to warn you - dont try to make 64-bit LIB for 32-bit compiler. First, find out if there is 64-bit addressing support in compiler help. If not, either looking for 32-bit MATLAB DLL, or choose another CC compiler. Getting down to compilation, after which we get a library, that should be placed in the terminalfolderMQL5Libraries folder. Now lets begin with MQL block. Run MetaEditor, click New and do as on following figures: Figure 2. MQL5 Wizard: Create Library Figure 3. MQL5 Wizard: General Properties of Library Now, when Wizard MQL5 has created a template, proceed to its editing: Note that MQL 5 you can pass pointers in two ways: void NameArray This method of passing from array allows only to read data. However, if you try to use this reference to edit its contents, youll get memory access error (in the best case for you, MetaTrader 5 will quietly handle the error in the SEH-frame, but we HAVENT WRITE a SEH-frame, so we can even miss the reason of error). voidamp NameArray This method of passing allows you to read and edit array contents, but you must retain array size. If function doesnt accept or doesnt pass parameters, always specify the void type. 2. We wont describe all functions of the MQL block, because you can find MatlabEngine. mq5 source code in MATLABEngine. zip. Therefore, well consider the details of declaration and definition of external functions in MQL5: As seen in the example, the declaration and definition of function are combined. In this case, we declare a function named mlInputChar() as external (export ), which returns value of the bool type and accepts the array string as parameter. Now compile. Now that we have completed the last block of the library and compiled it, its time to test it in real conditions. To do this, write a simple test script (or take it from MATLABEngine. zip, file: TestMLEngine. mq5). Script code is simple and well commented: As seen from the script, we are entering values, and then get values. However, in contrast to MetaTrader 4, where we needed to know the size of buffer at design stage, in MetaTrader 5 its not needed, as we use dynamic buffers . Now that youve finally understood MATLAB virtual machine, you can begin using DLL built in MATLAB environment. 3.2 Technical guidelines of buildingusing DLL generated by MATLAB Compiler 4 In the previous section youve learned how to create a library for universal interaction with MATLAB package. However, this method has one drawback - it requires MATLAB package from end user. This restriction creates a number of difficulties in distribution of finished software product. Thats why MATLAB mathematical package has a built-in compiler, that allows you to create standalone applications independent from MATLAB package. Lets take a look at it. For example, consider a simple indicator - moving average (SMA). Slightly upgrade it by adding a Neural Network Filter (GRNN), that allows to smooth white noise (random bursts). Name the new indicator as NeoSMA, and filter as GRNNFilter. Thus we have two m-functions, of which we want to create a DLL, that can be called from MetaTrader 5. Now remember that the MetaTrader 5 searches fro DLLs in following folders: ltterminaldirgtMQL5Libraries ltterminaldirgt Current folder System folder ltwindowsdirgtSYSTEM32 ltwindowsdirgt Directories listed in the system environment variable PATH. Therefore, place into one of these directories two m-functions (NeoSMA. m and GRNNFilter. m), where we will build DLL. I draw your attention to this fact of placement, as this is done not by accident. Attentive reader already knows the MATLAB compiler feature - it preserves the paths when compiling (see 2.2 MATLAB Compiler 4). Before you begin to compile project, you must configure compiler. To do this, follow these steps: In MATLAB command line enter: mbuild - setup Press y to confirm find of CC compatible compilers installed in your system. Choose standard Lcc-win32 C compiler. Press y to confirm selected compiler. Figure 4. Compiling the project Now we are ready to move to the m-functions compilation process. mcc - N - W lib:NeoSMA - T link:lib NeoSMA. m GRNNFilter. m Explain the keys: - N to skip all unnecessary paths - W lib:NeoSMA tells compiler that NeoSMA is the name of library - T link:lib tells compiler to create public library with linking NeoSMA. m and GRNNFilter. m m-functions names Now, lets see what compiler has created: mccExcludedFiles. log log-file containing compilers actions NeoSMA. c C version of library (contains - code of wrapper) NeoSMA. ctf CTF file (see 2.2 MATLAB Compiler 4 ) section NeoSMA. h header file (contains declarations of libraries, functions, constants) NeoSMA. obj object file (source file containing machine and pseudo code) NeoSMA. exports exported functions names NeoSMA. dll Dll for further linking NeoSMA. lib Dll to use in CC projects NeoSMAmcccomponentdata. c C version on component (used for compliance with CTF-file, contains paths, etc.) NeoSMAmcccomponentdata. obj object version of component (source file containing machine and pseudo code) So lets handle with DLL, precisely with its internal structure. It consists of (basic functions only) from: Main function of any DLL - BOOL WINAPI DllMain() . which (according to Microsoft specification) handles events occurring in DLL: DLL loading into address space of process, creating a new stream, deleting the stream and unload Dll from memory. Service functions of DLL initializationdeinitialization . BOOL ltNameLibgtInitialize(void)void ltNameLibgtTerminate(void) are needed to startunload Math Work environment before using library functions and at the end of their use. Exported m-functions void mlfltNameMfilegt(int ltnumberofreturnvaluesgt, mxArray ltreturnvaluesgt, mxArray ltinputvaluesgt. ), where: ltnumberofreturnvaluesgt number of returned variables (dont confuse with array size, etc.). mxArray ltreturnvaluesgt address of mxArray structure where the results of m-function work will be returned. mxArray ltinputvaluesgt pointer to mxArray structure of m-function input variable. As you can see, exported m-functions contain addresses and pointers to mxArray structure, and you cant directly call these functions from MetaTrader 5, as it will not understand this type of data. We wont describe mxArray structure in MetaTrader 5, because MATLAB developers do not guarantee that it will not change over time, even within the same version of the product, so you need to write a simple DLL-adapter. Its block-scheme is shown below: Figure 5. DLL-adapter Block-Scheme It is very similar to the right side of DLL for MATLAB Engine, so we wont parse its algorithm and proceed directly to the code. To do this, create two small files in your CC compiler: nSMA. cpp (from DllMatlab. zip): nSMA. def (from DllMatlab. zip): LIBRARY nnSMA EXPORTS IsStartSMA nSMA Build the project in your CC compiler: for this you need to include standard inputoutput library and add to project the following files (in your compiler: Project-gtAdd Project): nSMA. def In ltMATLABgtExternlibltwin3264gtltcompilergt folder, where: ltMATLABgt MATLAB main folder. ltwin3264gt either win32 folder for 32-bit OS, or win64 for 64-bit OS. ltcompilergt the borland folder for Borland CC ver. 5-6, the microsoft folder for Microsoft Visual C (I have files for version 6): libmx. lib mclmcr. lib NeoSMA. lib create manually (see 3.1 Developing Universal Library of MetaTrader 5 amp MATLAB Engine Interaction ). The last, what I want to tell you in this section, is about files needed when moving project to another computer, where there is no MATLAB installed. Here is a list of files and paths on the target machine: MCRInstaller. exe any folder (MCR installer) extractCTF. exe any folder (for MCR installer) MCRRegCOMComponent. exe any folder (for MCR installer) unzip. exe any folder (for MCR installer) NeoSMA. dll ltterminaldirgtMQL5Libraries NeoSMA. ctf ltterminaldirgtMQL5Libraries nnSMA. dll ltterminaldirgtMQL5Libraries Many advanced programmers have already guessed, that it is advisable to use an installer program (SETUP). There are many of them over the Internet, including free products. Now we have to test this DLL in MetaTrader 5. To do this we will write a simple script ( TestDllMatlab. mq5 from the DllMatlab. zip): Conclusion So, you know how to create a universal library for MetaTrader 5 amp MATLAB interaction, and how to connect DLL built in MATLAB environment. But still there are interfaces of MetaTrader 5 amp MATLAB interaction to be described, but this is beyond the scope of this article. The topic of this article is covered in details. Ive chose the most effective ways of interaction, not requiring a special kind of adapters. Although you can go another way, such as. NET technology - How to Export Quotes from MetaTrader 5 to. NET Applications Using WCF Services . Many readers may have a question: what method to choose The answer is simple - both, because during the designdebugging of mathematical model the speed is not needed. But youll need the full power of MATLAB without special production costs for programming. MATLAB Engine will help here, of course. However, when the mathematical model is debugged and ready to use, youll need speed, multitasking (work of indicator andor trade system at several price charts) - here without a doubt youll need a DLL, built in MATLAB environment. But all this does not oblige you to follow it. 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 andor 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 andor mechanical trade system dynamic genetic algorithm in mechanical trade system (dynamic strategy tester) dynamic neural network algorithm in the indicator andor 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: mql5ruarticles44


No comments:

Post a Comment