English Русский 中文 Español Português
preview
Marktsimulation (Teil 16): Sockets (X)

Marktsimulation (Teil 16): Sockets (X)

MetaTrader 5Tester |
30 0
Daniel Jose
Daniel Jose

Einführung

Im vorangegangenen Artikel „Marktmodellierung (Teil 15): Sockets (IX)“ haben wir einen Teil des Servercodes, der in Python geschrieben wird, erklärt und vorgestellt. Dieser Code allein reicht jedoch nicht aus, um das Kommunikationssystem zwischen MetaTrader 5 und Excel zu nutzen. Wir benötigen zusätzlich zu den in jenem Artikel gezeigten Elementen noch weitere Bausteine. Viele würden vermutlich die gesamte Lösung direkt in diesen Python-Code integrieren – und das wäre durchaus legitim. Wenn wir das täten, würden wir uns auf ein völlig geschlossenes System beschränken. Mit anderen Worten, wir wären nicht in der Lage, das System so anzupassen, dass bestimmte Aktionen ausgeführt oder speziellere Skripte unterstützt werden können. Durch die Aufteilung des Systems in Teile können wir es jedoch flexibler umsetzen und die Stärken jeder Sprache nutzen. So können wir das Beste nutzen, was jede Sprache oder jedes Programm zu bieten hat.

Man könnte meinen, das sei töricht. Aber bedenken Sie, dass wir lediglich zeigen, dass der MetaTrader 5 auf völlig unerforschte Weise genutzt werden kann. So wie wir hier zeigen, wie man Excel verwendet, können wir auch jedes andere Programm verwenden. Darüber hinaus können wir mithilfe von Programmen, die ausschließlich für diesen Zweck entwickelt wurden, unsere eigene Methode entwickeln, um ein spezifisches analytisches und operatives Modell für eine bestimmte Art von Arbeit zu haben. Auf diese Weise würde MetaTrader 5 nur Aufträge zwischen dem, was wir erstellen, und dem Markt übermitteln, wodurch die gesamte Arbeit, die mit der Entwicklung einer Handelsplattform verbunden ist, vermieden wird.

Daher können Sie davon ausgehen, dass alle Erklärungen viel umfassender sind als das, was wir hier zeigen. Um solche Dinge zu tun, muss man viel wissen und studieren. Aber wenn Sie wirklich wollen, dass so etwas Realität wird, können Sie diese Artikel als kleines Beispiel dafür ansehen, was wir tun können. All dies wird jedoch erst dann eine wirkliche Bedeutung haben, wenn wir sehen, was noch implementiert werden muss, damit der Python-Server wirklich nützlich ist. In diesem Artikel werden wir also den Teil behandeln, der in VBA implementiert werden muss, also in einem Teil von Excel.


Erste Schritte in Excel

Der Code, der in VBA implementiert werden muss, ist nicht komplex. Vieles von dem, was hier gezeigt wird, können diejenigen, die Skripte in VBA schreiben, bereits. Es gibt jedoch einige Punkte, die mehr oder weniger schwierig sind, was für einige vielleicht kompliziert erscheinen mag. Wir möchten jedoch betonen, dass hier alles so einfach und lehrreich wie möglich gestaltet ist. Außerdem bleibt der im vorherigen Artikel enthaltene Code unverändert. Alles, was Sie tun müssen, ist, Elemente in VBA zu erstellen, um die erforderlichen Aufgaben oder Einstellungen durchzuführen, je nachdem, was Sie tun wollen.

Werfen wir zunächst einen Blick auf die Excel-Oberfläche. Sie ist unten zu sehen:

Wenn Sie mit Excel vertraut sind, werden Sie bemerkt haben, dass es sich bei den Schaltflächen in der obigen Abbildung um Shapes (Formobjekte) handelt. Sie ermöglichen es Ihnen, eine Oberfläche mit abgerundeten Ecken zu erstellen. Ihre Funktionsweise unterscheidet sich jedoch nicht wesentlich von den Standard-Steuerelementen, da sie mit einem Makro verknüpft werden können. Wenn Sie also auf eine dieser Shapes klicken, interpretiert Excel dies als Interaktion mit einer regulären Schaltfläche und führt den entsprechenden Aufruf aus, um das Makro auszuführen, das mit dem Klickereignis auf diesem Shape oder Schaltfläche verbunden ist.

