Skip to main content

Matlab Handelsindikatoren


MetaTrader 5 - Beispiele MetaTrader 5 und MATLAB Interaction Einleitung Mein erster Artikel Die Interaktion zwischen MetaTrader 4 und MATLAB Engine (Virtual MATLAB Machine) wurde von MMS-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, weil das Einreichen von Klassen und MQL5-Strukturen für MATLAB keinen Sinn macht. 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 - meist 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-Input / Output-Bibliothek Referenz In diesem Abschnitt werden die wichtigsten Funktionen der MATLAB Engine API, MATLAB-Compiler 4 und Anzahl der nützlichen Funktionen der C-Standard-Eingabe / Ausgabe-Bibliothek. 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 4/5 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 4/5 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 Input / Output Library), wobei: double p Zeiger auf Array des doppelten Typs. 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 Spezialbibliothek des MATLAB-Pakets, die es ermöglicht, eigenständige Anwendungen / öffentliche Bibliotheken, die von der MATLAB-Umgebung auf einem beliebigen Computer generiert werden, 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. C / C-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 C / C-Compiler: Lcc C (in der Regel mit MATLAB). Sein einziger C-Compiler. Borland C Versionen 5.3, 5.4, 5.5, 5.6. Microsoft Visual C / C 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 C / C-Code, aber er erzeugt eine spezielle Datei auf Basis der CTF - Die Integrationen verschiedener Pakete beinhaltet, 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: C / C-Schnittstellencode für m-Funktionen, die in der Befehlszeile (NameFilemain. c) angegeben sind. Component-Datei (NameFilecomponent. dat), die alle Informationen enthält, die zum Ausführen von m-Code (einschließlich der Verschlüsselungsschlüssel und Pfade, gespeichert in CTF-Datei) erforderlich sind. C / C Übersetzung. In diesem Stadium werden C / C-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 Input / Output Library Mit Hilfe der Standard Input / Output Library ist das richtige Kopieren der Daten gewährleistet. 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 Input / Output Library sind wir nur an einer Funktion interessiert: void pIn memcpy (void pIn, void pOut, int nSizeByte) Diese Funktion kopiert (clones) Variable / array von pOut nach pIn mit 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 4/5 AMP MATLAB Engine Interaktion zu schreiben. Nach diesem MetaTrader 4/5 Skript / Indikator / Experte kann MATLAB virtuellen Desktop verwalten. 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: Um mathematische Modelle / Ideen zu prüfen oder zu demonstrieren, ohne komplexe Programme schreiben zu müssen, kann der Schutz des geistigen Eigentums wie im MQL-Programm und mittels des MATLAB-Pakets mit Hilfe von P-Funktionen erfolgen. Um komplexe mathematische Modelle mit allen Merkmalen von MATLAB zu schreiben. An alle, die ihre Skripte / Indikatoren / Experten nicht verteilen wollen. 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 sowie 2.3 C Standard Input / Output Bibliothek, da wir sie nicht mehr pausieren und analysieren werden. 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 der gesendeten / empfangenen Daten: Reverse-Arrays. Typenkonvertierung. Strings codiert die Konvertierung. C / C-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-Zeichenfolge, die einen eindeutigen Variablennamen für die virtuelle MATLAB-Maschine enthält. Konvertieren Sie NameArray-Zeichenfolge zu char-Array mit der Funktion StringToCharArray (). Finden Sie die Größe des Arrays mithilfe der mlxGetSizeOfName () - Funktion. IF-Größe ist MEHR ALS NULL. Weisen Sie dem Empfänger-Array der benötigten Größe mithilfe der ArrayResize () - Funktion zu, erhalten Sie Daten von mlxGetDouble (). Arraygröße zurück. IF-Größe ist NULL. Return-Fehler, d. h. Nullwert. Thats it Die Funktionen mlGetInt () und mlGetLogical () erzeugen eine Schattenumwandlung der Typen double - gt int / bool. Zu diesem Zweck erzeugen diese Funktionen einen temporären Speicherpuffer in ihrem Körper. Dies ist eine erzwungene Maßnahme, denn MATLAB API erlaubt es leider nicht, mxArray-Strukturen für andere Datentypen als double zu erstellen. Dies bedeutet jedoch nicht, dass MATLAB ausschließlich die Doppeltypen betreibt. C / C-Block ist viel einfacher - es sollte Daten-Übersetzung von der doppelten Art in die mxArray-Struktur. Dies geschieht mit Hilfe von mxCreateDoubleMatrix (). MxGetPr () und memcpy () Funktionen. Anschließend übergibt sie mit der Funktion engPutVariable () Daten an die virtuelle MATLAB-Maschine und extrahiert Daten, die sie mit der Funktion engGetVariable () verwendet. Achten Sie wiederum auf Funktionen mit Präfixen Int und Logical wie im Block-Schema gesehen, sie nicht direkt mit MATLAB interagieren, sondern verwenden Sie die Funktionen mlxInputDouble / mlxGetDouble und mlxInputChar (). Der Algorithmus ihres Verhaltens ist einfach: Aufruf der Eingabe - / Ausgabe-Werte mlxInputDouble / mlxGetDouble als double () und Senden des Schatten-MATLAB-Befehls, um den Datentyp über die Funktion mlxInputChar () zu konvertieren. MATLAB Motorblock ist noch einfacher. Es bietet nur mathematische Funktionen. Ihr Verhalten hängt von Ihren Befehlen und Ihren m / p-Funktionen ab. Nun, wenn alle Details des Projekts sind klar, seine Zeit, um mit dem Projekt zu beschäftigen. Jeder solche Build beginnt mit der Erstellung der Hauptbibliothek in unserem Fall ist es C / C-Block. Dazu erstellen Sie in einem beliebigen ANSI-Texteditor (Editor, Bred, etc.) eine Datei mit der Erweiterung DEF. Es ist wünschenswert, dass der Name dieser Datei aus lateinischen Zeichen ohne Leerzeichen und Interpunktion besteht, sonst hören Sie viele schmeichelhafte Worte von Ihrem Compiler. Diese Datei stellt die Dauer Ihrer Funktionen zur Verfügung. Wenn diese Datei nicht vorhanden ist, erkennt C / C-Compiler seine eigenen exotischen Namen, um Funktionen zu exportieren. Diese Datei enthält: LIBRARY Steuerwort, LibMlEngine Name der Bibliothek und EXPORTS zweites Steuerwort, dann kommen die Namen der Funktionen. Wie Sie wahrscheinlich wussten, können die Namen von Exportfunktionen keine Leerzeichen und Interpunktion enthalten. Hier ist der Text der DllUnit. def Datei aus MATLABEngine. zip Archiv: LIBRARY LibMlEngine EXPORTS mlxClose mlxInputChar mlxInputDouble mlxInputInt mlxInputLogical mlxGetDouble mlxGetInt mlxGetLogical mlxGetSizeOfName mlxOpen So haben wir die erste Datei des Projekts. Öffnen Sie nun den Windows Explorer und gehen Sie zum Ordner ltMATLABgtExterninclude. Kopieren Sie die Engine. h-Datei (Header-Datei der virtuellen MATLAB-Maschine) in den Ordner, in dem das Projekt erstellt wird. Wenn Sie dies nicht tun, müssen Sie den Pfad der Datei im Kompilierungsstadium manuell angeben. Jetzt seine Zeit, um C / C-Block zu erstellen. Wir werden nicht den gesamten Quellcode des Programms in dem Artikel enthalten, da diese Datei in MATLABEngine. zip als DllUnit. cpp gefunden werden kann und es gut kommentiert wird. Man beachte, daß es besser ist, Funktionen unter Verwendung der stdcall-Konvention zu schaffen, d. h. Parameter werden durch den Stapel geleitet, und die Funktion reinigt den Stapel. Dieser Standard ist für Win32 / 64-API nativ. Überlegen Sie, wie eine Funktion deklariert wird: extern C declspec (dllexport) ltvariabletypegt stdcall Funktion (lttypegt ltnamegt) extern C declspec (dllexport) teilt C Compiler mit, dass diese Funktion extern ist. Ltvariabletypegt Typ der zurückgegebene Variable, kann sein: void, bool, int, double. Composite-Typen (bekannt nicht nur für Dll, sondern auch für aufrufendes Programm) und Zeiger. Stdcall Deklaration über die Übergabe von Parametern an Funktion und zurück, es ist ein Standard für Win32 / 64 API. Funcion Ihren Funktionsnamen. Lttypegt ltnamegt Typ und Name der Eingangsvariablen, maximale Anzahl der Variablen ist 64. C / C-Blockbau: Dazu müssen Sie die Standard-Eingabe / Ausgabe-Bibliothek und die folgenden Dateien (in Ihrem Compiler: Project-gtAdd Project) : DllUnit. def Im Ordner ltMATLABgtExternlibltwin32 / 64gtltcompilergt, wobei: ltMATLABgt MATLAB-Hauptordner. Ltwin32 / 64gt entweder Win32-Ordner für 32-Bit-Betriebssystem oder Win64 für 64-Bit-Betriebssystem. Ltcompilergt den Borland-Ordner für Borland C / C ver. 5-6, der Microsoft-Ordner für Microsoft Visual C: libeng. lib libmx. lib Eine allgemeine Frage wie diese entstehen kann: Ich habe verschiedene Version des Compilers oder kein solcher Compiler in der Liste (Sehr selten gibt es keine solche Dateien). Hier können Sie eine öffentliche Bibliothek manuell erstellen. Wir werden prüfen, wie seine getan in Visual C und in Borland C: In FAR öffnen ltMATLABgtBinltwin32 / 64gt Ordner, wo: ltMATLABgt MATLAB Hauptordner. Ltwin32 / 64gt entweder Win32-Ordner für 32-Bit-Betriebssystem oder Win64 für 64-Bit-Betriebssystem. Für Borland C geben Sie ein: implib libeng. lib libeng. dll. Das gleiche für libmx. dll. Für Visual C geben Sie Folgendes ein: lib libeng. dll. Das gleiche für libmx. dll. Wenn andere Compiler. Jeder Compiler einer beliebigen Programmiersprache muss dieses Dienstprogramm haben - Library Manager, normalerweise ist dies ein Konsolenprogramm ltcompiler foldergtbinlib. exe. By the way, ich habe vergessen, Sie warnen - nicht versuchen, 64-Bit-LIB für 32-Bit-Compiler zu machen. Erstens, herauszufinden, ob es 64-Bit-Adressierung Unterstützung in Compiler-Hilfe. Wenn nicht, entweder auf der Suche nach 32-Bit-MATLAB-DLL, oder wählen Sie einen anderen C / C-Compiler. Auf die Kompilierung, nach der wir eine Bibliothek, die sollte in den TerminalfolderMQL5Libraries Ordner platziert werden. Jetzt beginnen wir mit MQL-Block. Führen Sie MetaEditor aus, klicken Sie auf Neu, und führen Sie die folgenden Schritte aus: Abbildung 2. MQL5-Assistent: Bibliothek erstellen Abbildung 3. MQL5-Assistent: Allgemeine Eigenschaften der Bibliothek Wenn der Assistent MQL5 eine Vorlage erstellt hat, fahren Sie mit der Bearbeitung fort: Beachten Sie, dass MQL 5 Sie Können Zeiger auf zwei Arten übergeben: void NameArray // Diese Methode des Übergebens von array erlaubt nur das Lesen von Daten. Jedoch wenn Sie versuchen, diesen Hinweis zu verwenden, um seinen Inhalt zu redigieren, erhalten youll Speicherzugriffstörung (im besten Fall für Sie, MetaTrader 5 leise behandeln den Fehler im SEH-Rahmen, aber wir HABEN SCHREIBEN einen SEH-Rahmen, also Wir können sogar die Fehlerursache übersehen). Voidamp NameArray // Diese Methode des Übergebens ermöglicht das Lesen und Bearbeiten von Array-Inhalten, aber Sie müssen die Arraygröße beibehalten. Wenn die Funktion keine Parameter akzeptiert oder überträgt, geben Sie immer den void-Typ an. 2. Wir beschreiben nicht alle Funktionen des MQL-Blocks, da Sie MatlabEngine. mq5 Quellcode in MATLABEngine. zip finden können. Beachten Sie daher die Details der Deklaration und Definition von externen Funktionen in MQL5: Wie im Beispiel gesehen, sind die Deklaration und Definition der Funktion kombiniert. In diesem Fall deklarieren wir eine Funktion namens mlInputChar () als external (export), die den Wert des Bool-Typs zurückgibt und den Array-String als Parameter akzeptiert. Jetzt kompilieren. Nun, da wir den letzten Block der Bibliothek abgeschlossen haben und es kompiliert, seine Zeit, um es in realen Bedingungen zu testen. Dazu schreiben Sie ein einfaches Test-Skript (oder nehmen Sie es aus MATLABEngine. zip, Datei: TestMLEngine. mq5). Script-Code ist einfach und gut kommentiert: Wie aus dem Skript zu sehen, werden wir Werte eingeben, und erhalten dann Werte. Jedoch, im Gegensatz zu MetaTrader 4, wo wir die Größe des Puffers im Entwurfsstadium kennen mussten, ist es in MetaTrader 5 nicht erforderlich, da wir dynamische Puffer verwenden. Nachdem Sie schließlich die virtuelle MATLAB-Maschine verstanden haben, können Sie mit der Verwendung von DLL in der MATLAB-Umgebung arbeiten. 3.2 Technische Richtlinien für den Aufbau / die Verwendung von DLL, die von MATLAB Compiler 4 generiert wurden Im vorherigen Abschnitt haben Sie gelernt, wie Sie eine Bibliothek für die universelle Interaktion mit dem MATLAB-Paket erstellen können. Allerdings hat diese Methode einen Nachteil - es erfordert MATLAB Paket von Endbenutzer. Diese Beschränkung schafft eine Anzahl von Schwierigkeiten bei der Verteilung des fertigen Softwareprodukts. Das ist, warum MATLAB mathematisches Paket einen eingebauten Compiler hat, der Ihnen erlaubt, eigenständige Anwendungen unabhängig vom MATLAB Paket zu verursachen. Werfen wir einen Blick auf sie. Betrachten Sie zum Beispiel einen einfachen Indikator - gleitenden Durchschnitt (SMA). Aktualisieren Sie es leicht, indem Sie einen Neuronalen Netzwerkfilter (GRNN) hinzufügen, der es ermöglicht, weißes Rauschen (zufällige Bursts) zu glätten. Benennen Sie das neue Kennzeichen als NeoSMA und filtern Sie als GRNNFilter. So haben wir zwei m-Funktionen, von denen wir eine DLL erstellen wollen, die von MetaTrader 5 aufgerufen werden können. Jetzt muss der MetaTrader 5 in folgenden Ordnern nach DLLs suchen: ltterminaldirgtMQL5Libraries ltterminaldirgt Aktueller Ordner Systemordner ltwindowsdirgtSYSTEM32 ltwindowsdirgt Verzeichnisse, Umgebungsvariable PATH. Platzieren Sie daher in einem dieser Verzeichnisse zwei m-Funktionen (NeoSMA. m und GRNNFilter. m), wo wir DLL erstellen werden. Ich lasse Sie auf diese Tatsache der Platzierung aufmerksam, da dies nicht zufällig geschieht. Aufmerksamer Leser kennt bereits die MATLAB-Compiler-Funktion - er bewahrt die Pfade beim Übersetzen (siehe 2.2 MATLAB-Compiler 4). Bevor Sie beginnen, Projekt zu kompilieren, müssen Sie Compiler konfigurieren. Gehen Sie hierzu folgendermaßen vor: Geben Sie in der MATLAB-Befehlszeile ein: mbuild - setup Drücken Sie y, um die Suche nach C / C-kompatiblen Compilern zu überprüfen, die in Ihrem System installiert sind. Wählen Sie Standard Lcc-win32 C Compiler. Drücken Sie y, um den ausgewählten Compiler zu bestätigen. Abbildung 4. Kompilieren des Projekts Jetzt sind wir bereit, in den m-Funktionen-Kompilierungsprozess zu wechseln. Mcc - N - W lib: NeoSMA - T link: lib NeoSMA. m GRNNFilter. m Erklären Sie die Schlüssel: - N, um alle unnötigen Pfade überspringen - W lib: NeoSMA sagt Compiler, dass NeoSMA der Name der Bibliothek - T Link: lib sagt Compiler zur Erstellung einer öffentlichen Bibliothek mit der Verknüpfung von NeoSMA. m und GRNNFilter. m m-functions names Nun können Sie sehen, was Compiler erstellt hat: mccExcludedFiles. log Log-Datei mit Compilern Aktionen NeoSMA. c C Version der Bibliothek (enthält - Code des Wrappers) NeoSMA. ctf CTF-Datei (siehe 2.2 MATLAB-Compiler 4) NeoSMA. h-Headerdatei (enthält Deklarationen von Bibliotheken, Funktionen, Konstanten) NeoSMA. obj-Objektdatei (Quelldatei mit Maschinen - und Pseudocode) NeoSMA. exports exportierte Funktionen Namen NeoSMA. Dll Dll zur weiteren Verknüpfung NeoSMA. lib Dll zur Verwendung in C / C-Projekten NeoSMAmcccomponentdata. c C-Version auf Komponente (verwendet für die Einhaltung der CTF-Datei, enthält Pfade, etc.) NeoSMAmcccomponentdata. obj Objektversion der Komponente (Quelldatei mit Maschine Und Pseudo-Code) So lässt sich mit DLL, genau mit seiner internen Struktur. Es besteht aus (Grundfunktionen nur) aus: Hauptfunktion eines DLL - BOOL WINAPI DllMain (). (Nach Microsoft-Spezifikation) behandelt Ereignisse, die in DLL auftreten: DLL-Laden in Adressraum des Prozesses, Erstellen eines neuen Streams, Löschen des Streams und Entladen DLL aus dem Speicher. Service-Funktionen der DLL-Initialisierung / - Deinstallation. BOOL ltNameLibgtInitialize (void) / void ltNameLibgtTerminate (void) benötigt, um Math Work-Umgebung zu starten / zu entladen, bevor Bibliotheksfunktionen verwendet werden und am Ende ihrer Verwendung. Ausgeführte m-Funktionen void mlfltNameMfilegt (int ltnumberofreturnvaluesgt, mxArray ltreturnvaluesgt, mxArray ltinputvaluesgt.), Wobei: ltnumberofreturnvaluesgt die Anzahl der zurückgegebenen Variablen (nicht mit der Arraygröße verwechseln usw.). MxArray ltreturnvaluesgt die Adresse der mxArray-Struktur, in der die Ergebnisse der m-Funktion zurückgegeben werden. MxArray ltinputvaluesgt Zeiger auf mxArray-Struktur der m-Funktions-Eingangsvariablen. Wie Sie sehen können, enthalten exportierte m-Funktionen Adressen und Zeiger auf die Struktur mxArray und Sie können diese Funktionen nicht direkt von MetaTrader 5 aufrufen, da sie diese Art von Daten nicht verstehen. Wir beschreiben nicht mxArray Struktur in MetaTrader 5, weil MATLAB Entwickler nicht garantieren, dass es nicht im Laufe der Zeit ändern, auch innerhalb der gleichen Version des Produkts, so müssen Sie einen einfachen DLL-Adapter schreiben. Sein Blockschema ist unten abgebildet: Abbildung 5. DLL-Adapter Blockschema Es ist der rechten Seite der DLL für die MATLAB Engine sehr ähnlich, so dass wir seinen Algorithmus nicht analysieren und direkt zum Code gehen. Erstellen Sie dazu zwei kleine Dateien in Ihrem C / C-Compiler: nSMA. cpp (aus DllMatlab. zip): nSMA. def (aus DllMatlab. zip): LIBRARY nnSMA EXPORTS IsStartSMA nSMA Erstellen Sie das Projekt in Ihrem C / C-Compiler: Dazu müssen Sie die Standard-Eingabe / Ausgabe-Bibliothek aufnehmen und die folgenden Dateien (in Ihrem Compiler: Project-gtAdd-Projekt) zum Projekt hinzufügen: nSMA. def Im Ordner ltMATLABgtExternlibltwin32 / 64gtltcompilergt, wobei: ltMATLABgt MATLAB-Hauptordner. Ltwin32 / 64gt entweder Win32-Ordner für 32-Bit-Betriebssystem oder Win64 für 64-Bit-Betriebssystem. Ltcompilergt den Borland-Ordner für Borland C / C ver. 5-6, der Microsoft-Ordner für Microsoft Visual C (Ich habe Dateien für Version 6): libmx. lib mclmcr. lib NeoSMA. lib manuell erstellen (siehe 3.1 Entwickeln der Universal Library von MetaTrader 5 amp MATLAB Engine Interaction). Das letzte, was ich Ihnen in diesem Abschnitt erzählen möchte, sind Dateien, die benötigt werden, wenn Sie Projekt auf einen anderen Computer verschieben, auf dem kein MATLAB installiert ist. Hier ist eine Liste von Dateien und Pfaden auf dem Zielcomputer: MCRInstaller. exe beliebigen Ordner (MCR-Installationsprogramm) extractCTF. exe beliebigen Ordner (für MCR-Installationsprogramm) MCRRegCOMComponent. exe beliebigen Ordner (für MCR-Installationsprogramm) unzip. exe beliebigen Ordner (für MCR Installer) NeoSMA. dll ltterminaldirgtMQL5Libraries NeoSMA. ctf ltterminaldirgtMQL5Libraries nnSMA. dll ltterminaldirgtMQL5Libraries Viele fortgeschrittene Programmierer haben bereits erraten, dass es ratsam ist, ein Installationsprogramm (SETUP) zu verwenden. Es gibt viele von ihnen über das Internet, einschließlich kostenloser Produkte. Jetzt müssen wir diese DLL in MetaTrader 5 testen. Dazu schreiben wir ein einfaches Skript (TestDllMatlab. mq5 aus der DllMatlab. zip): Fazit So können Sie eine universelle Bibliothek für MetaTrader 5 amp MATLAB Interaktion erstellen Wie DLL in MATLAB-Umgebung erstellt wird. Aber noch gibt es Schnittstellen von MetaTrader 5 Ampere MATLAB-Interaktion beschrieben werden, aber dies ist über den Rahmen dieses Artikels. Das Thema dieses Artikels wird ausführlich behandelt. Ive wählte die wirkungsvollsten Weisen der Interaktion, nicht erfordern eine spezielle Art der Adapter. Obwohl Sie einen anderen Weg gehen können, wie zB. NET-Technologie - So exportieren Sie Quotes aus MetaTrader 5 in. NET-Anwendungen mit WCF Services. Viele Leser können eine Frage haben: welche Methode zu wählen Die Antwort ist einfach - beide, weil während des Entwurfs / Debugging des mathematischen Modells die Geschwindigkeit nicht benötigt wird. Aber Sie brauchen die volle Leistung von MATLAB ohne spezielle Produktionskosten für die Programmierung. MATLAB Engine hilft hier natürlich. Allerdings, wenn das mathematische Modell ist debugged und gebrauchsfertig, youll brauchen Geschwindigkeit, Multitasking (Arbeit von Indikator und / oder Handelssystem zu mehreren Preis-Charts) - hier ohne Zweifel benötigen Sie eine DLL, in MATLAB-Umgebung gebaut. Aber das alles verpflichtet dich nicht, ihm zu folgen. 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. Post navigation

