English Русский 中文 Español 日本語 Português
preview
Die ChatGPT-Funktionen von OpenAI im Rahmen der MQL4- und MQL5-Entwicklung

Die ChatGPT-Funktionen von OpenAI im Rahmen der MQL4- und MQL5-Entwicklung

MetaTrader 5Handel | 31 August 2023, 10:32
1 293 0
Evgeniy Ilin
Evgeniy Ilin

Inhalt



Einführung

Beginnen wir also mit den Grundlagen. Diese Technologie ist eine Variante der künstlichen Intelligenz von OpenAI, die Menschen bei der Lösung verschiedener Aufgaben helfen soll. Dieses Tool sieht aus wie ein normaler Messenger-Chat. Auf der anderen Seite gibt es eine so genannte künstliche Intelligenz, die Ihnen in Textform antwortet.

Natürlich ist der Kommunikationskanal nur auf Text beschränkt, aber er ist dennoch ausreichend, um verschiedene Probleme zu lösen oder viel Neues zu lernen. Dieser Textkanal eignet sich für die Lösung ganz unterschiedlicher Probleme, wie Programmierung, Mathematik, Physik, Chemie, aber auch für geschickte Übersetzungen und andere Fähigkeiten.

Wir interessieren uns für dieses Modell nur im Hinblick auf die Entwicklung von profitablen Handelssystemen. Ich interessierte mich dafür, wie man diese Technologie optimal und korrekt für eine schnellere und einfachere Entwicklung von Handelssystemen nutzen kann. Letztlich reduziert derjenige, der als Erster eine Technologie für den vorgesehenen Zweck richtig einsetzt, sowohl die Kosten für die Entwicklung als auch die Arbeitskosten, was einen offensichtlichen Wettbewerbsvorteil darstellt.


Perspektiven für die Verwendung von ChatGPT innerhalb von MQL5

Gehen wir näher auf die technologischen Möglichkeiten ein. Nach einer eingehenden Untersuchung meiner eigenen Beispiele wurde mir klar, dass diese Technologie erst der Anfang von etwas wirklich Großem ist. Aber schon jetzt kann ich die folgenden Merkmale hervorheben:

  • Erzeugung von beliebigen MQL4- und MQL5-Codes
  • Refactoring und Optimierung von Arbeitscode
  • Bereinigung eines Codes
  • Hinzufügen von Kommentaren zu einem Code
  • Behebung von Fehlern
  • Implementierung mathematischer Modelle
  • Nachträgliche Codeerstellung auf der Grundlage mathematischer Modelle
  • Modernisierung aller bekannten Algorithmen und mathematischen Modelle
  • Beschleunigung des Entwicklungsprozesses von Expert Advisor (EA)
  • Eine riesige Menge an Informationen

Diese Liste ist keineswegs endgültig, und Sie können hier Ihre eigenen Ideen hinzufügen. Ich glaube, wenn die Menschen etwas über diese Art von Technologie erfahren, lassen sie sich grob in drei Untergruppen einteilen:

  1. „Jetzt werden wir einen Super-Algorithmus erstellen.“
  2. Diejenigen, die KI misstrauisch gegenüberstehen und ihren Nutzen in Frage stellen.
  3. Eine Maschine kann nicht besser sein als ein Mensch. Es ist alles nur ein weiterer Hype.

Ich habe schon vor langer Zeit begonnen, mich mit dieser Technologie vertraut zu machen und gehörte anfangs zur dritten Kategorie. In den ersten zwei Tagen, in denen ich mich mit dieser KI beschäftigte, wechselte ich abrupt von der dritten in die erste Kategorie, woraufhin ein interessanter und eher unangenehmer Prozess der Anpassung meiner eigenen Überzeugungen begann, der eher einem Rollback in die Kategorie „1,5“ gleicht, was bereits eine realistischere Einschätzung dieser Technologie darstellt.
Diese Technologie ist nützlich, aber nicht so sehr, wie Sie vielleicht zunächst denken. In dieser Hinsicht muss man den Entwicklern und Vermarktern dieser Technologie Anerkennung zollen, und sei es nur für die Tatsache, dass sie in den ersten Tagen einen unglaublichen „Wow“-Effekt erzeugt, der für eine Kettenreaktion der Eigenwerbung ausreicht.

Um das zu verstehen, braucht man viel Übung im Umgang mit dieser KI. Ich persönlich hatte etwa hundert verschiedene Dialoge mit ihr über verschiedene Themen. Ich kann sagen, dass ich genug Übung im Umgang mit dieser Technologie gesammelt habe, um sie für MQL5 zu verwenden. Bevor wir uns den praktischen Anwendungen zuwenden, muss ich Ihnen noch einige wichtige Informationen mitteilen, und dazu müssen wir tiefer unter die Haube dieser Technologie schauen.


Mögliche Fallstricke im Zusammenhang mit ChatGPT

Der so genannte „Wow“-Effekt, den Sie in den ersten Tagen der Nutzung dieser Technologie erleben werden, ist auf die Tatsache zurückzuführen, dass es sich in erster Linie um ein Textmodell handelt, das Ihre Frage in eine Antwort verwandeln soll. Der Grund, warum Sie die Antworten mögen werden, ist, dass die Schöpfer diesem Modell beigebracht haben, schön zu lügen. Ja, ich mache keine Witze! Es lügt so schön, dass Sie es selbst glauben wollen, und selbst nach vielen Versuchen, es zu entlarven, wird das Modell Ihnen oft so etwas liefern:

  • Entschuldigung! Ja, Sie haben Recht. Ich habe einen kleinen Fehler gemacht. Ich werde dies in Zukunft berücksichtigen. (In der Tat, das wird sie nicht. Dies ist nur ein leeres Versprechen.)
  • Entschuldigung für das Missverständnis, ich habe einen Fehler gemacht. Hier ist die korrigierte Fassung. (Enthält noch mehr Fehler.)
  • Sie könnten herausfinden, dass das Modell einen Fehler bei den Berechnungen gemacht hat. (Tatsächlich hat das Modell überhaupt keine Berechnungen angestellt, sondern einfach irgendwo eine ungefähre Zahl gefunden.)
  • Sie haben einen Fehler in einem Code entdeckt. (Das Modell wird wieder Ausreden erfinden und versuchen, Sie zu täuschen.)
  • Das Modell imitiert die Ausführung einer Aufgabe und versucht, Sie davon zu überzeugen, dass es das getan hat, was Sie verlangt haben. (Eigentlich findet es etwas Ähnliches irgendwo und stellt es Ihnen einfach zur Verfügung.)
  • Entschuldigung! Ich war nicht in der Lage, Ihnen zu helfen. (Dies geschieht, wenn das Modell versteht, dass Sie seine Lügen oder Fehler entdeckt haben.)
  • Das Modell fügt viele überflüssige Wörter in seine Antwort ein, um den Eindruck einer harmonischen und kohärenten Antwort zu erwecken. (Ich denke, das hängt irgendwie mit der Optimierung der Ressourcenkosten zusammen.)

