English Русский Español 日本語 Português
preview
Marktsimulation: (Teil 11): Sockets (V)

Marktsimulation: (Teil 11): Sockets (V)

MetaTrader 5Beispiele |
11 0
Daniel Jose
Daniel Jose

Einführung

Im vorangegangenen Artikel, „Marktsimulation (Teil 10): Sockets (IV)“, sprachen wir über xlwings und seine Fähigkeit, Python in Excel zu integrieren. Okay, auch wenn das alles sehr weit weg und für uns hier im Replikations-/Modellierungssystem nicht anwendbar erscheint. Und bevor Sie die Stirn runzeln bei der Aussicht auf die Integration von Python und Excel, lassen Sie uns sehen, wie wir (bis zu einem gewissen Grad) MetaTrader 5 durch Excel mit xlwings steuern können. Was wir hier zeigen, wird sich in erster Linie auf die Bildungsziele konzentrieren. Denken Sie aber nicht, dass wir nur das tun können, was hier behandelt wird. Wir können viel mehr tun. Allerdings müssen Sie lernen, wie xlwings Excel mit Python zum Laufen bringt. Dies ist die einzige Möglichkeit, den MetaTrader 5 von Excel aus vollständig zu steuern, auch ohne Excel zu verwenden. So können Sie MetaTrader 5 von Python aus steuern.


Beginnen wir mit den Grundlagen

Zunächst müssen wir etwas sehr Einfaches tun. Es sollte wirklich funktionieren. Beginnen wir mit einem Beispiel aus der xlwings-Dokumentation, das aber anders erklärt wird. Dann werden Sie verstehen, warum wir Python in Excel ausführen können.

Wir werden vom Einfachsten ausgehen. Schreiben und speichern Sie in einem beliebigen Editor den in der folgenden Abbildung gezeigten Python-Code:

Bitte beachten Sie einige Details im Bild, zum Beispiel, wo wir die Datei speichern. Das Wichtigste ist jedoch der Dateiname. Dieser Name wird später sehr wichtig sein. Achten Sie nun darauf, dass dieses Python-Skript auf etwas verweist. In diesem Fall handelt es sich um ein Excel-Tabellenblatt. Aber welches bestimmte Blatt? Keine Sorge, wir gehen Schritt für Schritt vor. Bevor wir herausfinden, um welches Blatt es sich handelt, beachten Sie bitte, dass wir in Zeile 05 einen Text in eine bestimmte Zelle schreiben werden.

Damit der Code funktioniert, muss die Kalkulationstabelle jedoch in einer Excel-Sitzung geöffnet sein. Dies bezieht sich auf Zeile 04. Diese Zeile stellt die Verbindung her, damit wir wissen, auf welches Blatt wir den Text schreiben werden. Dann gehen wir wie folgt vor: Öffnen Sie Excel und fügen Sie ein neues Blatt hinzu, sodass Excel wie in der Abbildung unten aussieht:

Also, aufgepasst. Derzeit können wir in Excel ein oder mehrere Blätter auswählen. Warum tun wir das? Der Grund dafür ist, dass wir ein Makro erstellen wollen, das ausgelöst wird, wenn Blatt1 ausgewählt wird. Auf diese Weise müssen wir keine zusätzlichen Elemente hinzufügen, um das Makro aufzurufen. Drücken Sie einfach ALT + F11, um Excel VBA zu öffnen, und geben Sie den in der folgenden Abbildung gezeigten Code ein:

Bitte beachten Sie, dass der Code zu Blatt1 gehört. Sobald dies aktiviert ist, wird dieses kleine VBA-Skript ausgeführt. Schauen wir uns nun die Zeile 03 des Codes an. Damit diese Zeile korrekt verarbeitet werden kann, muss ein Verweis auf xlwings hinzugefügt werden. Wie man das macht, haben wir im vorigen Artikel erklärt. Nachdem wir xlwings referenziert haben, können wir das Python-Skript ausführen. Aber wie?

Wie Sie sehen können, importieren wir die Datei, die im ersten Bild dieses Themas gespeichert ist. Damit VBA weiß, wo sich die Datei befindet, müssen wir ihren Namen und das Verzeichnis, in dem sie sich befindet, angeben. Da unsere Kalkulationstabelle jedoch im gleichen Verzeichnis gespeichert wird, ist es nicht erforderlich, das Verzeichnis anzugeben.

