Programmierung
Jetzt liest du
MMS Praktisch. Algo Trader cz. I [Programmierkurs]
0

MMS Praktisch. Algo Trader cz. I [Programmierkurs]

erstellt Radek SzafronJuli 4 2019

In der heutigen Folge werden wir an einer Software arbeiten, mit der Sie die Möglichkeiten des algorithmischen Handels nutzen und gleichzeitig die maximale Kontrolle über den Verlauf der Ereignisse behalten können. Wir werden uns auf Ideen konzentrieren, die es Ihnen ermöglichen, in der Realität zu handeln, indem Sie die intuitive Bedienung und Flexibilität der Funktion maximieren. In der Software verwenden wir eine Schnittstelle, deren Form von vielen als Standard in der Tageshandelsbranche angesehen und häufig als "Schnittstelle" bezeichnet wird Preisleiter

algotrader

Algo Trader - Schnittstelle

Projektplan

Wir teilen die Arbeit in mehrere Stufen, denn neben einem breiten Serviceaufträge, Algo Trader ermöglicht es Ihnen, Algorithmen auszuführen, die automatisch durch die Position einer Vielzahl von Kombinationen verwaltet werden, die Sie abhängig von der Situation schaffen können sie auf dem Markt zu begegnen.

Im heutigen Teil werden wir den ersten Schritt in die Welt der objektorientierten Programmierung machen und einen elementaren Teil unseres Projekts in Bezug auf die Schnittstelle und die Bedienung grundlegender Operationen starten.

In den nächsten Folgen werden wir mit der Arbeit an den ersten Algorithmen beginnen. Zu Beginn erstellen wir einen GTP-Algorithmus, der sicherstellt, dass die Position mit dem erwarteten Gewinn geschlossen wird, unabhängig davon, wie viele Bestellungen eingehen. Als nächstes erstellen wir den Algorithmus OOO (One Opens the Other, so genau war es noch nicht) und schließlich einen Algorithmus, der das Scalping bei der Präsentation wichtiger Makrodaten ermöglicht. Zusammen mit den Algorithmen werden wir hier und da ein paar nette Gadgets hinzufügen.

Technischer Hintergrund

Sie finden das Paket mit den Dateien, die Sie heute benötigen, unter folgendem Link:

Wenn Sie die Software verwenden, akzeptieren Sie die Lizenz, die dem Dateisatz beigefügt ist.

Damit die Software ordnungsgemäß funktioniert, benötigen Sie eine Microsoft NET Framework-Version von min. 4.6.1 Runtime, die Sie hier herunterladen können:

Objektorientierte Programmierung

Wir erstellen unsere Software mit Objektprogrammierung, ein Programmierverfahren, das die logische Anordnung von Algorithmusfragmenten im sogenannten erlaubt Objekte, deren Aufgabe es ist, separate Funktionen auszuführen und mit anderen Objekten zu kommunizieren, um die Aufgabe des Programms als Ganzes zu implementieren. Um weiter zu gehen, müssen wir verstehen, was Objekte in der Praxis sind und wie sie erstellt werden. Schauen Sie sich dazu den folgenden Artikel in Wikibooks an, in dem Sie anhand des Beispiels der C ++ - Sprache, auf der MQL4 basiert, die Grundlagen verstehen.

LESEN SIE DEN ARTIKEL

Erste klasse

Wie Sie sehen, dreht sich alles um das Schlüsselwort Klasse. Hiermit können Sie ein Objekt definieren, das Sie dann mit einem Schlüsselwort erstellen können neu. Öffnen Sie die Datei, die die Definition einer der Klassen enthält, die wir heute verwenden werden, die Datei ChartOperations.mqhdie Sie im Katalog finden MQL4 \ Include \ AlgoTrader_v10.