Kurz gesagt, das Modell wird versuchen, die gestellte Aufgabe auf jede erdenkliche Weise zu umgehen und dabei die Unvollkommenheit Ihres „Prompts“ (Aufforderung) auszunutzen. Im Falle von Fehlern wird er versuchen, sich so zu rechtfertigen, dass Sie ihn nicht in derselben Sache erwischen können, und wenn er merkt, dass Sie ihn durchschaut haben, wird er versuchen, Ihre negative Reaktion mit bestimmten Antworten und psychologischen Tricks zu mildern. Im Allgemeinen bin ich der Meinung, dass der Algorithmus auf einen optimalen Ressourcenverbrauch mit einem akzeptablen Grad an Nutzerzufriedenheit zugeschnitten ist. Mit anderen Worten, das Ziel ist in diesem Fall nicht, Ihnen die hochwertigste Lösung für das Problem zu bieten, sondern eine Lösung, die Sie aus ganz anderen Gründen als solche betrachten. Es stellt sich heraus, dass das Ziel eine positive Reaktion des Nutzers ist und es nicht so wichtig ist, ob die Aufgabe richtig gelöst wird. Das ist das Ziel der Initiative. Aus der Sicht des Marketings ist dies richtig, und in dieser Hinsicht kann die KI so überzeugend wie möglich sein.

In Anbetracht all dessen wurde mir klar, dass wir, um seine Freiheit in dieser Hinsicht zu minimieren, zunächst einmal Erfahrungen in der Kommunikation mit ihm sammeln und Schlussfolgerungen darüber ziehen sollten, welche Art von Aufgaben den Einsatz dieser Überzeugungskraft nicht erfordern, weil es für ihn einfach sein wird, unsere Anfrage zu erfüllen, da sie angesichts seiner Funktionalität am leichtesten zu erfüllen ist und es viel einfacher ist, eine direkte Antwort zu geben, als Fantasie zuzulassen. Denn es wird nicht effizient sein, was die Ressourcenkosten angeht, mit anderen Worten, es wird sich für ihn einfach nicht lohnen, Sie zu täuschen, aber es wird viel einfacher sein, Ihnen eine wahre Antwort zu geben.

Um zu verstehen, wie man solche Fragen stellen kann, müssen wir Folgendes verstehen:

  1. Die Struktur und die Art eines „Prompts“ sind nicht so wichtig, die Details und die Qualität der Frage sind von größerer Bedeutung. (Das Modell versteht alles, und es ist nicht nötig, im Internet nachzulesen, wie man Prompts verfasst. Schreiben Sie, was Sie wollen, aber ohne Slang.)
  2. Unterteilen Sie komplexe Fragen oder Aufforderungen in Unterabschnitte. (Vereinfachen und unterteilen Sie die Fragen, um präzisere, einfachere und klarere Antworten zu erhalten.)
  3. Je intelligenter und präziser Ihre Frage ist, desto besser ist die Antwort.
  4. Es wird Ihnen keine Superidee oder einen Algorithmus liefern. (Das Modell hat nicht die Breite des Denkens, der Planung und der intellektuellen Kreativität. Aber auf den ersten Blick wird es so aussehen, als ob es dazu in der Lage wäre, weil es, wie gesagt, sehr gut lügt.)
  5. Wir sollten den Einsatz dieser Technologie ausschließlich im Zusammenhang mit der Beschleunigung unserer Arbeit und der Senkung unserer Arbeitskosten sehen.
  6. Jede neue Anfrage sollte so wenig wie möglich vom gesamten Dialog abhängig sein. (Das Modell ist nicht in der Lage, sich den gesamten Dialog zu merken, und alte Nachrichten werden bei Antworten oft nicht berücksichtigt. Probieren Sie es einfach aus und Sie werden verstehen, was ich meine.)
  7. Je komplexer die Frage ist und je mehr Details sie enthält, desto höher ist die Wahrscheinlichkeit, dass man völligen Unsinn erhält. (Dies ist eine Erläuterung des zweiten Unterabsatzes.)
  8. Das Modell hat keinen Internetzugang und generiert alle Antworten ausschließlich auf der Grundlage seiner Wissensbasis. (Wenn Sie ihn auffordern, bestimmte Daten aus dem Internet abzurufen, gibt er Ihnen die alten Daten aus seiner Datenbank oder passt die Antwort entsprechend Ihrem Kontext an und gibt sie als neue Daten aus. Behalten Sie dies im Hinterkopf. Das Modell wird dies einfach deshalb tun, weil es erkennt, dass es sinnlos ist, mit Ihnen zu streiten, und es besser ist, Sie davon zu überzeugen, dass es alles getan hat.)
  9. ChatGPT 3.5 wurde bis 2019 trainiert. (Das bedeutet, dass er bis zur nächsten von den Entwicklern genehmigten Schulungssitzung keine Informationen über die Ereignisse nach 2019 hat.)
  10. ChatGPT 4.0 wurde bis 2021 trainiert. (Es ist besser, weil es sehr wenig lügt und versucht, immer richtig zu antworten. Wenn Sie versuchen, Fragen zu stellen und zu vergleichen, werden Sie feststellen, dass 3,5 eklatant lügt.)

In der Tat gibt es eine Menge anderer kleinerer unangenehmer Momente, die den Eindruck von dieser Technologie trüben. Aber ich würde trotzdem nicht darüber schreiben, wenn diese Technologie nicht nützlich wäre. Dies alles läuft auf die Tatsache hinaus, dass es sich keineswegs um eine künstliche Intelligenz handelt. Aber wenn wir pragmatisch bleiben und überlegen, ob das alles so schlimm ist und welche Routinearbeiten wir mit Hilfe dieser Technologie schneller und besser erledigen können, dann bin ich sicher, dass wir nicht zu hart urteilen werden. Wir müssen nur darüber nachdenken, wie wir all dies für die Entwicklung von Handelssystemen nutzen können.

Zum Abschluss dieses Abschnitts möchte ich Ihre Aufmerksamkeit auf den wichtigsten und grundlegendsten Punkt lenken, den Sie sich stets vor Augen halten müssen:

  • Überprüfen Sie ChatGPT-Antworten und insbesondere Zahlen, Gleichungen und generierten Code immer zweifach.

Dank meiner Kenntnisse in Mathematik und Programmierung habe ich viele Beispiele für Fehler und Unzulänglichkeiten gesehen, und ich kann sagen, dass sie ziemlich häufig sind. Aus der Sicht des generierten Textes scheint er unbedeutend zu sein, aber wenn es sich um Mathematik oder Code handelt, macht selbst der unbedeutendste Fehler die gesamte Lösung unbrauchbar. Überprüfen Sie daher die Antworten immer zweimal, korrigieren Sie Fehler und weisen Sie das Modell darauf hin. Manchmal antwortet es eine Zeit lang richtig. Dieser Unterabsatz wird unter anderem bei der Entwicklung Ihrer EAs äußerst nützlich sein.


Möglichkeiten zur Verwendung von ChatGPT zur Lösung mathematischer Probleme und zur Entwicklung mathematischer Modelle zur Verwendung in einem Code