Damit VBA (oder genauer gesagt xlwings) weiß, welcher Teil des Python-Skripts ausgeführt werden soll, geben wir dies nach dem Semikolon an. Dann kehren wir zu Excel zurück und wechseln zu einem anderen Blatt. Wenn wir dies tun, sieht das Ergebnis wie in der folgenden Abbildung aus:

Perfekt. Sie haben soeben gesehen, wie Python Aufgaben in Excel ausführen kann und dabei einen Großteil von VBA ersetzt. Ich sage „viel“, weil wir noch einige Aktionen in VBA durchführen müssen, damit Python das ausführt, was Sie im Skript programmiert haben.

Aber was hat das mit MetaTrader 5 zu tun? Bleiben Sie ruhig, wir nähern uns der Erklärung. Wenn Sie mit Python nicht vertraut sind, mag das, was wir gerade getan haben, trivial erscheinen. Wenn Sie jedoch bereits Python lernen (oder sogar in Python programmieren), werden Ihre Augen wahrscheinlich leuchten, wenn Sie sich die Möglichkeiten vorstellen, die uns dieses einfache „Hello, world“ eröffnet hat.

Nun, wenn wir schreiben können, können wir auch lesen. Erinnern Sie sich, dass ich sagte, wir könnten zwar einen RTD- oder DDE-Server verwenden, um Daten an Excel zu senden, aber das wäre Zeitverschwendung? Die Informationen würden nur an Excel gesendet, und wir wären nicht in der Lage, die in Excel durchgeführten Berechnungen zur Steuerung des MetaTrader 5 zu verwenden.

Da wir Python verwenden können, um Daten direkt in Excel zu schreiben und zu lesen, können wir ein wenig weiter denken. Dies ermöglicht die Steuerung eines Expert Advisors von Excel aus, wofür lediglich eine Kommunikationsbrücke zwischen Excel und MetaTrader 5 erstellt werden muss. Aber wenn wir nicht Excel verwenden wollen, können wir das Gleiche mit Python machen.

Manche Händler sehen sich das Chart jedoch nicht einmal an. Sie arbeiten ausschließlich auf der Grundlage des Preises. Und wie lassen sich die Fundamentalindikatoren am besten analysieren? Genau das, lieber Leser: eine Excel-Tabelle. Aber nicht nur Excel, sondern auch andere Tools sind notwendig. In diesem Fall werden wir uns jedoch auf die Grundlagen konzentrieren, da wir zeigen wollen, wie man etwas anderes erstellt, das wir ein anderes Mal bauen werden.


Planung der Verbindung zwischen Excel und MetaTrader 5

Um eine Verbindung zwischen Excel und MetaTrader 5 herzustellen, benötigen wir eine effiziente und einfach zu implementierende Methode. Eine der besten Möglichkeiten, dies zu tun, ist die Verwendung von Sockets. Denn ein Socket ermöglicht es uns, Excel auf einem Computer und MetaTrader 5 auf einem anderen zu verwenden oder auch beide auf demselben Rechner laufen zu lassen. Wie diese Einstellungen gewählt werden, sollte vom Händler kontrolliert werden. Das heißt, wenn jemand einen Computer für MetaTrader 5 und einen anderen für Excel verwenden möchte, ist dies mit Sockets möglich. Und selbst wenn der Händler es vorzieht, beide Programme auf demselben Rechner laufen zu lassen, ist dies ohne Änderung des Kommunikationsprotokolls möglich. Kurz gesagt, Sockets sind ein sehr praktisches Werkzeug.

Okay, aber wie werden wir das machen? Dies ist eine Frage der persönlichen Entscheidung. Da wir jedoch demonstrieren, wie Python in Excel verwendet wird, und wir bereits wissen, dass Python-Skripte in MetaTrader 5 verwendet werden können, eröffnet dies viele Möglichkeiten. Das wichtigste ist die Erstellung eines Python-Servers, den wir sowohl in MetaTrader 5 als auch in Excel verwenden können. Aber bevor wir das tun, sollten wir es noch einmal überdenken. Mit Python können wir Werte direkt in die Tabellenkalkulation einlesen und schreiben. Wie wir bereits erläutert haben, sollte dies jedoch idealerweise über Sockets erfolgen. Um den Client zu betreiben, benötigen wir also entweder MetaTrader 5 oder Excel. An diesem Punkt ist klar, dass wir den Client in Excel programmieren müssen, wenn wir einen Server erstellen, der auf MetaTrader 5 läuft. Mit MQL5 ist es jedoch möglich, einen Client zu erstellen, der auf sehr einfache Weise direkt mit einem Expert Advisor arbeitet.