Klasse cChartOperations { Öffentlichkeit: cChartOperations(int Breite, int Höhe) { //… } ungültig Onclick(int x, int y) { //… } ungültig OnChartChange() { //… } Privatgelände: int Chart_width; int Chart_height; Uint Last_click; int Last_click_x, Last_click_y; bool IsDoubleClick(int x, int y) { //… } };

 

 

Jede Klasse verfügt über einen Konstruktor, der in der Praxis eine Funktion ist, die beim Erstellen des Objekts automatisch aufgerufen wird. Der Konstruktor trägt den gleichen Namen wie das Objekt und kann Parameter annehmen. In unserem obigen Code-Snippet erstellen wir einen Konstruktor wie folgt:

cChartOperations(int Breite, int Höhe) { }

 

Nach dem Erstellen des Konstruktors können wir die Komponenten der Klasse definieren, dh Funktionen und Variablen. Sie sind genau wie bei gewöhnlichen Funktionen und Variablen definiert, mit dem Unterschied, dass sie sich im Hauptteil der Klasse befinden. Achten Sie auf Ihre Keywords Öffentlichkeit: oraz Privatgelände:. Alle Funktionen und Variablen nach dem Wort Öffentlichkeit: wird für Funktionen verfügbar sein, die in anderen Teilen der Software zu finden sind, beispielsweise in der API-Funktion OnTick () oder andere Gegenstände. Privat Es informiert den Compiler jedoch darüber, dass die in diesem Teil definierten Elemente streng vertraulich sind und dass außer einem bestimmten Objekt natürlich niemand auf sie zugreifen kann.

Anwendungen von Objekten

Was macht Objekte so nützlich? Unter anderem ist es so, dass einmal definierte Objekte in einer beliebigen Anzahl von Kopien erstellt werden können und sich abhängig von den an sie übergebenen Parametern unterschiedlich verhalten, aber auf eine Weise, die wir analysieren und steuern können. Darüber hinaus ermöglichen die Objekte die lesbare Organisation des Codes, indem die Komponenten des Algorithmus in extrahierte Elemente unterteilt werden, und ein ordnungsgemäß entworfenes Objekt kann in einer völlig anderen Software verwendet werden, mit der Sie komplexe Anwendungen effektiv erstellen können.


Fachberater


Wir starten das erste Objekt

Gehen wir zur Hauptdatei unserer Software, der Datei AlgoTrader_v10.mq4was Sie im Katalog finden MQL4 \ Experts \.

Werfen wir einen Blick auf die unten stehende API-Definition OnInit ():

cChartOperations* ChartOperations = NULL; int OnInit() { // (...) int chart_width = (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS); int chart_height = (int)ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS); ChartOperations = neu cChartOperations(chart_width, chart_height); Rückkehr(INIT_SUCCEEDED); }

Zeiger

In dem Teil der Datei, der für die Definition globaler Variablen mithilfe eines Codefragments verantwortlich ist ...

cChartOperations* ChartOperations = NULL;

 

... wir schaffen das sogenannte Zeiger dh ein Zeiger, der eine Adresse zu einer Stelle im Speicher des Computers enthält, an der unser Objekt später erstellt wird. Mit dem Zeiger können wir auf das Objekt verweisen und dessen Funktionen aufrufen. Zeiger wir definieren ähnlich wie Variablen, das erste Element der Notation ist der Objekttyp, dann platzieren wir den Stern * Danach setzen wir einen eindeutigen Namen für das Objekt, den wir später als Referenz verwenden werden. Für uns Zeiger wir weisen eine Variable zu NULL, was besagt, dass es zum jetzigen Zeitpunkt noch kein Objekt anzeigt.

Konstruktor

Später im Code, im Hauptteil der Funktion OnInit () Wir erstellen das richtige Objekt mit einem Schlüsselwort neu.

ChartOperations = neu cChartOperations(chart_width, chart_height);

 

Po neu Wir rufen den Konstruktor des Objekts auf, der in unserem Fall zwei Variablen benötigt, die das Objekt über die Dimensionen unseres Diagramms informieren, da wir es benötigen, um unsere Schnittstelle richtig zu platzieren. Der aufgerufene Konstruktor leitet die Adresse des neu erstellten Objekts im Speicher des Computers an unseren weiter Zeiger genannt ChartOperations.

Zerstörer

Objekte sind eine spezielle Art von Daten. Wenn wir sie erstellen, müssen wir sicherstellen, dass sie endgültig aus dem Speicher des Computers entfernt werden. All dies, damit Sie vor Ihrem Laptop keinen riesigen Server haben müssen, der zuvor erstellte Daten sammelt, die für niemanden mehr benötigt werden.

Um Objekte zu löschen, verwenden wir das Schlüsselwort löschenDanach setzen wir unseren Namen poinera angibt, welches Objekt wir meinen. Wir entfernen unser Objekt nur in der API-Funktion OnDeinit (...)weil wir es während des gesamten Anwendungslebenszyklus benötigen, bis die Software ausgeschaltet wird.

ungültig OnDeinit(const int Grund) { // (...) löschen ChartOperations; }

Mit Objekten arbeiten

Lassen Sie uns nun sehen, wie wir unser erstelltes Objekt für die Anforderungen unserer Anwendung verwenden können. Zu diesem Zweck im Körper der Klasse cChartOperations Wir haben mehrere Funktionen definiert. Schauen wir uns einen davon an:

ungültig Onclick(int x, int y) { if(IsDoubleClick(x, y)) GoToPrice(x, y); }

 

Funktion OnClick (...) wir brauchen es, um unserer schnittstelle mitzuteilen, welche preisniveaus für uns aktuell interessant sind. Durch einen Doppelklick auf die Grafik setzt der Algorithmus unsere Preisliste an die angegebene Stelle. Damit unsere Funktion funktioniert, müssen wir den Moment erkennen, in dem wir auf das Diagramm klicken. Hier hilft die API-Funktion OnChartEvent (...)

ungültig OnChartEvent(const int Identifikation const lange & lparam, const doppelt & dparam, const Schnur & Holm) { // (...) if(id == CHARTEVENT_CLICK) ChartOperations.OnClick((int)lParam (int)dparam); }

 

Das obige Code-Snippet erkennt den Moment, in dem der Benutzer auf das Diagramm klickt, und ruft dann die Funktion auf, die sich in unserem zuvor erstellten Objekt befindet. Das Aufrufen einer Funktion besteht darin, einen Punkt nach unserem Namen zu setzen Zeiger an das Objekt übergeben und dann den Namen der gewünschten Funktion sowie die erforderlichen Parameter übergeben, die in unserem Fall die x- und y-Koordinaten der Stelle in der Tabelle angeben, an der der Klick ausgeführt wurde.

Erste Effekte

Die von uns erstellten Prozeduren haben die erste Funktionalität der Software gestartet, die wir testen können, indem wir unser Programm kompilieren und auf ein anderes Diagramm klicken. Im Folgenden finden Sie eine Grafik mit einigen Funktionen, mit denen Sie die in unserer grafischen Oberfläche angezeigten Preisniveaus ändern können.

Programmierung mql

Algo Trader - Maus- und Preisniveau

Zweite Klasse

Da Sie in die zweite Klasse befördert wurden und unser Klicken nicht verschwendet wird, werden wir eine zweite Einrichtung entwerfen, mit der Sie Bestellungen von der Ebene unserer Leiter aus aufgeben können. Zu diesem Zweck haben wir die entsprechende Klasse vorbereitet, die Sie in der Datei finden MQL4 \ Include \ AlgoTrader_v10 \ OrderOperations.mqh

Klasse cOrderOperations { Öffentlichkeit: cOrderOperations(int position_id) { Position_id = position_id; } ungültig OnTimer200ms() { ProcessOrderRequests(); } Privatgelände: int Position_id; ungültig ProcessOrderRequests() { sOrderRequest Anforderung = ReadOrderRequest(); if(request.Request_id <= 0) zurück; if(request.Order_symbol != Symbol() || request.Position_id != Position_id) { request.Request_status = ORDER_REQUEST_STATUS_FAILED; request.Request_error = ORDER_REQUEST_ERROR_WRONG_POSITION; zurück; } if(OrderSend(request.Order_symbol, request.Order_type, request.Order_volume, request.Order_price, 0, 0, 0, request.Order_comment, request.Position_id) > 0) { request.Request_status = ORDER_REQUEST_STATUS_COMPLETED; } sonst { request.Request_status = ORDER_REQUEST_STATUS_FAILED; request.Request_error = _LastError; } UpdateOrderRequest(Anforderung); } };

Im obigen Code sehen Sie die vollständige Definition des Objekts cOrderOperationsDies wird verwendet, um Bestellungen abzuwickeln, die wir auf unserer Preisleiter platzieren werden. Achten Sie auf die Funktion ProcessOrderRequests ()in dem unser Programm mit der Bibliothek kommuniziert dll mit der Funktion ReadOrderRequest ().

Strukturen

Funktion ReadOrderRequest () als Ergebnis seiner Aktion gibt eine Typstruktur zurück sOrderRequestHierbei handelt es sich um einen Datensatz, den wir bei einer Bestellung über die Schnittstelle definiert haben.

ungültig ProcessOrderRequests() { sOrderRequest Anforderung = ReadOrderRequest(); // (...) }

Strukturen sind jüngere Schwestern von Klassen, mit denen Sie einen Datenblock mit vielen Variablen erstellen können. Dies ermöglicht die logische Anordnung von Informationen, die sich auf ein bestimmtes Problem beziehen. In unserem Fall sammelt die Struktur Daten über die von unserer grafischen Oberfläche gesendete Bestellung, wie beispielsweise den Eröffnungspreis oder das Volumen. Wir definieren eine Struktur, indem wir ihrem Namen ein Schlüsselwort voranstellen structund dann setzen wir eine Liste der Daten, die wir brauchen.

struct sOrderRequest { int request_id; int Position_id; int ORDER_TYPE; doppelt Order_volume; doppelt Order_price; doppelt Order_range; Schnur Order_symbol; Schnur Order_comment; int REQUEST_STATUS; int Request_error; };

 

Die obige Definition finden Sie in der Datei MQL4 \ Include \ AlgoTrader_v10 \ Definitions.mqh.

Wir verwenden Strukturen ähnlich wie Variablen. Im ersten Schritt müssen wir sie durch Angabe des Strukturtyps erstellen und dann einen eindeutigen Namen vergeben, auf den wir später verweisen können. Im folgenden Beispiel erstellen wir eine Typstruktur sOrderRequest und wir geben ihm einen eindeutigen Namen Anforderungund dann ordnen wir Daten von unserer Schnittstelle mit Funktionen ReadOrderRequest ().

ungültig ProcessOrderRequests() { sOrderRequest Anforderung = ReadOrderRequest(); // (...) }

 

Der Zugriff auf in der Struktur gespeicherte Daten erfolgt analog zur Verwendung von Variablen, da die Struktur in der Praxis nur eine Gruppe von Variablen ist, die unter einem gemeinsamen Bezeichner verborgen sind. Um Daten in der Struktur zu lesen oder zu schreiben, genügt es, nach dem Namen, den wir vergeben haben, einen Punkt einzufügen und dann den Namen der Variablen anzugeben, die uns interessiert. Im folgenden Codefragment lesen wir die in der Struktur gespeicherten Daten, um den Auftrag zu senden, und speichern dann die Informationen über das Ergebnis der Operation.

if(OrderSend(request.Order_symbol, request.Order_type, request.Order_volume, request.Order_price, 0, 0, 0, request.Order_comment, request.Position_id) > 0) { request.Request_status = ORDER_REQUEST_STATUS_COMPLETED; }

Ausführung von Aufträgen

Damit unsere Software Bestellungen aufgibt, müssen wir das Objekt implementieren, das auf der Grundlage der Klasse erstellt wurde cOrderOperations. Da wir das Objekt ab dem Start unseres Programms benötigen, erstellen wir es in der API-Funktion OnInit ().

Eingabe int Position_id = 8821; // Die eindeutige Kennung des Elements cOrderOperations* OrderOperations = NULL; int OnInit() { EventSetMillisecondTimer(200); // (...) OrderOperations = neu cOrderOperations(Position_id); Rückkehr(INIT_SUCCEEDED); }

 

Im Konstruktor cOrderOperations wir platzieren eine Variable Position_idDies ist Teil der Einstellungen unserer Anwendung, die im Standardfenster der MetaTrader-Plattform verfügbar sind. Die Kennung ermöglicht es unserer Software, ihre eigenen Bestellungen zu erkennen, so dass keine Verwechslungen mit Bestellungen aus anderen Quellen auftreten.

Wir haben auch den obigen Code gestartet Timer mit dem 200 ms-Intervall, da unser Objekt regelmäßig überprüfen sollte, ob die Schnittstelle Informationen über den eingehenden Auftrag sendet.

ungültig OnTimer() { // (...) OrderOperations.OnTimer200ms(); }

 

Die Funktion des Objekts OnTimer200ms () ruft eine Funktion auf ProcessOrderRequests ()Wer wird die Bestellung aufgeben, wenn er die entsprechenden Daten von der Schnittstelle erhält.

Klasse cOrderOperations { Öffentlichkeit: cOrderOperations(int position_id) { Position_id = position_id; } ungültig OnTimer200ms() { ProcessOrderRequests(); } // (...) };

Effekte

Unsere Software kann bereits mit der grafischen Oberfläche kommunizieren und wir können das tun, was wir am liebsten tun, dh den Algorithmus kompilieren und eine neue Bestellung aufgeben. Um Ihnen den Einstieg in die ersten Schritte zu erleichtern, finden Sie einige Tipps, die veranschaulichen, welche Funktionen unter den verschiedenen Tasten verborgen sind.

Lautstärkeregler

Devisenhandelsvolumen

Algo Trader - Volumenbehandlung

Arten von Bestellungen

Algo-Handel

Algo Trader - Auftragsabwicklung

Summe

Das ist alles für heute, aber es ist erst der Anfang des Abenteuers mit Algo-Händler. In der nächsten Folge werden wir uns mit der Implementierung erweiterter algorithmischer Funktionen befassen. Algo Trader wird zusammen mit Ihnen erstellt und wir sind dankbar für alle Ideen und Kommentare, die es für Sie besser machen könnten. Wir würden uns freuen, von Ihnen zu hören biuro@expertadvisors.pl .

Was denken Sie?
Ich mag es
70%
interessant
20%
Heh ...
10%
Shock!
0%
Ich mag es nicht
0%
Verletzung
0%
Über den Autor
Radek Szafron
Der Autor der Publikation ist Radek Szafron, Inhaber der Expert Advisors Company, die seit vielen Jahren Investoren unterstützt, indem sie Technologien für den FOREX-Markt bereitstellt. Der Autor ist ein Absolvent der Warschauer School of Economics mit der Spezialisierung "Finanzmärkte" und Programmierer mit fast 20-Sommererfahrung. Das Unternehmen implementiert Algorithmen und Anwendungen, die in allen Sprachen der "C" -Familie geschrieben wurden, einschließlich der beliebten Plattformen Meta Trader 4 und 5. Expert Advisors finden Sie unter www.expertadvisors.pl.