Da es sich bei diesem Modell um ein Textmodell handelt, kann man davon ausgehen, dass es Gleichungen versteht, wenn wir sie im richtigen Format schreiben, und dass es darüber hinaus mathematische Umformungen vornehmen und Probleme lösen kann. Bei der Entwicklung vieler Handelssysteme werden Sie Hilfe bei der Erstellung mathematischer Gleichungen und Ausdrücke benötigen. Es ist möglich, einige mögliche mathematische Probleme zu lösen und sie anschließend in einen Code umzusetzen. Es gibt das folgende Format zum Schreiben von mathematischen Gleichungen, das ChatGPT versteht und verwendet, um die Antwort zu geben:

  • LaTeX

Ein Beispiel für die Verwendung des Latex-Formats zum Schreiben von Gleichungen:

Code:

E &=& mc^2\\
m &=& \frac{m_0}{\sqrt{1-\frac{v^2}{c^2}}}

Fügen Sie dies in einen beliebigen freien Latex-Konverter ein und Sie erhalten eine Datenvisualisierung aller bekannten Ausdrücke:

Einsteins Energie- und relativistische Massenausdehnungsgleichungen

Ich denke, jetzt ist klar, wie man die Modellantworten im LaTeX-Format visuell interpretieren kann. Vergessen Sie vor allem nicht, das Modell aufzufordern, Gleichungen in diesem Format zu erstellen, wenn die Antwort mathematische Ausdrücke enthält. Es gibt auch neuronale Netze, die in der Lage sind, Gleichungen in Bildern oder anderen Formaten wieder in das von uns benötigte Format zu konvertieren. Ich denke, Sie werden diese Werkzeuge finden, wenn Sie sie brauchen. Meine Aufgabe ist es, Ihnen zu zeigen, dass es eine solche Möglichkeit gibt.

Es gibt Telegram-Bots, die viele neuronale Netze, darunter ChatGPT, und die Funktion der Rückkonvertierung von Bildern ins LaTeX-Format kombinieren. Wenn Sie möchten, können Sie einen davon in meinem Profil finden. Dieser Bot wurde von meinem Freund erstellt und von mir persönlich getestet.

Sie können ChatGPT z.B. bitten, eine Ungleichung oder eine Gleichung zu lösen, sowohl numerisch als auch explizit. Sie können auch die Lösung von Gleichungssystemen oder Ungleichungen sowie von Differentialgleichungen oder Integralen verlangen oder alle erforderlichen mathematischen Umformungen vornehmen. Als Mathematiker kann ich jedoch sagen, dass sie das nicht immer effizient und rational tut und die Aufgabe manchmal unvollendet lässt. Daher ist eine doppelte Kontrolle erforderlich.

Natürlich kann diese Funktion auch für Nicht-Mathematiker nützlich sein. Bei längerem Gebrauch werden Sie mehr Fehler machen, und Ihre Lösung wird ziemlich irrational und unbeholfen sein. Sie werden jedoch einige Ihrer mathematischen Probleme für Ihren Code abdecken, da der Code normalerweise nur numerische Methoden verwendet, während die angewandte Mathematik nicht so kompliziert ist. Hier gibt es keine Differentialgleichungen.


Korrekte Vorgehensweise bei der Codegenerierung in MQL4 und MQL5

An dieser Stelle wird es interessant. In Anbetracht der Tatsache, dass der Umfang der Codes aller ausreichend hochwertigen und mehr oder weniger anständigen Handelssysteme recht groß ist, lohnt es sich, darüber nachzudenken, wie man den Prozess der Erzeugung solcher Codes angehen kann. Hier besteht das Haupthindernis darin, dass die Größe der Antwort auf Ihre Frage auf eine bestimmte Anzahl von Zeichen begrenzt ist, und nach zahlreichen Versuchen, große und komplexe Codes zu erzeugen, bin ich zu dem Schluss gekommen, dass jede Codeausgabe kurz genug sein sollte. Dies bedeutet, dass der Code in Teilen angezeigt werden sollte. Wie können wir dies erreichen? Die Antwort ist sehr einfach - wir müssen einen Plan für die Entwicklung eines EA, Indikators oder Skripts erstellen.

Der Plan sollte unter der Voraussetzung erstellt werden, dass jeder Unterpunkt eine separate Teilaufgabe darstellt, die unabhängig von den anderen gelöst werden kann. Dann können wir einfach jede Teilaufgabe nacheinander lösen und dann den gesamten Code zusammenfassen. Ein weiterer Vorteil dieses Ansatzes ist, dass jede Teilaufgabe separat abgeschlossen werden kann, und da jede Teilaufgabe einfacher ist als alle zusammen, erfolgt der Abschluss schneller und bequemer. Darüber hinaus werden wir mehr Fehler vermeiden.

Als Entwickler ist es für mich viel angenehmer, unabhängig über die Hauptarchitektur meines EA nachzudenken, ohne dass sich die KI einmischt. Stattdessen soll sie in meinem EA separate Verfahren implementieren. Die gesamte Hauptlogik soll in den Verfahren enthalten sein. Wir müssen nur eine ungefähre Codeschablone mit leeren Funktionen implementieren und sie dann bitten, jede Funktion einzeln zu implementieren. Wir können ihn auch bitten, Funktionsprototypen oder andere Strukturen zu implementieren.

Ein zusätzlicher und wichtiger Vorteil ist, dass Sie das Programm bitten können, einen Plan für einen EA oder einen anderen Code unter Angabe Ihrer Anforderungen zu erstellen und seinen Plan dann einfach Stück für Stück einarbeiten. Es ist gut, wenn Sie eine grobe oder genaue Vorstellung davon haben, wie der Algorithmus Ihres EAs aussehen wird und welche Indikatoren oder andere Ansätze er verwenden wird. Aber wenn Sie keine solche Idee haben, können Sie zuerst mit ihm sprechen und ihn bitten, Ihnen bei der Auswahl einer Handelsstrategie für Ihren EA zu helfen. Sie wird Ihnen einige Optionen anbieten. Betrachten wir diese Vorgehensweise hier als Beispiel.

Fassen wir nun die obigen Ausführungen zusammen und bilden kurze Unterpunkte, die die möglichen Wege symbolisieren, die wir beim Aufbau eines neuen EA von Grund auf einschlagen werden. Zunächst einmal gibt es mehrere naheliegende Möglichkeiten für den Einstieg:

  1. Wir haben noch keine Entscheidung über die Architektur des künftigen Codes getroffen und wissen nicht, wo wir anfangen sollen, und wir wissen auch überhaupt nicht, welchen der Handelsansätze wir wählen sollen.
  2. Wir haben noch nicht über die Architektur des zukünftigen Codes entschieden und wissen nicht, wo wir anfangen sollen, aber wir kennen ein grobes Bild des Hauptarbeitscodes und was wir vom EA erwarten.
  3. Wir haben eine fertige Architektur, die uns gefällt, aber wir wissen absolut nicht, welchen Handelsansatz wir wählen sollen.
  4. Wir kennen die Architektur, die wir verwenden wollen, und haben auch eine klare Vorstellung von der zukünftigen Handelslogik des EAs.