Comments

Popular posts from this blog

Lesen Forex Chart Pdf

So erstellen Sie ein Diagramm Trading Stationen Charts sind leicht zugänglich und einfach zu navigieren. In diesem Video sollten Sie, wie Sie die Charts, die Sie benötigen. Um ein Diagramm zu erstellen, klicken Sie auf diese Schaltfläche oben auf der Plattform. Wählen Sie das Währungspaar, den Zeitraum, der anzeigt, wie viel Daten von jedem Punkt im Diagramm dargestellt werden, und den gewünschten Zeitbereich. Wenn Sie innerhalb der Handelsstelle auf Öffnen klicken, wird das Diagramm in einer neuen Registerkarte innerhalb der Plattform geöffnet. Wenn Sie das Kontrollkästchen deaktivieren, wird das Diagramm in einem separaten Fenster geöffnet, sodass Sie weitere Bereiche verwenden können. Bildungsvideos: Alle Videos werden nur für Bildungszwecke bereitgestellt und Kunden sollten sich nicht auf den Inhalt oder die Richtlinien verlassen, da sie in Bezug auf die Entität unterschiedlich sein können Dass Sie mit handeln. Darüber hinaus werden alle Meinungen, Analysen, Preise oder sonstigen I

Turbotax Forex 988

Hallo, ich habe eine. Über turbotax. Ich melde meine Forex-Gewinne unter Abschnitt 1256 quotContracts und Straddlesquot auf TT. Die Sache ist, es will, dass ich alle meine Forex-Verträge für das Jahr melden. Was ich tun muss Ich habe meine Transaktionshistorie auf meinem Computer, aber möchte nicht, dass es alle in TT, das würde für jeden Anregungen nehmen Dank Joined Aug 2006 Status: Member 57 Beiträge, die Sie nicht unter 1256 melden müssen, wenn Sie Verträge gehandelt. Können Sie Forex Trades als einfaches Interesse Bericht, check this out. Und von meiner Freundin CPA bestätigt, dass ihr Verständnis war auch Smile. Darwin liebt dich. Mitglied seit: Mar 2006 Status: Pip Samurai 975 Beiträge Risk die Prüfung und nicht tun, es Mann Seufzer I wouldnt f-ck mit dem IRS. Wenn Sie nicht möchten, um sich im Detail zu ihnen später erklären, Id verbringen die Zeit, um sie zu ihnen jetzt detailliert. Ihre andere Wahl ist, einen Steuerbereiter zu zahlen. Das wäre mein richtiger Vorschlag. Hallo,

Indian Forex Trading Grundlagen

Forex-Transaktionen Grundlagen Beschreibung Forex-Transaktionen umfassen zwei Währungen. Eine Währung wird gekauft, während die andere verkauft wird. Betrachten Sie das EUR / USD Währungspaar. Wenn Sie dieses Paar gekauft haben, würden Sie kaufen Euro und Dollar verkaufen. Wenn Sie dieses Paar verkauft würden Sie verkaufen Euro und Dollar kaufen. Da mehr Händler das EUR / USD-Paar kaufen, steigt der Wert des Euro gegenüber dem Dollar und die Wechselkurse steigen. Ebenso, wenn mehr Händler den EUR / USD verkaufen, schwankt der Wert des Euro gegenüber dem Dollar und der Wechselkurs sinkt. Pädagogische Videos: Alle Videos werden nur für pädagogische Zwecke zur Verfügung gestellt und Kunden sollten sich nicht auf den Inhalt oder Richtlinien, da sie in Bezug auf die Entität, die Sie mit dem Handel abweichen können. Darüber hinaus werden alle Meinungen, Analysen, Preise oder sonstigen Informationen auf dieser Website zu Bildungszwecken bereitgestellt und stellen keine Anlageberatung dar. FXC