Was uns in Wirklichkeit interessiert, wenn wir ausschließlich die im Bild gezeigte Schnittstelle betrachten, ist der Inhalt der Zellen. Beachten Sie, dass die Zelle B2 Informationen enthält, die anzeigen, dass der Server offline ist. In ähnlicher Weise enthält Zelle B5 eine andere Information, die in diesem Fall das Symbol angibt, für das wir Informationen vom MetaTrader 5 erhalten möchten. In diesem Moment beginnt die Idee Gestalt anzunehmen. Auch wenn wir noch nicht wissen, was in MQL5 programmiert werden wird, können wir uns bereits ein Bild davon machen, was wir brauchen und was wir tun können.

Erinnern Sie sich, dass wir bei der Erklärung des Server-Codes erwähnt haben, dass er Informationen von einer Zelle ausliest und an den MetaTrader 5 sendet, um einige Daten zu erhalten? An genau dieser Zelle mit dem Wert WDON23 müssen wir ansetzen. Wenn wir jedoch die Informationen in dieser Zelle manuell ändern wollen, müssen wir zuerst den Server anhalten, den Wert in Zelle B5 ändern und dann den Server wieder starten. Danach erhält der MetaTrader 5 die neuen Parameter, um sie zu analysieren.

Solche Änderungen sind recht einfach und können jederzeit vorgenommen werden, ohne dass der Server etwas davon erfährt, da alles zwischen MetaTrader 5 und Excel stattfindet. Aber wie bereits erwähnt, und ich wiederhole es noch einmal, geht es hier darum, didaktisch zu sein. Nichts hindert uns jedoch daran, unser eigenes Protokoll zu erstellen, um mehr Informationen zu erhalten oder auf andere Symbole zuzugreifen. Dazu müssen die Daten lediglich in eine bestimmte Excel-Zelle eingegeben werden. Aber Sie könnten sich fragen: „Warum gerade diese Zelle? Warum nicht einen anderen nutzen?“ Der Punkt ist, dass der Servercode einen Index verwendet, und je nach diesem Index wird die Zelle B5 verwendet. In diesem Artikel wird jedoch gezeigt, wie Sie eine andere Zelle verwenden können, ohne den im vorherigen Artikel gezeigten serverseitigen Code ändern zu müssen.

Wenn Sie das verstanden haben, können wir zum nächsten Schritt übergehen. Schauen wir uns nun an, wie alles in VBA gemacht wird.


Beginnen wir mit der Arbeit an dem VBA-Code

Um etwas wirklich Nützliches zu erreichen und sicherzustellen, dass der Nutzer nicht merkt, was hinter den Kulissen vor sich geht, müssen wir etwas Arbeit in VBA leisten. Daher muss als erstes ein Modul erstellt werden. Der Zweck dieses Moduls ist es, den gesamten Code zu beherbergen, der implementiert werden muss und der nirgendwo anders hinpasst. Das erste, was als Code zu implementieren ist, sehen Sie gleich unten:

01. Private Const szMSG_START_SERVER As String = "Start Server"
02. Private Const szMSG_STOP_SERVER As String = "Stop Server"
03. Private Const szSERVER_SHUTDOWN As String = """/Force Server ShutDown"""
04. Private Const szMSG_MT5_OFFLINE As String = "MetaTrader 5 is offline."
05. Private Const szMSG_MT5_ONLINE As String = "MetaTrader 5 is online."
06. Private Const szMSG_MT5_BUY As String = """Buy in Market >"""
07. Private Const szMSG_MT5_SELL As String = """Sell in Market >"""
08. Private Const iPort As Integer = 9090
09. Private gl_ServerInExec As Boolean
10. Public Const CELL_MT5 As String = "$B$4"
11. 
12. Public Sub SwapStatusMT5()
13.     Dim c1, c2, c3 As Long
14.     
15.     If Sheets("System").Range(CELL_MT5).Value = szMSG_MT5_ONLINE Then
16.         c1 = RGB(217, 238, 16)
17.         c2 = RGB(51, 153, 102)
18.         c3 = RGB(255, 80, 80)
19.     Else
20.         c1 = RGB(132, 130, 122)
21.         c2 = c1
22.         c3 = c1
23.     End If
24.     With Sheets("System")
25.         .Shapes("Btn_MT5").Fill.ForeColor.RGB = c1
26.         .Shapes("Btn_BUY").Fill.ForeColor.RGB = c2
27.         .Shapes("Btn_SELL").Fill.ForeColor.RGB = c3
28.     End With
29. End Sub
30. 
31. Private Sub SwapMsgBtnServer(text As String)
32.     Dim c As Long
33.     If text = szMSG_START_SERVER Then
34.         c = RGB(213, 87, 99)
35.         gl_ServerInExec = False
36.     Else
37.         c = RGB(84, 130, 53)
38.         gl_ServerInExec = True
39.         SwapStatusMT5
40.     End If
41.     With Sheets("System").Shapes("Btn_Server")
42.         .TextFrame2.TextRange.text = text
43.         .Fill.ForeColor.RGB = c
44.     End With
45. End Sub
46. 
47. Public Sub BtnServer_Click()
48.     If gl_ServerInExec Then
49.         StopServer
50.     Else
51.         InitServer
52.     End If
53. End Sub
54. 
55. Public Sub InitServer()
56.     Dim szScript, szCmd As String
57.     
58.     szScript = Chr$(34) & Application.ActiveWorkbook.Path & "\Server.py" & Chr$(34)
59.     szCmd = " ""127.0.0.1""" & Str(iPort) & " ""System"" ""B$2"""
60.     VBA.CreateObject("WScript.shell").Run """Python""" & szScript & szCmd, vbHide
61.     SwapMsgBtnServer szMSG_STOP_SERVER
62. End Sub
63. 
64. Public Sub StopServer()
65.     szPath = Chr$(34) + Application.ActiveWorkbook.Path + "\MsgFromExcel.py" + Chr$(34)
66.     VBA.CreateObject("WScript.shell").Run """Python""" & szPath & " " & Str(iPort) & " " & szSERVER_SHUTDOWN, vbHide, True
67.     SwapMsgBtnServer szMSG_START_SERVER
68. End Sub
69. 
70. Public Sub MT5_BuyInMarket()
71.     szPath = Chr$(34) + Application.ActiveWorkbook.Path + "\MsgFromExcel.py" + Chr$(34)
72.     VBA.CreateObject("WScript.shell").Run """Python""" & szPath & " " & Str(iPort) & " " & szMSG_MT5_BUY, vbHide, True
73. End Sub
74. 
75. Public Sub MT5_SellInMarket()
76.     szPath = Chr$(34) + Application.ActiveWorkbook.Path + "\MsgFromExcel.py" + Chr$(34)
77.     VBA.CreateObject("WScript.shell").Run """Python""" & szPath & " " & Str(iPort) & " " & szMSG_MT5_SELL, vbHide, True
78. End Sub

Der VBA-Quellcode

Dieses Modul enthält alles, was wir in Zukunft brauchen werden. Wie Sie sehen können, werden hier mehrere Konstanten und mehrere Prozeduren deklariert. Die Konstanten helfen uns, den Code schneller anzupassen. Jede Prozedur hat ihren eigenen Zweck, und alle sind wichtig für den Gesamtcode. Achten Sie auf die Details, um dieses Modul in VBA korrekt zu ändern.

Schauen wir uns zunächst Zeile 55 an. Wir werden den Prozess nicht in der üblichen Reihenfolge ablaufen lassen. Wir werden die Funktionen und Prozeduren anhand ihrer Bedeutung für die Verwaltung des Servers durch Excel in Python untersuchen. In Zeile 55 gibt es eine Prozedur, die den Server startet. Beachten Sie, dass sich das Python-Skript in demselben Ordner wie die Excel-Datei befinden muss. Das liegt daran, dass wir in Zeile 58 VBA verwenden, um das Verzeichnis zu erfassen, in dem sich die Excel-Datei befindet. Auf diese Weise wird der vollständige Pfad zusammen mit dem Namen des Python-Skripts erstellt.

In Zeile 59 deklarieren wir nun die Parameter, die an das Skript übergeben werden sollen. Um diese Zeile richtig zu verstehen, gehen Sie zurück zum vorherigen Artikel und überprüfen Sie die richtige Reihenfolge der Parameter, die das Skript erhalten sollte. In Zeile 60 geschieht der eigentliche Clou: In dieser Zeile wird das Python-Skript aufgerufen und ausgeführt. Doch dann tritt das Hauptproblem auf: Diese Zeile wartet nicht auf die Rückkehr des Codes, d. h. VBA ruft das Serverskript auf und führt es aus, als wäre es ein eigener Thread. Bitte beachten Sie, dass es sich hierbei nicht um eine wörtliche Aussage, sondern um eine Feststellung handelt. Im Task-Manager sehen Sie, dass das Python-Skript im selben Block wie die Excel-Anwendung angezeigt wird. Dies ist auf dem folgenden Bild zu sehen:

Dieses Verhalten bedeutet, dass beim Schließen von Excel auch das Python-Skript geschlossen wird. Wenn wir im Task-Manager feststellen, dass sich das Skript außerhalb des Excel-Anwendungsblocks befindet, wird das Skript beim Schließen von Excel weiter ausgeführt und müsste manuell geschlossen werden. Am Ende der Prozedur, in Zeile 61, rufen wir die Prozedur aus Zeile 31 auf. In dieser Prozedur nehmen wir Änderungen an dem Objekt vor, das die Schaltfläche zum Starten und Stoppen des Servers darstellt. Da diese Prozedur recht einfach ist und direkt mit der Form zusammenhängt, gibt es dazu nichts weiter zu sagen.

Beachten Sie jedoch Folgendes: Weder die Prozedur in Zeile 31 noch die Prozedur in Zeile 55 ist direkt mit der Form verbunden, die den Server startet oder stoppt. Tatsächlich wird diese Aufgabe von einer anderen Prozedur in Zeile 47 übernommen. Daher führt die Schaltfläche „Server starten/stoppen“ die Prozedur „BtnServer_Click“ aus. Auf diese Weise haben wir eine einfache und effektive Kontrolle darüber, was in Excel angezeigt wird. Diese Erklärung war jedoch nur der Anfang; es gibt noch vier Prozeduren innerhalb dieses Moduls zu verstehen.

Fahren wir nun damit fort, zu verstehen, womit die Form der Schaltfläche zur Serversteuerung verknüpft ist. Beachten Sie, dass in der Prozedur BtnServer_Click neben dem Aufruf des Serverstarts auch ein Aufruf zum Anhalten des Servers enthalten ist. Dies findet sich in Zeile 49 und verweist auf Zeile 64. In dieser StopServer-Prozedur gehen wir ein wenig anders vor. Warum ist das so? Denn wenn wir die Interaktion zwischen Excel und Python untersuchen, sehen wir, dass es Möglichkeiten gibt, Python-Prozeduren oder in VBA deklarierte Variablen zu lesen, auszuführen oder zu schreiben. Wir könnten dann einfach in eine VBA-Variable schreiben, die angibt, dass der Server beendet werden soll. Wenn das Python-Skript also auf diese Variable zugreift, weiß es, dass der Server gestoppt werden muss.

Genauso wie wir den Server auf demselben Rechner wie Excel platzieren können, können wir dies auch tun, indem wir beide Server auf verschiedenen Rechnern platzieren. Die Kommunikation würde dann über Sockets erfolgen. Daher wenden wir eine etwas andere Prozedur an. In Zeile 65 geben wir an, wo sich das Python-Skript befindet, das eine Nachricht an den Server senden wird. Diese Nachricht ist eigentlich ein Befehl. In Zeile 66 stehen die Informationen über den Befehl, der an den Server gesendet werden soll. Kümmern Sie sich vorerst nicht um dieses Python-Skript; wir werden es später, gegen Ende des Artikels, genauer unter die Lupe nehmen.

Die nächste Prozedur in Zeile 70 dient dazu, eine Anfrage an MetaTrader 5 zu senden, ebenso wie die Prozedur in Zeile 75. Beide sollten mit den entsprechenden Schaltflächen verknüpft werden, sodass der Nutzer direkt von Excel aus mit ihnen interagieren kann. Aber wie Sie bemerkt haben, verwenden sowohl die StopServer-Prozedur als auch die Prozeduren MT5_BuyInMarket und MT5_SellInMarket das gleiche Python-Skript. Im Gegensatz zum StopServer, der bereits eine voll funktionsfähige Prozedur ist, sind die Prozeduren MT5_BuyInMarket und MT5_SellInMarket jedoch noch nicht fertiggestellt. Der Grund dafür ist, dass diese Prozeduren ausschließlich zu Lehrzwecken durchgeführt werden, d.h. sie tun absolut nichts, außer eine Meldung im MetaTrader 5-Terminal anzuzeigen, aber das werden wir im nächsten Artikel besprechen.