In der Regel wird alles auf ähnliche Konstruktionen reduziert. Alle vier Punkte können auf das allgemeine Schema des Aufbaus eines Handelssystems angewendet werden, wenn wir Folgendes tun:

  • Wenn wir die Architektur (den Hauptcode oder das Gerüst) nicht kennen, müssen wir sie zunächst implementieren und dann alles implementieren, was das Funktionieren dieses Gerüsts gewährleistet.

Das kann zum Beispiel bedeuten, dass wir darum bitten können, Klassen, Eingabevariablen, Felder und Methodenprototypen, Schnittstellen sowie die Haupthandelsfunktionalität des EA zu implementieren, die die von uns beschriebenen Entitäten verwenden werden. Bei richtiger Handhabung von ChatGPT kann der Code so implementiert werden, dass er z.B. nicht mehr als 5-10% der Gesamtzahl der Zeichen benötigt. In diesem Fall können wir sie schnell implementieren und dann mit der Implementierung der Prozeduren fortfahren, die etwa 90% des gesamten Codes ausmachen werden. Diese Verfahren werden bereits auf die gleiche einfache Art und Weise implementiert, denn es wird viele davon geben, und sie werden sich als recht klein und leicht ausführbar erweisen. Natürlich ist es viel einfacher, wenn Sie eine fertige Vorlage haben und nicht alles selbst umsetzen müssen, aber das erfordert Wissen und Erfahrung.


Entwicklung eines Handelssystems mit ChatGPT

Ich glaube, ich habe Ihnen genügend theoretische Informationen gegeben. Es ist an der Zeit, sie anzuwenden. In meinem Fall verwende ich eine fertige Vorlage, auf die ich meine EAs aufbaue. Ich habe ein solches Muster in einem der früheren Artikel beschrieben. Dessen Besonderheit besteht darin, dass er den parallelen Handel mit mehreren Instrumenten ermöglicht, die auf einem einzigen Chart aktiviert werden. Es verfügt bereits über alle notwendigen Handelsfunktionen und die Hauptarchitektur. Ich werde ein Handelssystem aufbauen, das strikt den Empfehlungen von ChatGPT folgt. Ich werde die Haupt-Handelslogik des EAs selbst implementieren, ebenso wie die visuelle Komponente, da dies weniger Aufwand für mich bedeutet.

Wenn Sie anfangen, mit ChatGPT zu interagieren, werden Sie feststellen, dass Sie viel mehr Mühe darauf verwenden werden, ihm zu erklären, was zu tun ist, und Sie werden seine Antworten hundertmal korrigieren, wenn Sie einige Anfragen und Aufgaben umsetzen. Nach einer Weile werden Sie einfach spüren, welche Fragen es wert sind, gestellt zu werden, und welche nicht. Sie werden anfangen, sich nur noch Aufgaben zu stellen, die letztlich Ihre Zeit sparen, anstatt sie zu verschwenden. Hier ist ein schmaler Grat, den man selbst spüren muss - es gibt keinen anderen Weg. Alles lehrt die Praxis. Meine Herangehensweise an den EA-Entwurf wurde vollständig durch diese Überlegungen geprägt.

Zunächst bat ich darum, die Grundlage des EA zu beschreiben - was sein Arbeitsprinzip ist und welche Methoden oder Indikatoren er verwenden soll (ich erlaubte dem Modell, alle verfügbaren Informationen nach eigenem Ermessen zu verwenden.) Gleichzeitig habe ich festgelegt, dass ich von ihm nur logische Bedingungen in lesbarer Form benötige, die ich in den folgenden vier Vorgaben selbst umsetzen kann:

  1. Eröffnen einer Kaufposition.
  2. Schließen einer Kaufposition.
  3. Eröffnen einer Verkaufsposition.
  4. Schließen einer Verkaufsposition.

Um diese Vorgaben zu implementieren, bot mir das Modell die folgende bedingte Logik an:

  1. Der aktuelle Kurs schließst über dem EMA, die Differenz zwischen dem aktuellen Kurs und dem EMA ist kleiner als der ATR und der RSI ist kleiner als 30.
  2. Der aktuelle Kurs schließt unter dem SMA oder über dem oberen Band der Bollinger Bänder.
  3. Der aktuelle schließt unter dem EMA, die Differenz zwischen dem aktuellen Kurs und dem EMA ist kleiner als der ATR und der RSI ist größer als 70.
  4. Der aktuelle Preis liegt über dem SMA oder der aktuelle Preis liegt unter dem unteren Band des Bollinger Bands Indikators.

Offensichtlich geben diese booleschen Bedingungen im Erfolgsfall „true“ und im Fehlerfall „false“ zurück. Diese Signalwerte sind für den Handel mit Marktaufträgen völlig ausreichend. Ich möchte Ihre Aufmerksamkeit auf die offensichtliche Möglichkeit der Modernisierung dieser Logik lenken. Dazu können wir Folgendes tun:

  • [K1] — Zone des unteren RSI-Wertes
  • [K2 = 100 - K1] — Zone des oberen RSI-Wertes

Mit diesen Ausdrücken kann die Flexibilität des Algorithmus erweitert werden, was sich wiederum positiv auf die Effizienz der EA-Optimierung auswirkt:

  1. Der aktuelle Kurs liegt über dem EMA, die Differenz zwischen dem aktuellen Kurs und dem EMA ist kleiner als der ATR, und der RSI ist kleiner als K1.
  2. Der aktuelle Kurs liegt unter dem SMA oder der aktuelle Kurs hat über dem oberen Band der Bollinger Bänder geschlossen.
  3. Der aktuelle Kurs schließt unter dem EMA, die Differenz zwischen dem aktuellen Kurs und dem EMA ist kleiner als der ATR, und der RSI ist größer als K2.
  4. Der aktuelle Kurs liegt über dem SMA oder der aktuelle Kurs liegt unter dem unteren Band der Bollinger Bänder.

Ich habe dieses Beispiel angeführt, weil Sie nicht zögern sollten, das Modell zu erweitern, wenn es offensichtlich ist, dass die betreffende Lösung nur ein Spezialfall eines anderen, erweiterten Algorithmus ist. Auch wenn Sie nicht wissen, was eine solche Erweiterung Ihnen bringen kann, erhöhen Sie damit zumindest die Flexibilität Ihres Algorithmus und damit die Wahrscheinlichkeit einer feineren Abstimmung und damit einer möglichen Steigerung seiner Effizienz.

Wenn man bedenkt, welche Bedingungen erfüllt werden müssen, gibt es zwei Möglichkeiten, die folgenden Indikatoren umzusetzen:

  1. SMA — gleitender Standarddurchschnitt (eine Linie)
  2. EMA — Exponentieller gleitender Durchschnitt (eine Linie)
  3. Bollinger Bands — Bollinger Bänder (ein Satz von drei Linien)
  4. RSI — Relative Strength Index (eine Zeile in einem separaten Fenster)
  5. ATR — Average True Range (eine Zeile in einem separaten Fenster)