Ich denke, Sie verstehen, dass wir jetzt etwas programmieren müssen. Beginnen wir also mit etwas Einfachem – ohne komplizierte oder verwirrende Elemente. So entstand die Idee, einen Echo-Server einzurichten. Es wird ausschließlich zum Testen der Verbindung zwischen Excel und MetaTrader 5 verwendet, da dies die einfachste Form der Socket-Programmierung ist.


Erstellen eines Echoservers

Da es sich hierbei um den einfachsten Servercode handelt, sollten Sie nicht zu viel von ihm erwarten. Die Idee ist, zu testen, wie Excel mit einem in Python geschriebenen Server funktioniert. Schauen wir uns an, was zu tun ist. Zunächst erstellen wir den Servercode in Python. Sie ist unten zu sehen:

01. import socket
02. import xlwings as xw
03. 
04. def Echo():
05.         wb = xw.Book.caller()
06.         server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
07.         server.bind(("127.0.0.1", 27015))
08.         wb.sheets[0]['A1'].value = "Waiting connection..."
09.         server.listen(1)
10.         client, addr = server.accept()
11.         client.send("Wellcome to Server in Python\n\r".encode())
12.         wb.sheets[0]['A2'].value = str(f"Client connected by {addr}")
13.         while True:
14.             info = client.recv(512)
15.             if not info:
16.                 break
17.             client.send(b"Echo Server:" + info)
18.         wb.sheets[0]['A3'].value = "Client disconnected"
19.         client.close()

Python-Skript

„Aber ist das alles?“ Ja, das ist es – mit einer kleinen Anmerkung. Dieser Code ist für die Interaktion mit Excel und die Erstellung von Berichten über die Vorgänge auf dem Server vorgesehen. Wenn Sie bereits mit Python vertraut sind, wird Sie dieser Code wahrscheinlich nicht sonderlich beeindrucken. Aber wenn Sie keine Ahnung haben, was hier vor sich geht, lassen Sie uns einen Blick darauf werfen, was dieses Python-Skript tatsächlich tut.

In den Zeilen 01 und 02 teilen wir Python mit, welche Module wir benötigen. In Zeile 04 beginnen wir mit dem Aufbau des Verfahrens. Dies wird später in VBA verwendet. Aber zuerst wollen wir diesen Teil in Python verstehen. In Zeile 05 stellen wir im Wesentlichen eine Verbindung zu Excel her. In den Zeilen 08, 12 und 18 geben wir den Ausführungsstatus in die Excel-Tabelle ein, genau wie im vorherigen Thema.

Alle übrigen Zeilen sind Teil des Echoservers. Ein wichtiges Detail ist, dass dieser Server jeweils nur eine Verbindung zulässt. Das heißt, sobald ein Client eine Verbindung herstellt, ist der Server an diesen Client gebunden und akzeptiert keine weiteren Verbindungen. Wenn der Client die Verbindung schließt, wird der Server heruntergefahren. Das mag nicht sehr flexibel erscheinen, aber denken Sie daran – wir testen nur.

Ein weiteres, vielleicht noch wichtigeres Detail findet sich in Zeile 07. Beachten Sie den dort angegebenen Wert. Dieser Wert im IPv4-Format gibt an, dass nur Verbindungen von einem Client mit der angegebenen Adresse akzeptiert werden. In diesem Fall handelt es sich um den lokalen Host. Das bedeutet, dass sich sowohl der Client als auch der Server auf demselben Rechner befinden müssen. Ob physisch oder virtuell, wichtig ist, dass beide im selben „Boot“ sitzen.