Damit diese beiden Prozeduren funktionieren, ist es notwendig, ein Kommunikationsprotokoll zu implementieren, das MetaTrader 5 über das Symbol informiert und Aspekte wie Stop-Loss und Take-Profit der Position definiert. Ich denke, dass dies für die meisten Enthusiasten eine sehr interessante Aufgabe ist und sogar zu einer persönlichen Herausforderung wird. Aber die Umsetzung ist überhaupt nicht schwierig. Man müsste nur VBA anweisen, wie man eine Nachricht erstellt, die MetaTrader 5 interpretieren kann, sodass man direkt von dieser Plattform aus Trades ausführen kann. Im nächsten Artikel werden wir diesen Prozess ausführlicher behandeln. Machen Sie sich vorerst keine Gedanken darüber.

Um dieses Modul zu vervollständigen, gibt es eine weitere Prozedur in Zeile 12. Mit dieser Prozedur soll sichergestellt werden, dass die Excel-Interaktions- und Steuerungsschaltflächen dem aktuellen Stand von MetaTrader 5 entsprechen. Mit anderen Worten: Wenn MetaTrader 5 offline ist, sind die Interaktionsschaltflächen ausgegraut, und wenn er online ist, sind sie farbig. Auf diese Weise weiß der Nutzer, wann er Befehle an den MetaTrader 5 senden kann.

Damit haben wir den VBA-Teil des Moduls abgeschlossen. Das bedeutet aber nicht, dass wir mit der Programmierung der wichtigsten Elemente in Excel fertig sind. Wir müssen noch einiges tun, um die Unterstützung und Interaktion zu verbessern. Die nächste Aktion, die durchgeführt werden muss, ist unten dargestellt:

Und um jeden Zweifel darüber auszuräumen, welcher Code verwendet werden muss, wird derselbe Code wie in der Abbildung direkt darunter angegeben:

1. Private Sub Worksheet_Change(ByVal Target As Range)
2.     If Target.Address = CELL_MT5 Then
3.         SwapStatusMT5
4.     End If
5. End Sub

Der VBA-Quellcode

Aber was genau macht der Code? Wenn Sie mit der VBA-Programmierung noch nicht vertraut sind und vor allem, wenn Sie nicht gewohnt sind, Code für Excel zu erstellen, könnte dies etwas verwirrend sein. Dieser Code konfiguriert jedoch lediglich den Status der Schaltflächen, die Befehle an den MetaTrader 5 senden. Zu diesem Zweck wird der vom Server ermittelte Wert der Zelle ständig überprüft. Wenn sich der Wert dieser Zelle aus irgendeinem Grund ändert, wird die dritte Zeile ausgelöst. Dadurch ändern sich die Farben der Schaltflächen automatisch, je nachdem, in welchem Zustand sich der MetaTrader 5 im Verhältnis zum Server befindet.

So müssen weder Sie noch der Endnutzer den Inhalt einer bestimmten Zelle lesen; Sie können einfach anhand der Farbe der Schaltflächen erkennen, ob der MetaTrader 5 online oder offline ist. Ein wichtiger Hinweis, vor allem für diejenigen, die nicht wissen, wie man solche Aufgaben in Excel ausführt: Schauen Sie sich das Bild oben an, um zu verstehen, auf welchem Blatt der Code platziert werden muss, damit er seine Aufgabe erfüllt. Wenn Sie denselben Code auf dem falschen Blatt platzieren, erhalten wir nicht das erwartete Ergebnis. Achten Sie also auf dieses Detail.

Wie bereits erwähnt, gibt es noch eine weitere Aufgabe, die in Angriff genommen werden muss. Genauso wie wir darauf achten mussten, wo wir den Code platzieren, muss er auch hier an einer bestimmten Stelle platziert werden. Daher müssen Sie den folgenden Code einfügen, wie unten gezeigt:

Wenn Sie sich nicht sicher sind, was genau dort platziert werden muss, sehen Sie sich denselben Code wie in der Abbildung oben an.

1. Private Sub Workbook_BeforeClose(Cancel As Boolean)
2.     ThisWorkbook.Save
3.     StopServer
4. End Sub
5. 
6. Private Sub Workbook_Open()
7.     InitServer
8. End Sub

Der VBA-Quellcode

Diese Option ist sogar noch einfacher, da wir nur zwei recht unkomplizierte Ereignisprozeduren haben. Die erste, Workbook_BeforeClose, wird aufgerufen, wenn der Nutzer das Schließen der Excel-Arbeitsmappe anfordert. Wenn dies geschieht, werden zwei Aktionen durchgeführt. Die erste ist in Zeile 02 zu sehen, wo Excel angewiesen wird, die Arbeitsmappe zu speichern. Selbst wenn wir Änderungen an der Arbeitsmappe vorgenommen haben, werden wir von Excel nicht aufgefordert, das Speichern zu bestätigen, da die Mappe beim Schließen des Programms automatisch gespeichert wird. Die zweite Aktion ist in Zeile 03 zu sehen, wo wir die im Modul gezeigte Prozedur aufrufen. Unser Ziel ist es, den Server abzuschalten.