Indikatoren können mit speziellen vordefinierten MQL5-Funktionen implementiert werden, aber ich mag diesen Ansatz nicht, weil der implementierte Code schwieriger in die MQL4-Version zu konvertieren sein wird. Außerdem wird es für mich schwieriger sein, es z. B. in meine Projekte in anderen Sprachen zu integrieren, was ich sehr oft tue. Ich habe mir seit langem angewöhnt, alles so einfach wie möglich und mit Blick auf den zukünftigen Nutzen zu tun. Ich denke, das ist eine sehr gute Angewohnheit.

Der zweite wichtige Punkt ist, dass solche Indikatoren in der Regel unnötige und redundante Berechnungen und Funktionen mit sich bringen. Darüber hinaus ist es nicht möglich, diese Indikatoren zu verfeinern, da ihre Funktionen starr auf der Code-Ebene festgelegt sind. Um Änderungen vornehmen zu können, müssen Sie auf jeden Fall eine eigene Version des Indikators erstellen. Ich denke, es ist offensichtlich, dass es besser ist, eine nutzerdefinierte Implementierung innerhalb eines EA oder eines Skripts zu haben. Um solche Indikatoren zu implementieren, habe ich mir den folgenden Trick ausgedacht:

  1. Erstellung von Arrays zur Speicherung der Werte der Indikatorlinien (begrenzt auf die letzten N Balken.)
  2. Implementierung der Verschiebung von Array-Werten, wenn ein neuer Balken erscheint.
  3. Implementierung des Löschens des Arrays von Indikatorwerten im Falle von Fehlern oder einer langen Unterbrechung der Verbindung.
  4. Implementierung der Berechnung des Indikatorwerts für den letzten Balken, wenn dieser geschlossen wird.

Bei diesem Ansatz werden in den ersten drei Abschnitten gemeinsame Array-Blöcke und Funktionen erstellt, die die aufgeführten Aktionen ermöglichen. Schauen wir uns das am Beispiel unserer Aufgabe an. Lassen Sie uns mit dem ersten Punkt beginnen:

   double SMA1Values[]; // Array for storing SMA values
   double EMAValues[];  // Array for storing EMA values (exponential)
   double RSIValues[];  // Array for storing RSI values
   
   double BollingerBandsUpperValues[];  // Array for storing BollingerBands values, upper
   double BollingerBandsMiddleValues[]; // Array for storing BollingerBands values, middle
   double BollingerBandsLowerValues[];  // Array for storing BollingerBands values, lower
   
   double ATRValues[];// array for storing Average True Range values

Diese Arrays werden zu Beginn des EA mit den angegebenen Längengrenzen initialisiert:

   //Prepare indicator arrays
   void PrepareArrays()
   {
      ArrayResize(SMA1Values, LastBars);
      ArrayResize(EMAValues, LastBars);
      ArrayResize(RSIValues, LastBars);
      ArrayResize(BollingerBandsUpperValues, LastBars);
      ArrayResize(BollingerBandsMiddleValues, LastBars);
      ArrayResize(BollingerBandsLowerValues, LastBars);
      ArrayResize(ATRValues, LastBars);
   }

Im Gegensatz zu herkömmlichen Indikatoren müssen wir bei dieser Strategie nicht alle vorherigen Werte mitnehmen. Dies ist definitiv ein Vorteil. Mir gefällt dieses Implementierungsparadigma, weil es die Einfachheit des Codes und die Gleichwertigkeit der Startwerte des Indikators und der mit den vorherigen Werten erhaltenen Werte gewährleistet. Schauen wir uns nun an, wie die Werteverschiebung aussieht:

   //shift of indicator values
   void ShiftValues()
   {
      int shift = 1;
      for (int i = LastBars - 1; i >= shift; i--)
      {
         SMA1Values[i] = SMA1Values[i - shift];
         EMAValues[i] = EMAValues[i - shift];
         RSIValues[i] = RSIValues[i - shift];
         BollingerBandsUpperValues[i] = BollingerBandsUpperValues[i - shift];
         BollingerBandsMiddleValues[i] = BollingerBandsMiddleValues[i - shift];
         BollingerBandsLowerValues[i] = BollingerBandsLowerValues[i - shift];
         ATRValues[i] = ATRValues[i - shift];
      }
   }

Wie Sie sehen können, ist alles sehr einfach. Das Gleiche gilt für das Löschen von Arrays:

   //reset all indicator arrays if connection fails [can also be used when initializing an EA]
   void EraseValues()
   {
      for (int i = 0; i < LastBars; i++)
      {
         SMA1Values[i] = -1.0;
         EMAValues[i] = -1.0;
         RSIValues[i] = -1.0;
         BollingerBandsUpperValues[i] = -1.0;
         BollingerBandsMiddleValues[i] = -1.0;
         BollingerBandsLowerValues[i] = -1.0;
         ATRValues[i] = -1.0;
      }
   }

Ich denke, es ist ziemlich klar, wo diese Funktion eingesetzt werden wird. Kommen wir nun zur Umsetzung der Indikatoren selbst. Um dies zu tun, bat ich ChatGPT, die entsprechende Funktion zu implementieren, die auf der Grundlage meines Paradigmas der Codeerstellung geeignet wäre. Ich habe mit dem SMA-Indikator begonnen:

   //1 Function that calculates the indicator value to bar "1"
   double calculateMA(int PeriodMA,int Shift=0)
   {
      int barIndex=Shift+1;//bar index SMA is calculated for (with a shift)
      int StartIndex=barIndex + PeriodMA-1;//starting bar index for calculating SMA
      if (StartIndex >= LastBars) return -1.0; // Check for the availability of the bars for calculating SMA (if not valid, then the value is -1)
      double sum = 0.0;

      for (int i = StartIndex; i >= barIndex; i--)
      {
         sum += Charts[chartindex].CloseI[i];
      }
      LastUpdateDateTime=TimeCurrent();
      return sum / PeriodMA;
   }