Sie können diesen Wert in eine andere Adresse ändern, an der der Client erwartet wird – das kann sogar eine Website sein. Wenn Sie sie jedoch nicht kennen oder einfach Verbindungen von jeder beliebigen Adresse zulassen wollen, setzen Sie den Wert einfach auf „0.0.0.0“. In diesem Fall versteht Python (oder genauer gesagt, der Socket), dass jede Adresse für eine Client-Verbindung gültig ist. Denken Sie daran: Es ist immer nur ein Client gleichzeitig erlaubt.

Okay, aber was ist, wenn wir viel mehr Clients betreuen wollen? Was sollen wir tun? In diesem Fall müssten wir die Verbindungen in Threads behandeln – so wie wir es im C++-Code getan haben. In Python ist dies jedoch noch einfacher. Aber für unsere derzeitigen Zwecke ist das nicht notwendig. Für uns reicht es aus, dass dieser Server eine Verbindung annimmt und ein Echo zurückschickt.

Jetzt, da wir den Servercode in Python haben, können wir dasselbe tun wie im vorherigen Thema. „Das heißt, die Funktion RunPython verwenden, um den Server zu starten, richtig?“ Ganz genau. Aber lassen Sie uns eine kleine Änderung an dem VBA-Code aus dem vorherigen Thema vornehmen. Der VBA-Code wird wie folgt aussehen:

1. Private Sub Worksheet_Activate()
2.     MsgBox "Call Server..."
3.     RunPython "import Server_Echo; Server_Echo.Test()"
4. End Sub

VBA-Skript

Die Einfachheit dieses Codes ist bemerkenswert. Beachten Sie, dass wir in Zeile 03 nur den Dateinamen und den Namen der aufgerufenen Prozedur geändert haben. Das wichtigste Detail befindet sich in Zeile 02. Diese Zeile wird benötigt, damit wir sehen können, wann der Server erneut versucht wird, aufgerufen zu werden. Versuchen wir, zu einem anderen Blatt zu wechseln, um den Server zu aktivieren. Beim zweiten Versuch, es zu starten, zeigt Python eine Fehlerwarnung an. Aber das ist nicht wirklich ein Fehler – es ist nur so, dass der Code nicht überprüft, ob der Server bereits aktiv ist. Etwas Ähnliches würde passieren, wenn zwei Clients versuchen würden, in derselben Sitzung eine Verbindung herzustellen. Ich werde diese Experimente als Hausaufgaben aufgeben. Danach werden Sie die Grenzen dieses Bildungscodes verstehen und in der Lage sein, die notwendigen Anpassungen vorzunehmen.

Soll ich einen bereits festgelegten, voll funktionsfähigen Code bereitstellen, der als Echo-Server verwendet werden kann? Meiner Meinung nach wäre das nutzlos. Es ist viel besser, wenn Sie versuchen, diese Fragen selbst zu klären. Versuchen Sie, eine Lösung zu finden. Auf diese Weise bleiben sowohl das Wissen als auch das zugrundeliegende Konzept der Sockets viel besser haften. Diese Mängel zu beheben ist nicht schwer – ich habe bereits Hinweise gegeben, wie man sie beheben kann. Alles, was bleibt, ist zu verstehen, was passiert ist, und das Problem zu beseitigen.

So, dieser Teil ist fertig. Werfen wir nun einen Blick auf den MQL5-Client.


Wir haben den Client in MQL5 implementiert – Echo-Version

Genau wie auf der Serverseite könnten wir den Code auch komplett in Python implementieren. Aber wir bereiten uns auf das vor, was wir später tun werden. Vergessen wir also für einen Moment Python und konzentrieren wir uns auf MQL5. Der clientseitige Code ist unten dargestellt:

01. //+------------------------------------------------------------------+
02. #property service
03. #property copyright "Daniel Jose"
04. #property description "Echo Server Test Service."
05. #property description "Requires that the Python server is running in Excel."
06. #property version   "1.00"
07. //+------------------------------------------------------------------+
08. input string     user00 = "127.0.0.1";   //Address
09. input int        user01 = 27015;         //Port
10. //+------------------------------------------------------------------+
11. void OnStart()
12. {
13.     char buff[], resp[];
14.     int sock = SocketCreate(), ret;
15.     uint len;
16.     string szMsg;
17.     
18.     if (sock == INVALID_HANDLE)
19.     {
20.         Print("Unable to create socket. Error: ", GetLastError());
21.         return;
22.     }
23.     if (!SocketConnect(sock, user00, user01, 1000))
24.     {
25.         Print("Connection with the address [", user00, "] in port ", user01, " failed. Error code: ", GetLastError());
26.         SocketClose(sock);
27.         return;
28.     }
29.     while (!_StopFlag)
30.     {
31.         szMsg = TimeToString(TimeLocal(), TIME_DATE | TIME_SECONDS);
32.         len = StringToCharArray(szMsg, buff) - 1;
33.         Print("To Server: ", szMsg);
34.         if (SocketSend(sock, buff, len) != len)
35.         {
36.             Print("Error code: " , GetLastError());
37.             break;
38.         };
39.         szMsg = "";
40.         do
41.         {
42.             len = SocketIsReadable(sock);
43.             ret = SocketRead(sock, resp, len, 1000);
44.             if (ret > 0)
45.                 szMsg += CharArrayToString(resp, 0, ret);
46.         }while ((ret <= 0) && (!_StopFlag));
47.         Print("From Server: ", szMsg);
48.         Sleep(1000);
49.     }
50.     SocketSend(sock, buff, 0);
51.     SocketClose(sock);
52. }
53. //+------------------------------------------------------------------+

Dienste in MQL5

Bevor wir diesen Code besprechen, wollen wir uns noch ein kleines Detail ansehen, das konfiguriert werden muss, damit alles richtig funktioniert. Ja, wir müssen MetaTrader 5 mitteilen, dass wir das Öffnen eines Sockets erlauben. Zunächst ist es erforderlich, die Empfängeradresse anzugeben. Dies geschieht wie folgt:

Sobald dies geschehen ist, können wir sehen, wie der MQL5-Client-Code funktioniert. Das erste, was Ihnen wahrscheinlich auffallen wird, ist Zeile 02. In der Tat können wir einen Dienst verwenden, um den Socket zu implementieren. Der einzige Anwendungstyp, der keinen Socket implementieren kann, ist ein Indikator. Ansonsten haben wir völlige Freiheit bei der Verwendung anderer Anwendungsarten.

Dieser Code ähnelt wahrscheinlich dem, den wir in früheren Artikeln gesehen haben. Das ist in der Tat der Fall. Der gesamte socket-orientierte Code ist sehr ähnlich. Daher bleibt alles oben Gesagte gültig. Der einzige wirkliche Unterschied besteht in Zeile 50.

Nun fragen Sie sich vielleicht: Warum gibt es diese Linie? Um dies zu verstehen, müssen wir uns den Python-Servercode ansehen. Dort ist in Zeile 15 zu sehen, dass der Server sich abschaltet, wenn er falsche oder leere Informationen erhält. Genau das tut Zeile 50 – obwohl dies, ehrlich gesagt, nicht der beste Weg ist, um den Server und den Client darüber zu informieren, dass die Verbindung geschlossen wird. Aber für erste Zwecke und grundlegende Tests können wir vorerst damit leben. Während der Client mit dem Server verbunden ist, sehen wir in MetaTrader 5 also Folgendes:

Bitte beachten Sie, dass wir die Informationen in Echtzeit wiedergeben. Es ist einfach, aber es hilft zu verstehen, wie der Kommunikationsprozess abläuft. Wenn Sie sich das nächste Bild ansehen, das in Excel angezeigt wird, können Sie sich vorstellen, wovon wir sprechen.


Vor dem nächsten Schritt zu klärende Fragen

Ja. Aber das ist die einfachste der Grundlagen. Bevor wir jedoch zum nächsten Schritt übergehen und den vollständigen Code untersuchen, sei noch einmal daran erinnert, dass der Zweck dieses Codes rein pädagogisch ist. Ich möchte mir einen Moment Zeit nehmen, um darüber nachzudenken, wo wir derzeit stehen.

Für diejenigen, die bereits Erfahrung haben, wird dies keine Überraschung sein. Aber ich vermute, dass Sie noch nicht viel Erfahrung im Umgang mit Sockets haben. Um ehrlich zu sein, mache ich mir Sorgen, dass man zu Beginn des Lernens denken könnte, dass alles perfekt ist und dass das Befolgen eines Rezepts ausreicht, damit die Sockets richtig funktionieren.