Also gut, in Zeile 06 haben wir etwas noch Einfacheres. In dieser Zeile mit dem Workbook_Open-Ereignishandler rufen wir in Zeile 07 einfach die Modulprozedur auf, die den Server startet. Dieser Aufruf von Workbook_Open wird ausgeführt, wenn die Arbeitsmappe in Excel geöffnet wird. Sobald Sie oder der Endnutzer ihn öffnen, wird automatisch der Server gestartet, der darauf wartet, Daten vom MetaTrader 5 zu empfangen.

All dies funktioniert perfekt. Sie können einen Python-Server mit genau demselben Code wie im vorherigen Artikel erstellen, ein einfaches Arbeitsblatt erstellen, einige Schaltflächen oder Shapes für die Interaktion hinzufügen und natürlich sicherstellen, dass die Namen der Shapes, die im VBA-Code verwendet werden sollen, genau gleich sind. Danach können Sie das System testen. Sie werden sehen, dass Sie den Server ohne Probleme initialisieren können. Aber etwas fehlt noch: der Code für Excel zur Interaktion mit dem Python-Server.

Wenn Sie die gesamte Erklärung verfolgt haben, werden Sie bemerkt haben, dass wir ein weiteres Stück Python-Code benötigen. Diese Datei sollte MsgFromExcel.py heißen. Um diesen Teil des Excel- und VBA-Kurses zu beenden, müssen wir uns das letzte Skript ansehen. Verzweifeln Sie nicht und denken Sie nicht, dass Sie nichts verstehen; lassen Sie uns einen Moment innehalten und nachdenken.

Wenn Excel gestartet wird, wird die Prozedur Workbook_Open aufgerufen. Dadurch wird die Prozedur InitServer aufgerufen, die im VBA-Modul vorhanden ist. Diese Prozedur sucht die Datei Server.py im gleichen Ordner wie die Arbeitsmappe. Dies ist das Python-Serverskript, das im vorherigen Artikel zu sehen war. Sobald dieser Teil abgeschlossen ist, reagiert Excel wie gewohnt auf Nutzerbefehle und -aktionen.

Wenn wir versuchen, das System zu starten und der Server nicht startet, gehen wir zurück und wiederholen die Schritte, die wir gerade erklärt haben. Dies liegt daran, dass der Server automatisch starten sollte. Wenn dies nicht der Fall ist, müssen Sie den Fehler in Ihrem Code finden, bevor Sie fortfahren.

Der nächste Schritt ist das Herunterfahren des Servers. Dies geschieht, wenn wir das Schließen der Excel-Anwendung anfordern oder eine Aktion ausführen, die die StopServer-Prozedur aufruft. Wenn eine dieser Aktionen durchgeführt wird, wird Zeile 65 des Moduls ausgeführt. Bis jetzt haben Sie den Code, der in diesem Moment läuft, noch nicht gesehen. Der Übersicht halber behandeln wir das im nächsten Abschnitt.


Der Client für Excel

Ja, das ist genau das, was Sie gelesen haben. Das Skript MsgFromExcel.py ist eigentlich ein Client und interagiert mit dem Server, der ebenfalls geöffnet wurde und in der Excel-Sitzung aktiv bleibt. Der Einfachheit halber und zum besseren Verständnis wird der Code der Datei nachstehend wiedergegeben:

01. import socket as sock
02. import sys
03. 
04. if sys.argv[2]:
05.     conn = sock.socket(sock.AF_INET, sock.SOCK_STREAM)
06.     try:
07.         msg = '<mt5 with excel>:' + sys.argv[2]
08.         conn.connect(('localhost', int(sys.argv[1])))
09.         conn.send(msg.encode())
10.         conn.close()
11.     except:
12.         sys.exit(1)

Python-Quellcode

Wenn Sie etwas Erfahrung mit Python haben, dann haben Sie bei der Analyse dieses Codes wahrscheinlich schon etwas bemerkt und folgendes gedacht: „Aber dies ist ein Client, der sich öffnet, etwas sendet und dann die Verbindung wieder schließt. Wozu soll das gut sein?“ Der obige Code ist ein TCP-Client in Python, der genau das tut. Er wird geöffnet, sendet einige Informationen an den Server und schließt dann die Verbindung.