Wie Sie sehen können, ist die Funktion sehr einfach und kurz ausgefallen. Ursprünglich war das Aussehen dieser Funktion ein wenig anders. Bei der ersten Generation habe ich viele Fehler gefunden, z. B. dass sie die Richtung der Nummerierung der Balken in Bezug auf die Zeit falsch verstanden hat usw. Aber nach einigen Manipulationen habe ich das alles behoben und zusätzlich den Parameter Shift hinzugefügt, der in der ursprünglichen Implementierung nicht enthalten war. Nachdem ich einige visuelle Verbesserungen vorgenommen hatte, bat ich darum, den Rest der Indikatoren auf ähnliche Weise zu implementieren. Danach gab es weniger Fehler bei der Umsetzung. Ich habe gerade die folgenden Anfragen zur Implementierung einer ähnlichen Funktion für einen anderen Indikator geschickt, einschließlich Beispiele für frühere Implementierungen im Zusammenhang mit der Frage. Das hat viel Zeit gespart. Schauen wir uns nun die nachfolgenden Implementierungen aller übrigen Indikatoren an. Beginnen wir mit dem EMA:

   //2 Function that calculates the value of the exponential moving average to bar "1"
   double calculateEMA(int PeriodEMA,double Flatness=2.0,int Shift=0)
   {
      int barIndex = Shift+1; // bar index EMA is calculated for (with a shift)
      int StartIndex=barIndex + PeriodEMA-1;//index of the starting bar for calculating the first SMA, for starting the recurrent calculation of EMA
      if (StartIndex >= LastBars) return -1.0; // Check for the availability of the bars for calculating EMA (if not valid, then the value is -1)
   
      double sum = 0.0;
      double multiplier = Flatness / (PeriodEMA + 1); // Weight multiplier 
      double prevEMA;
   
      // Calculate the initial value for the EMA (the first value is considered as a normal SMA) 
      for (int i = StartIndex; i >= barIndex; i--)
      {
         sum += Charts[chartindex].CloseI[i];
      }
      prevEMA = sum / PeriodEMA;//this is the starting value for the bar (StartIndex-1)
   
      // Apply the EMA formula for the remaining values 
      for (int i = StartIndex; i >= barIndex; i--)
      {
         prevEMA = (Charts[chartindex].CloseI[i] - prevEMA) * multiplier + prevEMA;
      }
   
      LastUpdateDateTime = TimeCurrent();
      return prevEMA;
   }

Übrigens, bei der Erforschung der ChatGPT-Generationen müssen wir auf verschiedene Internetquellen zurückgreifen, um zu verstehen, welcher Indikator auf welcher Idee beruht. Das macht uns kompetenter. Besonders deutlich wird dies bei dem EMA. Wenn wir uns den Code genau ansehen, werden wir feststellen, dass er sich nicht wesentlich von der einfacheren Implementierung des SMA unterscheidet und eher wie ein Zusatz zum üblichen gleitenden Durchschnitt aussieht. Hier gibt es keinen Exponenten, obwohl er aus irgendeinem Grund im Namen des Indikators enthalten ist. Der nächste Indikator ist der RSI:

   //3 Function for calculating RSI to bar "1"
   double calculateRSI(int PeriodRSI,int Shift=0)
   {
       int barIndex = Shift+1; // bar index RSI is calculated for (with a shift)
       int StartIndex = barIndex + PeriodRSI - 1; // starting bar index for calculating RSI
       if (StartIndex >= LastBars) return -1.0; // Check for the availability of the bars for calculating RSI (if not valid, then the value is -1)
   
       double avgGain = 0.0;
       double avgLoss = 0.0;
       double change;
   
       // Calculate initial values for avgGain and avgLoss
       for (int i = StartIndex; i > barIndex; i--)
       {
           change = Charts[chartindex].CloseI[i]-Charts[chartindex].OpenI[i];
           if (change > 0)
           {
               avgGain += change;
           }
           else if (change < 0)
           {
               avgLoss -= change;
           }
       }
   
       avgGain /= PeriodRSI;
       avgLoss /= PeriodRSI;
   
       // RSI calculation
       double RS = 0.0;
       if (avgLoss != 0)
       {
           RS = avgGain / avgLoss;
       }
   
       double RSI = 100 - (100 / (1 + RS));
   
       LastUpdateDateTime = TimeCurrent();
       return RSI;
   }

Nun müssen wir ein ähnliches Verfahren für die Bollinger Bänder durchführen. Dieses Verfahren sollte die Werte von drei Linien zurückgeben, die in die vorbereitete Struktur eingesetzt werden können:

   //structure to return all three bollinger band lines
   struct BollingerBands 
   {
       double upper;
       double middle;
       double lower;
   };

Nachdem wir diese Struktur in den Kontext der Frage eingefügt haben, können wir die Funktion implementieren und dabei berücksichtigen, dass sie den Typ BollingerBands zurückgeben soll. Das Modell wird eine solche Aufgabe ohne Probleme bewältigen:

   //4 Function for calculating the Bollinger Bands of the indicator 
   BollingerBands calculateBollingerBands(int PeriodBB, double DeviationBB,int Shift=0) 
   {
       int barIndex = Shift+1; // bar index Bollinger Bands is calculated for (with a shift)
       int StartIndex = barIndex + PeriodBB - 1; // index of the starting bar for calculating the first SMA, for starting the recurrent calculation of EMA
       BollingerBands rez;
       rez.lower=-1.0;
       rez.middle=-1.0;
       rez.upper=-1.0;
       if (StartIndex >= LastBars) return rez; // Check for the availability of the bars for calculating BB (if not valid, then the value is -1)
   
       double sum = 0.0;
       double prevBB;
       double sumSquares = 0.0;
   
       // Calculate the initial value for BB (the first value is considered as a normal SMA)
       for (int i = StartIndex; i >= barIndex; i--) {
           double closePrice = Charts[chartindex].CloseI[i];
           sum += closePrice;
       }
       prevBB = sum / PeriodBB; //this is the starting value for the bar (StartIndex-1)
   
       // Calculation of standard deviation
       for (int i = StartIndex; i >= barIndex; i--) {
           double closePrice = Charts[chartindex].CloseI[i];
           sumSquares += pow(closePrice - prevBB, 2);
       }
       double standardDeviation = sqrt(sumSquares / PeriodBB);
   
       // Calculate Bollinger Bands
       double upperBand = prevEMA + DeviationBB * standardDeviation;
       double lowerBand = prevEMA - DeviationBB * standardDeviation;
   
       rez.upper = upperBand;
       rez.middle = prevEMA;
       rez.lower = lowerBand;
   
       LastUpdateDateTime = TimeCurrent();
       return rez;
   }

Nun muss noch die Version der Funktion zur Berechnung der ATR implementiert werden:

   //5 Function for calculating Average True Range (Relative)
   double calculateRelativeATR(int PeriodATR,int Shift=0)
   {
       int barIndex = Shift+1; // bar index ATR is calculated for (with a shift)
       int StartIndex = barIndex + PeriodATR - 1; // starting bar index for calculating the first ATR
       if (StartIndex >= LastBars) return -1.0; // Check for the availability of the bars for calculating ATR and True Range (if not valid, then the value is -1)
   
       double sumPrice=0.0;
       double sumTrueRange = 0.0;
       double ATR;
   
       // Calculating True Range for bars and the sum of values for calculating the first ATR
       for (int i = StartIndex; i >= barIndex; i--)
       {
           sumPrice+=Charts[chartindex].HighI[i]+Charts[chartindex].LowI[i]+Charts[chartindex].CloseI[i]+Charts[chartindex].OpenI[i];//added by me 
           double high = Charts[chartindex].HighI[i];
           double low = Charts[chartindex].LowI[i];
           double trueRange = high - low;
           sumTrueRange += trueRange;
       }
   
       // ATR calculation
       //ATR = sumTrueRange / PeriodATR; - conventional calculation
       ATR = 100.0 * (sumTrueRange / PeriodATR)/(sumPrice/(PeriodATR*4.0));//calculation of relative ATR in %
   
       LastUpdateDateTime = TimeCurrent();
       return ATR;
   }