Die Realität sieht jedoch nicht ganz so rosig aus. Nicht, dass es etwas Erschreckendes wäre – Sockets sollten keine Angst einflößen. In der Tat sind Sockets eines der einfachsten Kommunikationsmittel überhaupt. Ob es um die Kommunikation zwischen Programmen, zwischen verschiedenen Plattformen (d. h. Betriebssystemen) oder sogar zwischen verschiedenen Computern geht – z. B. bei der Verwendung eines Raspberry Pi neben einem PC – Sockets vereinfachen die Interaktion zwischen Elementen, die sich stark voneinander unterscheiden können. Wenn jedoch bestimmte Vorsichtsmaßnahmen nicht getroffen werden, werden Sie auf ernsthafte Probleme stoßen oder zumindest Schwierigkeiten haben, die unweigerlich auftretenden Hindernisse zu verstehen und zu überwinden.

Schauen wir uns noch einmal unsere kleine Implementierung an, die bereits funktioniert und den Informationsaustausch zwischen Excel und MetaTrader 5 ermöglicht. Im Gegensatz zu früheren Artikeln, in denen wir einen einzelnen Server in der Befehlszeile verwendet haben, können Sie hier versehentlich etwas ausprobieren, was wir normalerweise nicht absichtlich tun würden: zwei Server in derselben Umgebung zu betreiben. Das heißt, wir haben eine Systemkonsole mit einem bereits laufenden Server; wir öffnen eine weitere Konsole in derselben Betriebssystemsitzung und versuchen, denselben Server in dieser neuen Eingabeaufforderung zu starten. Wenn Sie nicht wissen, was in diesem Fall passieren wird, können Sie es gerne ausprobieren. Sie werden sehen, dass das irgendwie unmöglich ist. Hier zeigt sich ein Problem, das viele Menschen – selbst erfahrene – nicht vollständig verstehen, wenn es um Sockets geht (zumindest theoretisch).

Wenn Sie den Mini-Chat-Server von einer Eingabeaufforderung aus starten, können Sie denselben Server unter keinen Umständen von einer anderen Konsole aus innerhalb derselben Betriebssystemsitzung starten. Das ist eine Tatsache.

Denken Sie daran, dass der Mini-Chat-Server den Port 27015 verwendet, und der Echo-Server, der über Excel läuft, verwendet ebenfalls denselben Port. Daher haben wir hier theoretisch einen Interessenkonflikt. Man könnte annehmen, dass das Betriebssystem nicht zulässt, dass sich ein Server einmischt oder versucht, am selben Port mit demselben Protokoll zu lauschen. In diesem Fall verwenden wir das TCP-Protokoll. Wir könnten jedoch TCP auf einem Server und UDP auf dem anderen verwenden. In diesem Fall wäre es kein Problem, denselben Port zu verwenden.

Aber wenn wir denselben Port, dasselbe Protokoll und denselben Host verwenden, wird die Sache etwas komplizierter.

Ich möchte diesen Punkt betonen, damit diejenigen, die fortgeschrittene Nutzer von Sockets werden wollen, verstehen, dass die Arbeit mit ihnen bestimmte Vorsichtsmaßnahmen erfordert. Ich möchte, dass Sie – bevor Sie sehen, wie die Kommunikation zwischen Excel und MetaTrader 5 tatsächlich implementiert ist – verstehen, was passiert, wenn zwei verschiedene Server dieselben Ressourcen verwenden. In diesem Fall: das gleiche Protokoll, der gleiche Port und der gleiche Host. Um dies zu verstehen, öffnen Sie zunächst den Mini-Chat-Server und lassen Sie ihn auf eine Verbindung warten.

Öffnen Sie nun den Echoserver in Excel und lassen Sie ihn ebenfalls auf eine Verbindung warten. Das heißt, wir werden etwas haben, das dem hier ähnelt:

Nun stellt sich die Frage: Bevor Sie den Test durchführen, sollten Sie sich überlegen, welcher der Server die Verbindung vom Client annehmen wird. Mit anderen Worten: Wer wird anfangen, auf Client-Anfragen zu hören und zu reagieren? Denken Sie daran, dass wir in beiden Fällen einen sehr einfachen Code verwenden – keine Überprüfung, ob der Client mit dem Server übereinstimmt, keine Filterung, welche Art von Anfrage der Server erwarten sollte.