Der Grund dafür ist, dass dieser Client nicht die ganze Zeit mit dem Server verbunden sein muss. Im Gegensatz zum Client in MQL5, der auf MetaTrader 5 läuft, ist er nur dazu gedacht, einen Befehl an den Server zu senden, entweder um etwas auszuführen oder um Informationen zu senden. Sie können also sehen, wie derselbe Code von den Prozeduren StopServer, MT5_BuyInMarket und MT5_SellInMarket aufgerufen wird. Die Idee ist, damit eine Aktion auszuführen, die sich nicht ohne Weiteres auf dieselbe Weise umsetzen ließe, wenn Server und Excel auf verschiedenen Rechnern liefen.

Daher akzeptiert dieses Skript zwei Parameter. Der erste gibt den zu verwendenden Port an, und der zweite ist der Befehl oder die Nachricht, die der Server ausführt oder an MetaTrader 5 weitergibt. Sobald dies geschehen ist, kann die Verbindung, die dieser Client gerade geöffnet hat, geschlossen werden.

An dieser Stelle möchte ich einige Dinge anmerken, die vielleicht wichtig sind und sogar Zweifel aufkommen lassen. Wenn Sie gerade erst mit dem Programmieren in Python oder VBA beginnen und diese Materialien interessant finden, möchte ich Sie darauf hinweisen, dass dies nur ein didaktischer Ansatz ist, den ich gefunden habe. Vieles von dem, was hier getan wurde, kann noch verbessert werden, und zwar erheblich. Vor allem, weil wir nicht viele Kontrollen in den Code eingebaut haben. Ich möchte jedoch betonen, dass dieser spezielle Client, der in Python erstellt wurde, leicht in VBA-Code umgewandelt werden kann.

Daher wird das einzige Modul, das in Python sein wird, dasjenige sein, das den Server erstellt. Da der Python-Code jedoch wesentlich einfacher und übersichtlicher ist als die Implementierung desselben Clients in VBA, haben wir beschlossen, den Code in Python zu belassen. Wenn Sie jedoch versuchen wollen, das Gleiche mit VBA zu tun, sollten Sie vorsichtig sein, denn der Prozess, das Gleiche wie hier, aber mit VBA, zu tun, erweist sich als komplexer.


Abschließende Gedanken

In diesem Artikel haben wir jedoch noch nicht erklärt, wie die Kommunikation zwischen Excel und MetaTrader 5 hergestellt wird. Wir sind kurz davor, diese Herausforderung abzuschließen. Bevor wir jedoch beginnen, möchte ich, dass Sie versuchen, diese beiden Artikel zu verstehen – diesen und den vorherigen. Auf diese Weise werden Sie den nächsten Artikel wirklich verstehen, in dem ich ausschließlich den Teil behandeln werde, der mit der MQL5-Programmierung zusammenhängt. Aber ich werde auch versuchen, es verständlich zu machen. Wenn Sie diese beiden letzten Artikel nicht verstehen, wird es Ihnen schwer fallen, den nächsten zu verstehen, denn der Stoff häuft sich. Je mehr Dinge es zu tun gibt, desto mehr muss man schaffen und verstehen, um das Ziel zu erreichen.

Ich hoffe, dass Sie zu dem Zeitpunkt, zu dem Sie versuchen werden, das zu lesen und in die Praxis umzusetzen, was im nächsten Artikel besprochen wird, bereits verstanden haben und in der Lage sein werden, das bisher Gesehene anzuwenden. Wenn Sie Zweifel haben, empfehle ich Ihnen, die vorangegangenen Artikel zu lesen, denn, wie wir eingangs sagten, ist das Thema Sockets recht umfangreich und hat viele Details. Einige von ihnen sind einfacher, andere sind recht komplex. Dennoch ist es sehr wichtig, dieses Thema zu verstehen, damit Sie wissen, was in Zukunft auf Sie zukommen kann.

Und obwohl Sie vielleicht denken, dass das Thema Sockets nichts mit dem Replay-/Simulationssystem zu tun hat, möchte ich Sie bitten, diese Idee zu überdenken. Wenn Sie jemals ein Replay-/Simulationssystem erstellen wollen, das nicht von etwas abhängt, das innerhalb von MetaTrader 5 läuft, wie es bisher der Fall war, müssen Sie verstehen, wie Sockets funktionieren. Auf diese Weise können Sie alles, was Sie brauchen, simulieren – nicht so, wie ich es gezeigt habe, sondern indem Sie einen Handelsserver simulieren und MetaTrader 5 einfach sagen, dass er sich mit diesem Server verbinden soll, den Sie selbst emulieren werden.