Achten Sie hier auf die kommentierte Zeile am Ende. Ich habe diesen Indikator leicht modifiziert, sodass er mit relativen Werten arbeitet. Dies ist notwendig, damit wir nicht für jedes Handelsinstrument eine eigene Gewichtung vornehmen müssen. Stattdessen wird dies automatisch auf der Grundlage des aktuellen Preises geschehen. Dies wird eine effizientere Optimierung in mehreren Währungen ermöglichen. Wir brauchen ihn, um zu beweisen, dass selbst ein solch einfacher Algorithmus, wenn er richtig angewendet wird, einen kleinen, aber ausreichenden Zeitraum für den Handel bieten kann. In Kombination mit anderen Methoden der Effizienz kann dieser Handel durchaus akzeptabel gemacht werden, sogar auf dem Niveau, das derzeit ein EA erlaubt.

Ich habe die Vorgaben selbst implementiert. Es war sehr einfach. Schauen wir uns eine von ihnen an, sagen wir die erste:

   //to open buy positions
   bool bBuy()
      {
      //determine if an open position is already present
      bool ord;
      ulong ticket;
      bool bOpened=false;
      for ( int i=0; i<PositionsTotal(); i++ )
         {
         ticket=PositionGetTicket(i);
         ord=PositionSelectByTicket(ticket);
         if ( ord && PositionGetInteger(POSITION_MAGIC) == MagicF)
            {
            bOpened=true;
            return false;
            }
         }
         
      if (!bOpened && EMAValues[1] > 0.0)//only if nothing is open and the indicator has been calculated 
         {
         //K - control ratio
         //RSIPercentBorder - control RSI
         double Val1=Charts[chartindex].CloseI[1]-EMAValues[1];
         double Val2=ATRValues[1]*(1.0/K);
         if (Val1 > 0 && Val1 < Val2 && RSIValues[1] < RSIPercentBorder) return true;         
         } 
      return false;
      }

Die Vorgabe für die Eröffnung einer Verkaufsposition ist bis auf wenige Ausnahmen ähnlich. Die Vorgabe zum Schließen ist noch einfacher:

   //to close a buy position
   bool bCloseBuy()
      {
      if (SMA1Values[1] > 0.0)
         {
         if (Charts[chartindex].CloseI[1] < SMA1Values[1] || Charts[chartindex].CloseI[1] > BollingerBandsUpperValues[1] )
            {
            return true;
            }
         }
      return false;   
      }

All dies funktioniert auf sehr einfache Weise:

   IndicatorDataRecalculate();//recalculate indicators

   if ( bCloseBuy() )
      {
         CloseBuyF();
      }
   if ( bCloseSell() )
      {
         CloseSellF();  
      }
   if ( bBuy() )
      {
         BuyF();
      }
   if ( bSell() )
      {
         SellF();
      } 

Ich denke, es ist so einfach wie möglich, und es gibt keinen Grund, es komplizierter zu machen. All dieser Code sollte ausgeführt werden, wenn ein neuer Balken erscheint. Ich habe die Visualisierung der Indikatoren separat implementiert. Das Einzige, was mir nicht gefällt, ist, dass Indikatoren wie ATR und RSI so konzipiert sind, dass sie in einem separaten Fenster angezeigt werden. Ich habe meine Version ihrer Darstellung so gestaltet, dass sie auch an den Preis gebunden sind, da ein separates Fenster nicht künstlich erstellt werden kann, und, ehrlich gesagt, werden sie nicht wirklich benötigt. Um dies zu erreichen, habe ich ein bestimmtes Paradigma für das Zeichnen von Fensterindikatoren entwickelt.

  1. Eingabe des Kontrollwerts „Prozent“, um aus einem Korridor drei zu machen.
  2. Ermittlung der maximalen (Max) und minimalen (Min) Indikatorwerte für das gesamte Array der gespeicherten Werte.
  3. Berechnung des Deltas des gegebenen Korridors (Delta = Max - Min).
  4. Berechnung des oberen Korridors der erhöhten Werte (HighBorder = Max - Delta * Percent / 100).
  5. Berechnung des unteren Korridors der erhöhten Werte (LowBorder = Min + Delta * Percent / 100).
  6. Der mittlere Korridor ist bereits festgelegt, da sowohl der obere als auch der untere Korridor festgelegt wurden.

Liegt der aktuelle Wert des Indikators in einem der Korridore, so erhalten seine Punkte die dem Korridor entsprechende Farbe. Ganz einfach. Auf diese Weise können wir Werte an die Balken des Diagramms binden und z. B. einfach ihre Farbe entsprechend ändern oder einfach Objekte erstellen, die mit dem Balken verknüpft sind und die entsprechende Farbe haben. Wie viele wahrscheinlich bemerkt haben, habe ich mich vom RSI-Indikator inspirieren lassen, da diese besondere Struktur normalerweise für den Handel verwendet wird. Diese Bereiche werden dort als überkaufte und überverkaufte Zonen bezeichnet.

Ich denke, dass dieser Code hier nicht so wichtig ist, weil er am wenigsten mit der Umsetzung unserer Aufgabe zu tun hat, sondern nur bei der Korrektur möglicher Fehler und Verbesserungen hilft. Wenn Sie möchten, können Sie diese Darstellung auch mit ChatGPT realisieren. Ich denke jedoch, dass es sich lohnt, zu zeigen, wie diese Darstellung funktioniert:

Visualisierung der Indikatoren

Hier wird alles so einfach wie möglich mit der alleinigen Hilfe des Objekttyps Linie erledigt. Wenn bei der Erstellung einer Linie der Anfangs- und der Endpunkt der Linie mit der gleichen Zeit und dem gleichen Preis verbunden sind, wird die Linie zu einem Punkt. Durch die Anpassung der Linienstärke wird das Gewicht des entsprechenden Punktes angepasst. Dies sind nur ein paar Lebenshilfen von mir, die ich schon sehr lange anwende.


Bewertung der Funktionsweise und Analyse der Ergebnisse

Obwohl ChatGPT diesen Algorithmus für optimal hält, wissen wir nicht, worauf diese Entscheidungen beruhen. Ein guter Backtest oder echter Handel kann als Maßstab für die Effizienz dienen. Ich hoffe, dass jeder versteht, dass dem realen Handel eine optimale Einstellung vorausgehen sollte, die mit dem MetaTrader 5 Optimizer vorgenommen werden kann. Aufgrund der Tatsache, dass dieses Terminal die Möglichkeit der Multi-Währungs-Optimierung hat und angesichts der Fähigkeiten meines Templates, das die Effektivität dieses Tools voll ausnutzt, können wir den EA sicher für alle „28“ Währungspaare optimieren. Vielleicht lohnt es sich nicht, sie aufzulisten. Es sei jedoch auf die offensichtlichen Vorteile dieses Ansatzes hingewiesen:

  1. Automatische Suche nach Multi-Währungs-Mustern.
  2. Multi-Währungs-Mustern haben mehr Gewicht und eine bessere Anpassung an Marktveränderungen.
  3. Es werden mehr Handelsgeschäfte getätigt, da jedes Handelsinstrument etwas Eigenes bietet.
  4. Zeitersparnis (Sie müssen nicht jedes Werkzeug einzeln optimieren.)