Ich bin mir nicht sicher, ob Sie wirklich verstehen, was ich zu erklären versuche. Der Punkt ist, dass diese beiden Server zwar unterschiedlich sind, aber dieselben Ressourcen verwenden: denselben Port, dasselbe Protokoll (TCP) und denselben Host. Genau das macht die Arbeit mit Sockets so schwierig. Wenn wir einen Server haben, der für bestimmte Anforderungen ausgelegt ist, und wir unwissentlich einen anderen Server mit denselben Ressourcen in Betrieb nehmen, können wir verhindern, dass die Clients die richtige Antwort auf ihre Anfragen erhalten.

Deshalb ist es wichtig zu verstehen, dass der Code, den ich hier zeige, NICHT vollständig ist. Sie ist ausschließlich für den persönlichen Gebrauch und für Bildungszwecke bestimmt. In der realen Welt unterliegt der Servercode viel strengeren Verwendungsregeln und muss robusten Entwurfsprinzipien entsprechen.

In vielen Fällen könnte man sagen, dass die Lösung einfach ist: „Ändern Sie einfach das Protokoll oder den Port – das wird den Konflikt zwischen den Servern auflösen.“ Das ist wahr. Selbst eine einfache Lösung wie die Platzierung eines Servers auf einem Rechner und eines anderen auf einem anderen Rechner würde das Problem lösen, selbst wenn beide denselben Port und dasselbe Protokoll verwenden.

Aber die Frage bleibt: Welcher der beiden Computer in der obigen Abbildung antwortet auf die Verbindungsanfrage eines Clients? Um dies herauszufinden, muss man nur wissen, welcher Server zuletzt gestartet wurde. Das heißt, wenn noch kein Client eine Verbindung hergestellt hat, wird der erste Client, der eine Verbindung versucht, mit dem zuletzt gestarteten Server verbunden. Sobald dieser Server angehalten wird, beginnt der unmittelbar davor gestartete Server mit der Bearbeitung neuer Client-Anfragen.

Ein wichtiger Hinweis: Wenn ein Client mit einem Server verbunden ist und dieser Server heruntergefahren wird, geht die Verbindung verloren, und der Client wird nicht automatisch wieder mit einem anderen Server verbunden. So funktioniert das nicht. Auf der Client-Seite ist eine neue Verbindungsanfrage erforderlich. Nur dann kann er eine Verbindung zu dem Server herstellen, der jetzt an diesem Port und mit diesem Protokoll lauscht – vorausgesetzt, Port, Protokoll und Host sind die gleichen wie die des gestoppten Servers.


Abschließende Gedanken

Obwohl der heutige Artikel nicht die tatsächliche Implementierung des Nachrichtenaustauschs zwischen Excel und MetaTrader 5 demonstrierte, wollte ich die Gelegenheit nutzen, um etwas zu erklären, das ich für sehr wichtig halte. Ich möchte nicht, dass Sie – vor allem, wenn Sie neu auf dem Gebiet der Sockets sind – denken, dass die Verwendung von Sockets das achte Weltwunder ist, und ich möchte auch nicht, dass Sie enttäuscht sind, wenn Sie feststellen, dass sie nicht auf magische Weise alle Ihre Probleme lösen.

Sockets gehören zu den komplexesten und gleichzeitig einfachsten Werkzeugen in der Computerwelt. Wenn Sie verstehen, wie sie funktionieren, können sie sehr hilfreich sein. Wenn Sie sie jedoch als trivial betrachten und annehmen, dass Sie sie nach Belieben verwenden können, ohne darüber nachzudenken oder sie wirklich zu verstehen, werden sie Ihnen ernsthafte Kopfschmerzen bereiten.

Zu Beginn dieser Artikelserie über den Replikations-/Modellierungsdienst haben wir die Verwendung von Sockets zum Aufbau des gesamten Replikations-/Modellierungssystems erwogen. Vom architektonischen Standpunkt aus wäre das viel einfacher gewesen – wir hätten nur die Tick-Daten direkt an den Port senden müssen, den MetaTrader 5 für die Verbindung mit dem echten Handelsserver verwendet. Nach weiterer Überlegung habe ich diese Idee jedoch verworfen. Warum? Denn das würde Techniken erfordern, deren praktische Anwendung ich lieber nicht erläutern möchte. Aber ich möchte, dass Sie darüber nachdenken. Wir sehen uns im nächsten Artikel, in dem wir untersuchen werden, wie Excel Daten an MetaTrader 5 senden kann und wie MetaTrader 5 auf Anfragen von Excel reagieren kann.

