Marktsimulation (Teil 15): Sockets (IX)
Einführung
Im vorangegangenen Artikel „Marktsimulation (Teil 14): Sockets (VIII)“ haben wir untersucht, wie bestimmte Dinge mit Python erledigt werden können, ohne auf Pakete oder Werkzeuge von Drittanbietern angewiesen zu sein. Ich möchte Sie nicht davon abhalten, Pakete zu verwenden, die bei der Bewältigung von Aufgaben in Python helfen, aber der Zweck dieser Demonstrationen ist es, Sie zu ermutigen, Konzepte mit größerem Interesse zu studieren. Es ergibt keinen Sinn, sich auf externe Pakete oder Lösungen zu verlassen, wenn wir alles mit dem machen können, was unsere Lieblingssprache erlaubt.
Ich glaube, dass es mir mit diesem Artikel gelungen ist, Ihre Neugierde auf bestimmte Dinge zu wecken, deren Funktionsweise viele Menschen nicht verstehen. Ich denke, dass die meisten Menschen, wenn sie einen Kurs besucht oder Standardmaterialien zu diesem Thema studiert haben, noch nie von einigen Technologien gehört haben. Ein Beispiel ist die COM-Technologie, die wir im letzten Artikel kurz erwähnt haben. Wenn Sie jedoch wissen, wie Sie diese Methoden anwenden können, werden Sie in allen Phasen der Programmierung davon profitieren.
In diesem Artikel erläutern wir eine der möglichen Lösungen für das, was wir versucht haben zu demonstrieren, nämlich wie man es einem Excel-Nutzer ermöglicht, eine Aktion in MetaTrader 5 auszuführen, ohne Aufträge zu senden oder Positionen zu öffnen oder zu schließen. Die Idee ist, dass der Nutzer Excel verwendet, um eine fundamentale Analyse eines bestimmten Symbols durchzuführen. Und allein mit Excel lässt sich ein in MetaTrader 5 laufender Expert Advisor anweisen, eine bestimmte Position zu eröffnen oder zu schließen.
Bisher war alles, was gezeigt und demonstriert wurde, ausschließlich auf die Datenübertragung ausgerichtet, so als ob wir einen Chat nutzen würden. Ich denke jedoch, dass es für diejenigen unter Ihnen, die weniger Erfahrung mit Sockets haben, einfacher war, die Kernkonzepte durch diese Methoden zu verstehen. Denken Sie daran, wir haben das Thema „Sockets“ nur an der Oberfläche gestreift. Ich empfehle Ihnen, sich näher mit dieser Technologie zu befassen, denn wenn Sie erst einmal verstanden haben, wie sie funktioniert, werden Sie sie lieben lernen und von den Möglichkeiten, die sie eröffnet, begeistert sein.
Aber kommen wir gleich zum heutigen Thema. Da die meisten Dinge, die implementiert werden müssen, relativ komplex sind, während andere recht einfach sind, werden wir sie in einem gemächlichen Tempo durchgehen. Auch wenn wir nicht alles zeigen, werden Sie verstehen, wie es funktioniert. Wenn dieses Ziel erreicht ist, werden Sie in der Lage sein, das Gezeigte zu adaptieren und Ihre eigene Lösung zu schaffen – eine, die wahrscheinlich weit über das hinausgeht, was hier vorgestellt wird. Unser Hauptziel ist die Wissensvermittlung, also fangen wir an.
Erstellen des Servers in Python
Wie in früheren Artikeln erläutert, ist es nicht möglich, einen Server direkt in Excel zu erstellen und zu betreiben. Wir könnten das tun, aber wir müssten dafür sorgen, dass der Server unsere Arbeit mit Excel nicht behindert. Eine Möglichkeit, dies zu erreichen, besteht darin, den Server in einem Thread zu erstellen. Das Erstellen und Ausführen eines Servers in einem Excel-Thread ist jedoch eine komplexe Aufgabe. Natürlich ist das nicht die schwierigste Aufgabe, aber sie ist sicherlich viel komplexer als die Lösung, die wir hier vorstellen werden.
Als Erstes müssen Sie einen eigenständigen Server in Python erstellen. Dieser Server greift tatsächlich auf die Excel-Tabelle zu. Es gibt jedoch einige Punkte zu beachten. Auch hier ist die Idee rein pädagogisch. Was wir vorlegen, kann erheblich verbessert werden. Nachfolgend sehen Sie den Hauptcode des Python-Servers. Ich nenne ihn den „Hauptcode“, weil er verfeinert und an unsere Bedürfnisse angepasst werden kann und nur an den notwendigen Stellen angepasst werden muss. Aber bevor wir das tun, müssen wir erst einmal verstehen, wie es funktioniert. Dies wird uns helfen zu verstehen, welche Änderungen vorgenommen werden können und sollten.
001. import socket as sock 002. import select 003. import sys 004. from win32com import client as win32 005. 006. class LinkMT5Excel: 007. def __init__(self, host, port, sheet, cell) -> None: 008. try: 009. self.__CMD = '' 010. self.__MT5 = None 011. self.__server = sock.socket(sock.AF_INET, sock.SOCK_STREAM) 012. self.__server.setblocking(False) 013. self.__server.bind((host, int(port))) 014. self.__server.listen() 015. self.__CONN_LIST = [self.__server] 016. EXCEL = win32.GetActiveObject('Excel.Application') 017. self.__SHEET = EXCEL.Worksheets(sheet) 018. self.__COLUNN, L = cell.split('$') 019. self.__LINE = int(L) 020. except: 021. self.__CONN_LIST.clear() 022. 023. def __WriteInExcel(self, index, msg) -> None: 024. try: 025. if self.__SHEET: 026. self.__SHEET.Range(self.__COLUNN + str(self.__LINE + index)).Value = msg 027. except: 028. self.__SHEET = None 029. self.__ShutdownServer() 030. 031. def __ReadInExcel(self, index) -> str: 032. try: 033. if self.__SHEET: 034. return self.__SHEET.Range(self.__COLUNN + str(self.__LINE + index)).Value 035. except: 036. self.__SHEET = None 037. self.__ShutdownServer() 038. return '' 039. 040. def __MT5_Disconnect(self, conn) -> None: 041. if conn == self.__MT5: 042. self.__WriteInExcel(2, 'MetaTrader 5 is offline.') 043. self.__MT5 = None 044. if conn: 045. conn.close() 046. if self.__CONN_LIST: 047. self.__CONN_LIST.remove(conn) 048. 049. def __ShutdownServer(self) -> None: 050. for conn in self.__CONN_LIST: 051. conn.close() 052. self.__CONN_LIST.clear() 053. 054. def __Command(self, cmd, conn) -> bool: 055. if cmd.lower() == '/force server shutdown': 056. self.__ShutdownServer() 057. return True 058. elif cmd.lower() == '/shutdown': 059. self.__MT5_Disconnect(conn) 060. return True 061. self.__CMD = '' if cmd.lower() == 'n/d' else cmd 062. return False 063. 064. def __Refused(self, conn) -> bool: 065. conn.send('Connection Refused...\n\r'.encode()) 066. conn.close() 067. return False 068. 069. def __Checking(self, conn) -> bool: 070. try: 071. info, cmd = conn.recv(512).decode().rstrip(None).split(':') 072. if info.lower() != '<mt5 with excel>': 073. return self.__Refused(conn) 074. if self.__Command(cmd, conn): 075. return True 076. if (self.__MT5) or (cmd.lower() != 'mt5'): 077. return self.__Refused(conn) 078. self.__MT5 = conn 079. self.__WriteInExcel(2, 'MetaTrader 5 is online.') 080. except: 081. return self.__Refused(conn) 082. return True 083. 084. def __SwapMsg(self, rec, conn) -> None: 085. try: 086. if rec: 087. data = conn.recv(1024).decode().rstrip(None) 088. if data: 089. if '/' in data: 090. if self.__Command(data, conn): 091. return 092. else: 093. self.__WriteInExcel(4, data) 094. else: 095. self.__MT5_Disconnect(conn) 096. return 097. conn.send((self.__ReadInExcel(3) + f'[{self.__CMD}]').encode()) 098. except: 099. self.__MT5_Disconnect(conn) 100. 101. def Run(self) -> None: 102. self.__WriteInExcel(0, 'Server online.') 103. self.__MT5_Disconnect(None) 104. while self.__CONN_LIST: 105. read, write, err = select.select(self.__CONN_LIST, [], [], 0.5) 106. for slave in read: 107. if slave is self.__server: 108. conn, addr = slave.accept() 109. conn.setblocking(False) 110. if not self.__Checking(conn): 111. continue 112. self.__CONN_LIST.append(conn) 113. self.__SwapMsg(False, conn) 114. else: 115. self.__SwapMsg(True, slave) 116. 117. def __del__(self) -> None: 118. for n in range(3): 119. self.__WriteInExcel(n, '') 120. self.__WriteInExcel(0, 'Server offline...') 121. 122. if __name__ == '__main__': 123. if len(sys.argv) == 5: 124. Mt5_Excel = LinkMT5Excel(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4]) 125. Mt5_Excel.Run() 126. del Mt5_Excel 127. else: 128. print(f'Usage: {sys.argv[0]} <HOST> <PORT> <SHEET> <CELL>')
Python-Code
Wenn Sie diese Phase des Wiedergabe-/Simulationsdienstes verfolgt haben, in der wir uns auf die Erklärung von Sockets konzentriert haben, wird Ihnen nichts an diesem Code seltsam vorkommen. Und wenn Sie sich schon lange mit Python beschäftigt haben, wird dieser Code sogar noch leichter zu verstehen sein. Wenn das bei Ihnen nicht der Fall ist, machen Sie sich keine Sorgen – wir gehen jetzt durch, was hier passiert. Diejenigen, die der Reihe nach mitmachen, sollten also Geduld mit den anderen haben, vor allem mit denen, die weniger Erfahrung auf diesem Gebiet haben, denn es gibt einige Dinge in diesem Code, die gut verstanden werden müssen.
Zwischen den Zeilen 01 und 04 importieren wir nun einige notwendige Pakete. Beachten Sie, dass wir keine Pakete verwenden, die über die Standard-Python-Installation hinausgehen, und wir in diesem Stadium nichts allzu Komplexes tun. Sie können Pakete wie pandas, xlwings, openpyxl oder jedes andere Paket verwenden, um einige der in diesem Artikel gezeigten Schritte durchzuführen. Um jedoch nicht den Eindruck zu erwecken, bestimmte Pakete zu diskriminieren, werden wir nur die Standard-Python-Installation verwenden. Auf diese Weise wird es für uns einfacher sein, das von uns bevorzugte Paket zu wählen und die Option zu nutzen, die uns am geeignetsten erscheint. Unser Ziel ist es, ein Höchstmaß an Einfachheit zu erreichen, ohne das Gleichgewicht in eine bestimmte Richtung zu lenken.
Nachdem die genannten Importe abgeschlossen sind, beginnen wir in Zeile 06 mit der Erstellung einer Klasse. Wir könnten auch ohne Klassen auskommen, aber wenn wir sie nutzen, können wir andere Vorteile gewinnen. In Zeile 07 beginnen wir also mit der Definition des Klasseninitialisierers. Hier erhalten wir mehrere Argumente, die uns über wichtige Elemente informieren, die für das ordnungsgemäße Funktionieren des Servers erforderlich sind. Schauen Sie sich an, wo diese Parameter verwendet werden, um zu verstehen, was erwartet wird und wie man denselben Code verbessern kann.
In den Zeilen 09 und 10 werden zwei Variablen deklariert und initialisiert, die später wichtig sein werden. In Zeile 13 beginnen wir mit der Verwendung der übergebenen Argumente. Beachten Sie, dass wir dem Server den Host mitteilen, d. h., den Ort, von dem wir eine Verbindung erwarten. Wenn der Host-Wert 0.0.0.0 ist, bedeutet dies, dass wir jede Client-Adresse akzeptieren, aber es kann auch ein bestimmter Wert sein. Das liegt in Ihrem Ermessen. Ein wichtiger Punkt in dieser Zeile ist, dass, da die Serverinitialisierung von Excel aus erfolgt, die übergebenen Argumente Zeichenketten sind. Daher muss die Zeichenkette in einen geeigneten Wert umgewandelt werden, der in diesem Fall eine ganze Zahl ist, um den zu verwendenden Port anzugeben. Danach weiß Python, wie der verwendete Wert richtig zu interpretieren ist. Die restlichen Zeilen (d. h. von 11 bis 14) sind für die Initialisierung des Sockets zuständig, damit der Server den Port überwachen und auf Verbindungen warten kann. Wenn Sie daran zweifeln, lesen Sie bitte die vorhergehenden Artikel.
Kehren wir nun zu Zeile 08 zurück, denn obwohl die vorangegangenen Schritte nicht ohne Grund zu Fehlern führen sollten, leiten wir in Zeile 08 einen Abschnitt zur Behandlung möglicher Fehler im Code ein. Solche Fehler treten während der Programmausführung auf. Damit der Nutzer bei der Ausführung des Skripts keine seltsamen Dinge sieht, stellen wir sicher, dass alle Ausnahmen vom Code selbst behandelt werden.
In Zeile 16 versuchen wir, die aktive Excel-Sitzung zu erfassen. Da der Server sich selbst initialisiert, werden wir diese Aufgabe erfolgreich bewältigen. In Zeile 17 gibt es jedoch etwas, das zu Fehlern führen könnte. An dieser Stelle versuchen wir, auf ein Excel-Arbeitsblatt zuzugreifen. Dies kann jederzeit passieren, einfach weil das Blatt in der Arbeitsmappe nicht vorhanden ist, wir es aber benötigen. Bei Erfolg wird in Zeile 18 eine bestimmte Zelle erfasst, die vom Server verwendet werden soll. Beachten Sie, dass wir diesen Prozess in zwei Schritte unterteilen. In Zeile 18 geben wir die Spalte und einen numerischen Wert ein. Dieser numerische Wert wird in Zeile 19 in eine ganze Zahl umgewandelt, damit einige einfache Berechnungen auf dem Server durchgeführt werden können. Aber keine Sorge – das wird sich später zeigen.
Nun müssen Sie wissen, dass bei einem Fehler während dieser Initialisierung in Zeile 21 der Server heruntergefahren wird und keine Daten mehr an Excel gesendet werden können. Das ist wichtig, weil der Zugriff auf etwas nicht möglich war oder es nicht richtig konfiguriert wurde, und wir wollen nicht, dass der Nutzer Meldungen sieht, die er nicht versteht.
Jetzt müssen wir die schwierige Aufgabe angehen, alles zum Laufen zu bringen. Wir beginnen mit Zeile 23, wo wir eine Prozedur haben, die versucht, etwas in Excel zu schreiben. Aber wir werden nicht einfach irgendetwas schreiben; wir werden es auf eine ziemlich kontrollierte Weise tun. Daher benötigen wir einen Index, der sich relativ zu der bei der Initialisierung angegebenen Spalte und Zeile bewegt. Da das Ziel ein rein pädagogisches ist, werden wir nicht die Spalte, sondern nur die Zeile verwenden. Auf der Grundlage des Wertes der ersten Zeile wird also versucht, in das bei der Initialisierung angegebene Blatt zu schreiben. Da dieser Prozess jedoch fehlschlagen kann, weisen wir Python in Zeile 24 an, auf einen Fehler zu warten.
In Zeile 25 wird geprüft, ob die Variable etwas Gültiges enthält. Dies ist wichtig, da es vorkommen kann, dass das Blatt während des Herunterfahrens nicht existiert, und wir wollen nicht ohne Grund in eine Schleife geraten, in der der Server versucht, sich zu schließen, eine Ausnahme erzeugt wird, die einen weiteren Exit-Versuch auslöst, die Prozedur erneut aufgerufen wird, was eine weitere Ausnahme erzeugt, und so weiter. Um dies zu vermeiden, führen wir die Prüfung in Zeile 25 durch. In Zeile 26 versuchen wir dann, Daten in das Arbeitsblatt zu schreiben. In diesem Moment kann ein Fehler auftreten, weil der Nutzer möglicherweise versehentlich das vom Server benötigte Blatt aus der Arbeitsmappe gelöscht hat. In diesem Fall werden die Zeile 27 und der entsprechende Code ausgeführt, und der Server wird heruntergefahren.
Wir gehen zu Zeile 31. In dieser Zeile wird der Inhalt einer bestimmten Zelle des Arbeitsblatts erfasst. Diese Zelle bezieht sich auf die bei der Initialisierung angegebene Zelle. Deshalb ist es so wichtig, nichts zu überstürzen und alles, was passiert, zu verstehen. Genauso wie der Versuch, in eine Zelle zu schreiben, dazu führen kann, dass der Prozess fehlschlägt, kann das Gleiche hier passieren. Wenn das Lesen jedoch wie erwartet erfolgt, wird in Zeile 34 der Wert der Zelle an den Server zurückgegeben.
Vielleicht haben Sie gedacht: Wenn diese Funktion in Zeile 31 das Excel-Tabellenblatt lesen kann, warum geben Sie dann nicht einfach während der Initialisierung an, um welches Blatt und welche Zelle es sich handelt, sodass der Server die restlichen Informationen direkt in Excel suchen kann? Wenn Sie daran gedacht haben, gratuliere ich Ihnen aufrichtig – es bedeutet, dass Sie bereits eine mögliche Verbesserung bemerkt haben, die hier im Python-Skript vorgenommen werden kann. Aber gehen wir weiter, denn es gibt noch mehr zu sehen.
In Zeile 40 befindet sich eine Prozedur, die den Excel-Nutzer darüber informiert, wenn MetaTrader 5 aus irgendeinem Grund nicht mehr verfügbar ist. Das geschieht, wenn die Verbindung unterbrochen wird. Dieses Verfahren ist einfach und bedarf keiner weiteren Erklärung. In Zeile 49 gibt es ein weiteres, ebenso einfaches Verfahren, um den Server aus irgendeinem Grund herunterzufahren. Viele dieser Gründe hängen mit Fehlern bei der Ausführung des Serverskripts zusammen, aber es gibt auch andere, die wir später erörtern werden. Machen Sie sich vorerst keine Gedanken darüber. Außerdem haben wir in Zeile 54 eine sehr interessante Funktion. Ab hier wird es richtig interessant. Aber sehen wir uns zunächst an, was in der Funktion in Zeile 54 passiert.
Es ist recht einfach und dient dazu, jeden Befehl zu analysieren, der an den Socket gesendet wurde. Dieser Befehl muss vom Server ausgeführt werden. Momentan haben wir nur zwei Befehle. Die erste befindet sich in Zeile 55 und dient dazu, den Server zwangsweise herunterzufahren – einfach und unkompliziert. Der zweite Befehl befindet sich in Zeile 58 und trennt den Client, in diesem Fall MetaTrader 5, zwangsweise. Wenn der Server keine Anfrage zur Befehlsausführung erhalten hat, wird in Zeile 62 false zurückgegeben. Mit anderen Worten: Was gesendet wurde, war kein Befehl.
Aber warum geben wir einen falschen Wert zurück? Der Grund liegt genau in der Funktion in Zeile 69. Seine Hauptaufgabe ist es, zu prüfen, ob ein Client, der versucht, eine Verbindung zum Server herzustellen, akzeptiert werden kann. An dieser Stelle wird es interessant, denn im Prinzip könnte jeder eine Verbindung zum Server herstellen. Diese Funktion soll dies jedoch verhindern. Wie macht sie das? Sie prüft einfach, was der Client unmittelbar nach dem Verbindungsaufbau an den Socket sendet. In Zeile 72 prüfen wir nun den Header der initialen Verbindung. Dieser Header sollte nur während des Verbindungsversuchs vorhanden sein; zu anderen Zeiten ist er nicht erforderlich. Später werden Sie verstehen, wie das alles wirklich funktioniert.
Es sollte Ihnen nun klar sein, dass in Zeile 71 eine Trennung zwischen der Kopfzeile und dem übertragenen Befehl vorgenommen wird. Der Grund ist einfach, und Sie werden ihn im nächsten Artikel verstehen, in dem wir den entsprechenden Teil des VBA-Codes von Excel behandeln werden. Wenn die vom Client angegebene Kopfzeile nicht mit der vom Server erwarteten übereinstimmt, wird die Funktion in Zeile 64 ausgeführt. Diese Funktion teilt dem Client mit, dass der Server die Verbindung trennt, weil er nicht erkannt wurde.
Wenn die Kopfzeile den Erwartungen entspricht, wird in Zeile 74 versucht, den vom Client gesendeten Befehl auszuführen. Wenn es sich nicht um einen Befehl handelt, wird in Zeile 76 geprüft, ob bereits eine Verbindung mit MetaTrader 5 besteht. Besteht keine Verbindung oder weicht der Befehl von den Erwartungen ab (was darauf hinweist, dass es sich bei dem Client nicht um MetaTrader 5 handelt), wird die Verbindung abgewiesen. Im letzteren Fall erhalten wir in den Zeilen 78 und 79 die Information, dass der MetaTrader 5 online ist. Wenn zu irgendeinem Zeitpunkt eine Ausnahme auftritt, wird die Verbindung aufgrund der Ausführung von Zeile 80 abgewiesen.
Nun kommen wir zu dem entscheidenden Vorgang, der sich in Zeile 84 befindet. Und was macht sie? Es verwaltet den Austausch von Nachrichten zwischen MetaTrader 5 und Excel. Passen Sie gut auf, denn obwohl dieses Verfahren relativ einfach ist, können Sie den Code nicht an Ihre Bedürfnisse anpassen, wenn Sie ihn nicht verstehen. Zugegeben, nach der Lektüre der nächsten Artikel wird das alles einen Sinn ergeben. Versuchen wir aber erst einmal zu verstehen, was in dem Python-Skript passiert.
Da Fehler auftreten können, führen wir den Code aus und teilen Python in Zeile 85 mit, dass wir das Auftreten von Fehlern erwarten. Wenn der Aufrufer angibt, dass diese Prozedur den Socket lesen soll, wird Zeile 86 erfolgreich abgeschlossen, und wir fahren mit dem Lesen eines Teils des Sockets fort. Dies geschieht in Zeile 87.
Lesen Sie jetzt aufmerksam, denn die folgende Erklärung wird später sehr wichtig sein. In Zeile 88 prüfen wir, ob wir etwas über den Socket empfangen haben. Wenn nicht, wird die Verbindung zu MetaTrader5 unterbrochen. Wenn etwas auf dem Socket ist, wird in Zeile 89 geprüft, ob ein bestimmtes Zeichen in der empfangenen Nachricht vorhanden ist. Wenn ein solches Zeichen in der Nachricht vorhanden ist, bedeutet dies, dass es sich um einen Befehl von MetaTrader 5 handelt, der zur Ausführung von Zeile 90 führt. Wenn diese Ausführung jedoch fehlschlägt, wird keine weitere Aktion ausgeführt. Wenn Sie sich den Befehlscode ansehen, werden Sie verstehen, welche Daten vom MetaTrader 5 erwartet werden. Wenn wir den MQL5-Code besprechen, werden wir auf diesen Punkt zurückkommen. Für den Moment genügt es zu wissen, dass MetaTrader 5 Befehle zur Ausführung an den Server senden kann.
Okay, aber was, wenn es kein Befehl war? Dies geschieht, weil die Prüfung in Zeile 89 fehlgeschlagen ist. Und was passiert dann? In diesem Fall wird die Zeile 93 ausgeführt. Sie schreibt in eine bestimmte Zelle die Informationen, die der MetaTrader 5 als Antwort auf die Excel-Anfrage sendet. Doch worum geht es bei diesem Antrag? Nun kommen wir zu dem wirklich interessanten Teil: Zeile 97. Sehen Sie sich an, was wir in dieser Zeile tun. Hier verwenden wir den Server, um eine Anfrage an MetaTrader 5 über den Socket zu senden. Eine solche Anweisung kann in zwei Formen übermittelt werden:
- Die erste ist in Form von Inhalten, die aus einer bestimmten Zelle oder einem bestimmten Bereich von Zellen in Excel gelesen werden. Zur Vereinfachung verwenden wir jedoch keinen Bereich, sondern den Inhalt einer bestimmten Zelle.
- Die zweite ist, dass wir innerhalb der Klammern, entsprechend den Anweisungen von Excel, einen Befehl an MetaTrader 5 senden, der ausgeführt werden soll.
Später werden wir besprechen, wie solche Befehle oder Anfragen in Excel in MetaTrader 5 ausgeführt werden. Für den Moment ist zu beachten, dass wir ein recht einfaches Protokoll für die Interaktion haben. Das heißt, dass im Wesentlichen alles, was in der Zelle oder als Befehl von Excel gesendet wird, an MetaTrader 5 weitergegeben wird. Der Server nimmt an dieser Phase des Nachrichtenaustauschs nicht aktiv teil, sondern protokolliert lediglich Nachrichten an den in diesem Verfahren angegebenen Punkten, damit VBA und MQL5 ihre Arbeit machen können.
Wenn wir jedoch die Quantität und Qualität der zwischen Excel und MetaTrader 5 ausgetauschten Informationen erhöhen oder verbessern wollen, können wir Python verwenden, um die Arbeit zu vereinfachen, die sonst in VBA oder MQL5 erledigt werden müsste. Da wir aber so didaktisch wie möglich vorgehen wollen, werden wir ein sehr einfaches Nachrichtenprotokoll verwenden, mit nur einer Zelle in Excel. Wenn Sie verstehen, wie das geht, können Sie alles tun, was Sie wollen.
Beachten Sie, dass alle hier verwendeten Zellenpositionen mit der ersten Zelle beginnen, die bei der Serverinitialisierung angegeben wurde. Es ist wichtig, dass Sie diese Punkte verstehen, denn alles andere wird direkt in Excel VBA erledigt. Dies ist recht einfach und leicht zu bewerkstelligen und auszuführen.
Okay, wir haben das Ende erreicht. Dies führt uns zu Zeile 101. Fast alles, was dieses Verfahren betrifft, wurde bereits in früheren Artikeln über Sockets behandelt, aber es gibt ein paar Punkte, die erwähnenswert sind. In Zeile 113 zum Beispiel finden wir etwas, das auf den ersten Blick seltsam erscheinen mag, es aber nicht ist, wenn man darüber nachdenkt und der Reihenfolge folgt. Wenn die Prüfung in Zeile 110 erfolgreich ist, wird eine Nachricht an den Client gesendet, der sich gerade verbunden hat. Normalerweise ist dies eine Begrüßung.
Aber hier werden wir etwas ganz anderes machen. Da Excel nicht lange online bleiben wird, versteht es, dass die zu sendenden Informationen an den MetaTrader 5 gerichtet sind. Daher ist es wichtig, die Prozedur in Zeile 84 zu verstehen, die wir vor einiger Zeit beschrieben haben. Beim ersten Aufruf wird der Socket also nicht gelesen, sondern nur beschrieben. Wenn der Server eine Antwort von MetaTrader 5 erhält, wird Zeile 115 ausgeführt, und dieses Mal lesen wir den Socket und schreiben in ihn. Auf diese Weise bleiben wir in der Schleife, erhalten ständig Informationen vom MetaTrader 5 und leiten diese Informationen an Excel weiter.
Und schließlich haben wir ein Verfahren, das vielen ziemlich seltsam vorkommen wird. Das liegt daran, dass dies der Destruktor der Klasse ist. So wie wir einen Konstruktor namens __init__ hatten, haben wir auch einen Destruktor, der in diesem Fall __del__ heißt. Normalerweise ist dieser Destruktor nicht in Python-Skriptcode enthalten, da Python über einen Garbage Collector verfügt, der, wenn das Skript beendet ist, Objekte löscht und den von ihnen belegten Speicher freigibt. Die Funktion dieses Destruktors ist jedoch etwas nobler. Im Wesentlichen zwingt sie Excel dazu, an der Stelle, an der normalerweise angezeigt wird, dass der Server online ist, eine Meldung anzuzeigen, dass der Server offline ist. Sie können sie direkt in Excel anzeigen, ohne dass Sie andere Medien oder Ressourcen verwenden müssen. Der Rest des Codes ist so einfach, dass wir ihm keine weitere Aufmerksamkeit schenken müssen.
Abschließende Gedanken
Mit den hier gegebenen Erläuterungen haben wir den Teil über den Python-Server abgeschlossen. Der Zweck dieses Servers ist es, die Arbeit mit Python so didaktisch und einfach wie möglich zu gestalten, indem nur die Pakete verwendet werden, die in der Standardinstallation der Sprache enthalten sind. Der Leser kann jedoch selbst etwas viel Komplexeres und Praktischeres erstellen, indem er andere Pakete und Komponenten für die Arbeit mit Excel-Dateien verwendet. Es ist sogar möglich, das gesamte Excel-Tabellenblatt sowie viele andere Funktionen direkt in diesem Python-Code zu generieren.
Aber ich möchte die Situation nicht verkomplizieren, indem ich ein bestimmtes Python-Paket bevorzuge. Ich weiß, dass es viele hervorragende Pakete gibt, mit denen man eine Vielzahl von Aufgaben erledigen und sogar die Erstellung mit Excel vollständig ersetzen kann. Wie bereits an anderer Stelle in dieser Reihe erwähnt, geht es hier jedoch darum, einen Kunden oder Nutzer zufrieden zu stellen, der sich weigert, ein anderes Tool als Excel zu verwenden. Ziel ist es, eine Kalkulationstabelle für die Fundamentalanalyse eines bestimmten Symbols zu erstellen, sodass wir die Möglichkeit haben, innerhalb bestimmter Preisspannen zu kaufen oder zu verkaufen. Einige von Ihnen werden sich das fragen: „Warum platzieren Sie die Aufträge nicht direkt im Chart des Symbols an den gewünschten Positionen?“ Auf diese Weise müssten Sie nicht ständig in Excel arbeiten, sondern könnten dies direkt in MetaTrader 5 tun.“
Ich habe volles Verständnis für diejenigen, die so denken. Aber es gibt auch Leute, denen die Geduld oder die Lust fehlt, sich ein Chart anzusehen, Aufträge zu erteilen und zu entfernen, und Positionen zu eröffnen und zu schließen. Sie ziehen es einfach vor, alles mit einigen wenigen Programmen zu organisieren – in der Regel denjenigen, die sie beherrschen und mit denen sie ihre Analysemethoden entwickelt haben – und wollen das nicht aufgeben. Daher wollen diese Leute, dass Sie als Programmierer eine Methode oder ein Mittel entwickeln, um Aufträge zu senden, und Positionen innerhalb einer bestimmten Preisspanne zu schließen oder zu öffnen, und zwar mit diesem speziellen Programm, in diesem Fall Excel.
Gleichzeitig wollen sie sich aber auch keine Gedanken darüber machen, wie das Ganze ablaufen soll. Sie werden einfach angestellt und dafür bezahlt, alles zu tun, was möglich ist. Das ist genau das, was ich zeige: wie man es zumindest teilweise umsetzen kann. Da Sie als Programmierer es vielleicht anders oder mit leichten Abweichungen machen wollen, macht mir das persönlich nicht viel aus. Was mich wirklich befriedigt, ist das Wissen, dass Sie durch die Lektüre dieser Artikel in der Lage sein werden, einige Dinge zu schaffen, die Sie vielleicht für unmöglich gehalten haben. Man kann alles erreichen, wenn man studiert und sich Zeit dafür nimmt. Im nächsten Artikel werden wir den VBA-Teil von Excel behandeln, in dem wir analysieren werden, wie dieser Server mit Excel zusammenarbeitet. Wir sehen uns später im nächsten Artikel dieser Serie.
| Datei | Beschreibung |
|---|---|
| Experts\Expert Advisor.mq5 | Demonstriert die Interaktion zwischen Chart Trade und dem Expert Advisor (erfordert „Mouse Study“ für die Interaktion). |
| Indicators\Chart Trade.mq5 | Erzeugt ein Fenster zur Konfiguration des zu sendenden Auftrags (erfordert „Mouse Study“ zur Interaktion). |
| Indicators\Market Replay.mq5 | Erstellt Steuerelemente für die Interaktion mit dem Replay-/Simulationsdienst (erfordert Mausstudie für die Interaktion). |
| Indicators\Mouse Study.mq5 | Ermöglicht die Interaktion zwischen den grafischen Bedienelementen und dem Nutzer (erforderlich sowohl für das Wiedergabesystem als auch für den realen Marktbetrieb). |
| Services/MarketReplay.mq5 | Erstellt und verwaltet den Markt-Replay-/Simulationsdienst (Hauptdatei des gesamten Systems). |
| VS Code C++ Server.cpp | Erstellt und pflegt einen in C++ entwickelten Socket-Server (Mini-Chat-Version). |
| Code in Python\Server.py | Erstellt und pflegt einen Python-Socket für die Kommunikation zwischen MetaTrader 5 und Excel. |
| Scripts\CheckSocket.mq5 | Ermöglicht das Testen der Verbindung mit einem externen Socket. |
| Indicators\Mini Chat.mq5 | Implementiert einen Mini-Chat über einen Indikator (erfordert den Server, um zu funktionieren). |
| Experts\Mini Chat.mq5 | Implementiert einen Mini-Chat über einen Expert Advisor (erfordert den Server, um zu funktionieren). |
Übersetzt aus dem Portugiesischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/pt/articles/12827
Warnung: Alle Rechte sind von MetaQuotes Ltd. vorbehalten. Kopieren oder Vervielfältigen untersagt.
Dieser Artikel wurde von einem Nutzer der Website verfasst und gibt dessen persönliche Meinung wieder. MetaQuotes Ltd übernimmt keine Verantwortung für die Richtigkeit der dargestellten Informationen oder für Folgen, die sich aus der Anwendung der beschriebenen Lösungen, Strategien oder Empfehlungen ergeben.
Neuronale Netze im Handel: Integration der Chaostheorie in die Zeitreihenprognose (letzter Teil)
Neuronale Netze im Handel: Integration der Chaostheorie in die Zeitreihenprognose (Attraos)
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.