Natürlich gibt es auch Schattenseiten. In diesem Fall ist das Wichtigste die Unmöglichkeit der Feinabstimmung für jedes Instrument. Natürlich kann dieses Problem durch die Einführung zusätzlicher Funktionen gelöst werden, aber das ist nicht das Thema dieses Artikels. Aber es reicht nicht aus, diese Optimierung durchzuführen, sondern es ist auch wichtig, die Ergebnisse aus dem gesamten Spektrum, das sie Ihnen bietet, richtig auszuwählen. Ich habe mich für die optimale Variante entschieden:

Optimale Optimierungsmöglichkeit

Wie man sieht, habe ich von „2018“ bis „2023“ unter Verwendung des „H4“-Zeitrahmens optimiert und die ganzen sechs Monate in „2023“ für die Vorwärtsentwicklung verwendet. Wie man sieht, haben wir trotz der alles andere als perfekten Gewinnkurve im Optimierungsabschnitt noch ein paar Monate für profitables Trading, und diese Tatsache bedeutet, dass die Strategie nicht ohne Bedeutung ist und das Potenzial hat, erfolgreich für den Handel eingesetzt zu werden. Viele optimierbare Handelssysteme würden wahrscheinlich nicht einmal annähernd an dieses Ergebnis herankommen. Manchmal kann man unglaublich coole Systeme in Bezug auf den Code testen, ohne solche Ergebnisse zu erhalten.

Ich würde diesem Algorithmus noch eine Menge hinzufügen. Für mich ist es ein Spielplatz. Aber es sei gesagt, dass es gar nicht so sehr darauf ankommt, sondern auf das Expansionspotenzial des entstehenden EA. Dabei spielt nicht der vorgeschlagene Algorithmus eine Rolle, sondern Ihre Kompetenz und Kreativität. Sie benötigen wichtige Eigenschaften für eine erfolgreiche Integration in den MQL5-Entwicklungsprozess:

  • Programmierkenntnisse (obligatorisch).
  • Mathematikkenntnisse (wünschenswert).
  • Blockdenken.
  • Fähigkeit, Aufgaben zu vereinfachen und in einzelne Phasen zu unterteilen.
  • Die Tatsache zu verstehen, dass ChatGPT nur ein Werkzeug ist, sodass es keinen Sinn hat, es für Dinge zu beschuldigen, die nicht funktionieren (es liegt an Ihnen, alles, was nicht funktioniert, zu reparieren.)
  • Korrekte Interpretation der erzielten Handelsergebnisse.
  • Erkenntnis, dass das Modell trotzdem Fehler macht, aber das sollte Sie nicht stören (die Hauptsache ist, dass Sie die Kosten für die Entwicklungsarbeit reduziert haben).
  • Entwicklung einer eigenen Anwendungsstruktur (dies ist natürlich nicht notwendig, Sie können auch meinen Ansatz verwenden).
  • ChatGPT ist Ihr Begleiter, dessen Stärke von Ihnen abhängt. Je geduldiger, klüger und einfallsreicher Sie sind, desto effektiver ist dieser Begleiter.

Sie haben ein Werkzeug, das Sie nach eigenem Ermessen nutzen oder nicht nutzen können, aber ich kann definitiv sagen, dass dieses Werkzeug für mich in vielerlei Hinsicht sehr nützlich war, einschließlich der Programmierung.


Schlussfolgerung

In der Tat ist es nicht notwendig, sich an mein Modell zur Verwendung dieses Instruments zu halten. Ich habe viele Dinge damit ausprobiert, und ich kann sagen, dass die Möglichkeiten fast grenzenlos sind. Natürlich werden Sie, so wie ich, einiges an Zeit und Mühe investieren, bevor Sie Erfolg haben.

Trotzdem rate ich Ihnen, dieses Tool auszuprobieren und Ihre Zeit nicht zu verschwenden. Die Nutzung von ChatGPT ermöglicht es Ihnen zumindest, die richtige Einstellung zur künstlichen Intelligenz zu entwickeln. Diese Technologie lässt sich potenziell in fast jede Entwicklungskette integrieren. Ich bin mir sicher, dass dies erst der Anfang ist und dass Veränderungen vor der Tür stehen. Ich empfehle Ihnen, sich so bald wie möglich mit diesem Werkzeug vertraut zu machen und zu versuchen, es bei möglichst vielen Aufgaben einzusetzen.

Übersetzt aus dem Russischen von MetaQuotes Ltd.
Originalartikel: https://www.mql5.com/ru/articles/12475

Beigefügte Dateien |
ChatGPT_bot.set (2.99 KB)
ChatGPT_bot.mq5 (145.44 KB)
DoEasy. Steuerung (Teil 32): Horizontale ScrollBar, Scrollen mit dem Mausrad DoEasy. Steuerung (Teil 32): Horizontale ScrollBar, Scrollen mit dem Mausrad
In diesem Artikel werden wir die Entwicklung der Funktionalität des horizontalen Rollbalkenobjekts abschließen. Wir werden auch die Möglichkeit schaffen, den Inhalt des Containers durch Bewegen des Schiebereglers und Drehen des Mausrades zu scrollen, sowie Ergänzungen zur Bibliothek vornehmen, die die neue Auftragsausführungspolitik und die neuen Laufzeitfehlercodes in MQL5 berücksichtigen.
ONNX-Modelle in Klassen packen ONNX-Modelle in Klassen packen
Die objektorientierte Programmierung ermöglicht die Erstellung eines kompakteren Codes, der leicht zu lesen und zu ändern ist. Hier sehen wir uns das Beispiel für drei ONNX-Modelle an.
Entwicklung eines Replay-Systems — Marktsimulation (Teil 05): Hinzufügen einer Vorschau Entwicklung eines Replay-Systems — Marktsimulation (Teil 05): Hinzufügen einer Vorschau
Es ist uns gelungen, einen Weg zu finden, das Replay-System (Marktwiederholungssystem) auf realistische und zugängliche Weise umzusetzen. Lassen Sie uns nun unser Projekt fortsetzen und Daten hinzufügen, um das Wiedergabeverhalten zu verbessern.
Entwicklung eines MQTT-Clients für MetaTrader 5: ein TDD-Ansatz Entwicklung eines MQTT-Clients für MetaTrader 5: ein TDD-Ansatz
Dieser Artikel berichtet über die ersten Versuche bei der Entwicklung eines nativen MQTT-Clients für MQL5. MQTT ist ein Client-Server-Publish/Subscribe-Messaging-Transportprotokoll. Es ist leichtgewichtig, offen, einfach und so konzipiert, dass sie leicht zu implementieren ist. Diese Eigenschaften machen es ideal für den Einsatz in vielen Situationen.