DateiBeschreibung
Experts\Expert Advisor.mq5
Demonstriert die Interaktion zwischen Chart Trade und dem Expert Advisor (erfordert Mausstudium).
Indicators\Chart Trade.mq5Erzeugt ein Fenster zum Konfigurieren des zu sendenden Auftrags (erfordert Mouse Study).
Indicators\Market Replay.mq5Erstellt Steuerelemente zur Interaktion mit dem Replikations-/Modellierungsdienst (erfordert Mouse Study).
Indicators\Mouse Study.mq5Ermöglicht die Interaktion zwischen den grafischen Steuerelementen und dem Nutzer (sowohl für die Wiedergabe als auch für den realen Markthandel erforderlich).
Servicios\Market Replay.mq5Erstellt und pflegt den Marktreplikations-/Modellierungsdienst (Kerndatei des gesamten Systems).
Код VS C++ Server.cppErstellt und pflegt einen in C++ entwickelten Socket-Server (Mini-Chat-Version).
Python Server.pyErstellt und pflegt einen Python-Socket für die Kommunikation zwischen MetaTrader 5 und Excel.
ScriptsCheckSocket.mq5Ermöglicht das Testen der Verbindung mit einem externen Socket.
Indicators\Mini Chat.mq5Implementiert einen Mini-Chat über einen Indikator (erfordert einen laufenden Server).
Experts\Mini Chat.mq5Implementiert einen Mini-Chat in einem Expert Advisor (erfordert einen laufenden Server).

Übersetzt aus dem Portugiesischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/pt/articles/12744

Beigefügte Dateien |
Anexo.zip (560.03 KB)
Algorithmische Handelsstrategien: KI und ihr Weg zu den goldenen Zinnen Algorithmische Handelsstrategien: KI und ihr Weg zu den goldenen Zinnen
In diesem Artikel wird ein Ansatz zur Erstellung von Handelsstrategien für Gold mithilfe von maschinellem Lernen vorgestellt. Betrachtet man den vorgeschlagenen Ansatz zur Analyse und Prognose von Zeitreihen aus verschiedenen Blickwinkeln, so lassen sich seine Vor- und Nachteile im Vergleich zu anderen Methoden zur Erstellung von Handelssystemen, die ausschließlich auf der Analyse und Prognose von Finanzzeitreihen beruhen, feststellen.
Von der Grundstufe bis zur Mittelstufe: Indikator (III) Von der Grundstufe bis zur Mittelstufe: Indikator (III)
In diesem Artikel wird untersucht, wie verschiedene grafische Darstellungsindikatoren wie DRAW_COLOR_LINE und DRAW_FILLING deklariert werden können. Außerdem werden wir natürlich lernen, wie man Charts mit mehreren Indikatoren auf einfache, praktische und schnelle Weise erstellt. Dies kann Ihre Sichtweise auf den MetaTrader 5 und den Markt als Ganzes wirklich verändern.
Eine alternative Log-datei mit der Verwendung der HTML und CSS Eine alternative Log-datei mit der Verwendung der HTML und CSS
In diesem Artikel werden wir eine sehr einfache, aber leistungsfähige Bibliothek zur Erstellung der HTML-Dateien schreiben, dabei lernen wir auch, wie man eine ihre Darstellung einstellen kann (nach seinem Geschmack) und sehen wir, wie man es leicht in seinem Expert Advisor oder Skript hinzufügen oder verwenden kann.
Quantitative Analyse von Trends: Sammeln von Statistiken in Python Quantitative Analyse von Trends: Sammeln von Statistiken in Python
Was ist eine quantitative Trendanalyse auf dem Devisenmarkt? Wir sammeln Statistiken über Trends, deren Ausmaß und Verteilung über das Währungspaar EURUSD. Wie Sie mit Hilfe der quantitativen Trendanalyse einen profitablen Trading Expert Advisor erstellen können.