Da wir aber ein anderes Ziel verfolgen, werden wir diese Fragen ein anderes Mal diskutieren. Wir sehen uns im nächsten Artikel!

DateiBeschreibung
Experts\Expert Advisor.mq5
Demonstriert die Interaktion zwischen Chart Trade und dem Expert Advisor (erfordert Mouse Study für die Interaktion).
Indicators\Chart Trade.mq5Erzeugt ein Fenster zum Konfigurieren des zu versendenden Auftrags (erfordert Mouse Study zur Interaktion).
Indicators\Market Replay.mq5Erstellt Steuerelemente für die Interaktion mit dem Wiedergabe-/Simulationsdienst (erfordert Mouse Study für die Interaktion).
Indicators\Mouse Study.mq5Ermöglicht die Interaktion zwischen den grafischen Bedienelementen und dem Nutzer (erforderlich sowohl für das Wiedergabesystem als auch für den realen Marktbetrieb).
Services\Market Replay.mq5Erstellt und verwaltet den Marktwiedergabe-/Simulationsdienst (Hauptdatei des gesamten Systems).
VS Code C++ Server.cppErstellt und verwaltet einen in C++ entwickelten Socket-Server (Mini-Chat-Version).
Python Code Server.pyErstellt und verwaltet 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 als Indikator (setzt den Server voraus).
Experts\Mini Chat.mq5Implementiert einen Mini-Chat als Expert Advisor (setzt den Server voraus).

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

Beigefügte Dateien |
Anexo.zip (560.03 KB)
Neuronale Netze im Trading: Duales Clustering multivariater Zeitreihen (DUET) Neuronale Netze im Trading: Duales Clustering multivariater Zeitreihen (DUET)
Das DUET-Framework bietet einen innovativen Ansatz für die Zeitreihenanalyse, der temporales und kanalbasiertes Clustering kombiniert, um verborgene Muster in den analysierten Daten aufzudecken. Auf diese Weise können sich die Modelle an Veränderungen im Laufe der Zeit anpassen und die Qualität der Vorhersagen durch Reduktion von Rauschen verbessern.
Risikomanagement (Teil 5): Integration des Risikomanagementsystems in einen Expert Advisor Risikomanagement (Teil 5): Integration des Risikomanagementsystems in einen Expert Advisor
In diesem Artikel werden wir das in früheren Veröffentlichungen entwickelte Risikomanagementsystem implementieren und den in anderen Artikeln beschriebenen Order-Block-Indikator hinzufügen. Darüber hinaus werden wir einen Backtest durchführen, um die Ergebnisse mit dem aktivierten Risikomanagementsystem zu vergleichen und die Auswirkungen des dynamischen Risikos zu bewerten.
Prognose von Renko-Bars mit CatBoost AI Prognose von Renko-Bars mit CatBoost AI
Wie verwendet man Renko-Bars mit KI? Schauen wir uns den Renko-Handel im Forex-Markt mit einer Prognosegenauigkeit von bis zu 59,27 % an. Wir werden die Vorteile von Renko-Bars zum Herausfiltern von Marktrauschen untersuchen, erfahren, warum das Volumen wichtiger ist als die Kursmuster, und wie man die optimale Renko-Blockgröße für EURUSD festlegt. Dies ist eine Schritt-für-Schritt-Anleitung zur Integration von CatBoost, Python und MetaTrader 5, um Ihr eigenes Renko Forex-Prognosesystem zu erstellen. Es ist ideal für Händler, die über die traditionelle technische Analyse hinausgehen wollen.
Neuronale Netze im Handel: Integration der Chaostheorie in die Zeitreihenprognose (letzter Teil) Neuronale Netze im Handel: Integration der Chaostheorie in die Zeitreihenprognose (letzter Teil)
Wir fahren fort, die von den Autoren des Attraos-Frameworks vorgeschlagenen Methoden in Handelsmodelle zu integrieren. Ich möchte Sie daran erinnern, dass dieses Framework Konzepte der Chaostheorie verwendet, um Probleme der Zeitreihenprognose zu lösen, indem es sie als Projektionen mehrdimensionaler chaotischer dynamischer Systeme interpretiert.