Diskussion zum Artikel "Erstellen multimodularer Expert Advisors"

 

Neuer Artikel Erstellen multimodularer Expert Advisors :

Die Programmiersprache MQL erlaubt es, das Konzept der modularen Programmierung von Handelsstrategien umzusetzen. Der Artikel schildert ein Beispiel für die Erstellung eines multimodularen Expert Advisors, der aus separat kompilierten Dateimodulen besteht.

Die einzige Alternative zu Modularität ist ein monolithisches Programm. Es ist jedoch nicht besonders praktisch: wenn Sie einige Funktionen des Programms ändern oder ergänzen wollen, muss der Code des Expert Advisors modifiziert werden. In den meisten Fällen kann das aber nur der Autor des Codes oder ein erfahrener Programmierer implementieren. Wenn das monolithische Programm dazu noch kompiliert wurde, kann dieses Produkt nur vom Urheberrechtsinhaber geändert werden. Vor diesem Hintergrund sieht viel praktischer die Möglichkeit aus, wichtige Funktionen des Programms selbst oder mit Hilfe von Drittentwicklern zu modifizieren, ohne den Autor involvieren zu müssen.

Abb. 1. Modularer Handelsroboter.

Abb. 1. Abstraktes Schema eines modularen Handelsroboters

Autor: Sergey Pavlov

 
Was für eine ungewöhnliche These: "Ein (externes) Zusatzmodul ist ein Indikator", und hat der Autor die Leistung und insbesondere den Ressourcenverbrauch eines solchen Entwurfs getestet?
 

Die Multimodularität eines Handelssystems wird in erster Linie durch die Art des Prozesses bestimmt (bei Finanzmärkten ist die Preisbewegung ein nicht-stationärer Prozess).

Und die Modellierung eines solch komplexen Prozesses (denn die EA-Entwicklung ist immer eine Prozessmodellierung) ist mit Hilfe eines einzigen, sogar sehr komplexen Eingabealgorithmus unmöglich. Um dem Prozess in Bezug auf die Genauigkeit näher zu kommen, benötigen wir eine Reihe von Algorithmen (Modulen), von denen jeder ein unabhängiges Modell darstellt.

 
Aleksandr Masterskikh:

Die Multimodularität des Handelssystems wird in erster Linie durch die Art des Prozesses bestimmt (bei Finanzmärkten ist die Preisbewegung ein nicht-stationärer Prozess).

Und die Modellierung eines solch komplexen Prozesses (denn die EA-Entwicklung ist immer eine Prozessmodellierung) ist mit Hilfe eines einzigen, sogar sehr komplexen Eingabealgorithmus unmöglich. Um dem Prozess in Bezug auf die Genauigkeit näher zu kommen, benötigen wir eine Reihe von Algorithmen (Modulen), von denen jeder ein unabhängiges Modell ist.

Ja, ja, ich denke, dieser Ansatz wird von der Mehrheit der Leute verwendet - sie implementieren sie durch Funktionen und Klassen, im Extremfall fügen sie einfach ein Stück Code aus einer anderen Datei ein. Ich frage mich nur, worin der Vorteil der Datenverarbeitung in Indikatoren gegenüber den oben beschriebenen Ansätzen besteht.

 
Modularität um der Modularität willen?
trall und lossless in 2 verschiedenen separaten Modulen unterbringen? Wirklich?
der Autor hat sich wahrscheinlich noch nie mit Optimierung beschäftigt, besonders nicht in Mt4.
Die meisten Autoren schreiben mit solchen Methoden, die einfachsten Funktionen werden in einem separaten Modul untergebracht, das Dutzende Male pro Tick aufgerufen wird.
Solche Lösungen erhöhen die Optimierungszeit um das Zehn- bis Tausendfache.
 
Aleksey Vyazmikin:
Was für eine ungewöhnliche These "Auxiliary (externe) Modul ist ein Indikator", und der Autor hat die Leistung und vor allem den Ressourcenverbrauch eines solchen Designs getestet?

Der Artikel wurde geboren, nachdem ich ein Problem mit der Leistung eines Indikators konfrontiert. Er verbrauchte Ressourcen und Testzeit. Und da er zur Erzeugung von Handelssignalen verwendet wurde, habe ich stattdessen ein externes Modul (Signalindikator) erstellt, das nichts zeichnete. Das Ergebnis war, dass der Expert Advisor mit dem externen Modul "flog", obwohl alle Berechnungen in vollem Umfang erhalten blieben.

Ich stimme mit Ihnen überein, dass jede Technologie ihre Kosten hat. Hier muss man einen Kompromiss eingehen und entscheiden, was wichtiger ist. Manchmal ist es wichtiger, den Algorithmus zu verbergen, als die Leistung. Obwohl die Leistung bei der modularen Programmierung abnimmt, ist sie nicht entscheidend. In der Abbildung habe ich alle externen Module an ein Diagramm "gehängt":


Dann habe ich die Belastung des Expert Advisors selbst überprüft: im Betriebsmodus ohne und mit externen Modulen. Das Ergebnis war zufriedenstellend:


Dann habe ich ihn im Strategietester laufen lassen.

Ohne externe Module:

2018.03.26 06:32:23.684 Core 1  EURUSD,M1: 2378530 ticks, 24349 bars generated. Environment synchronized in 0:00:00.140. Test passed in 0:00:07.769 (including ticks preprocessing 0:00:00.171).


Und mit externen Modulen:

2018.03.26 06:33:49.859 Core 1  EURUSD,M1: 2378530 ticks, 24349 bars generated. Environment synchronized in 0:00:00.047. Test passed in 0:00:06.349.

Wie Sie sehen können, war der Test mit externen Modulen schneller beendet.

Der Zweck dieses Artikels ist es, zu zeigen, wie man seine Algorithmen verstecken kann, indem man sie in den Codes anderer Leute verwendet.

 
Nikolay Khrushchev:
Modularität um der Modularität willen?
trall und no-loss in 2 verschiedenen separaten Modulen? wirklich?
...

Der Artikel zeigt die Technik der modularen Programmierung: jede notwendige Funktion oder Gruppe von Funktionen kann in einem externen Modul (oder mehreren) versteckt werden.

 
Sergey Pavlov:

Der Artikel entstand, nachdem ich ein Problem mit der Leistung eines Indikators hatte. Er verschlang Ressourcen und Testzeit. Und da er zur Generierung von Handelssignalen verwendet wurde, habe ich an seiner Stelle ein externes Modul (Signalindikator) erstellt, das nichts zeichnete. Das Ergebnis war, dass der Expert Advisor mit dem externen Modul "flog", obwohl alle Berechnungen in vollem Umfang erhalten blieben.

Ich stimme mit Ihnen überein, dass jede Technologie ihre Kosten hat. Hier muss man einen Kompromiss eingehen und entscheiden, was wichtiger ist. Manchmal ist es wichtiger, den Algorithmus zu verbergen, als die Leistung. Obwohl die Leistung bei der modularen Programmierung abnimmt, ist sie nicht entscheidend. In der Abbildung habe ich alle externen Module an ein Diagramm "gehängt":


Dann habe ich die Auslastung des Expert Advisors selbst überprüft: in der Betriebsart ohne und mit externen Modulen. Das Ergebnis ist zufriedenstellend:


Dann habe ich ihn im Strategietester ausgeführt.

Ohne externe Module:


Und mit externen Modulen:

Wie Sie sehen können, endete der Test mit externen Modulen schneller.

Der Zweck des Artikels ist es, zu zeigen, wie man seine Algorithmen verstecken kann, indem man sie in den Codes anderer Leute verwendet.

Vielen Dank für Ihre ausführliche Antwort. Als Möglichkeit, einen Teil des Codes zu verstecken, ist es vielleicht eine Option. Aber wer braucht so ein Modul, d.h. man kann es nicht über den Markt verkaufen, in der Freiberuflichkeit werden die Leute den Quellcode verlangen, es bleibt nur eine Möglichkeit - für die öffentliche Nutzung im Internet, und hier ist es verboten, kompilierte Dateien zu veröffentlichen.

Die Möglichkeit, Berechnungen aufgrund des verwendeten Indikators zu beschleunigen - ein vertrautes Thema, es ist manchmal wirklich praktisch und erlaubt es, Zyklen im Expert Advisor loszuwerden. Ich fange gerade erst an, an einem solchen Indikator zu arbeiten.

 
Aleksey Vyazmikin:

Ja, ja, dieser Ansatz wird, denke ich, von den meisten Leuten verwendet - sie implementieren es durch Funktionen und Klassen, im Extremfall fügen sie einfach ein Stück Code aus einer anderen Datei ein. Ich frage mich nur, was der Vorteil der Datenverarbeitung in Indikatoren im Vergleich zu den oben beschriebenen Ansätzen ist.

Es ist wichtig zu unterscheiden zwischen:

- der Modularität eines Programms (wenn ein einfaches Modell in Module unterteilt wird)

- und der Modularität eines komplexen Modells (bei dem jedes Modul ein unabhängiges Modell ist).


Jeder herkömmliche Indikator ist ein einfaches Modell, und es wird ein komplexes Modell benötigt,

weil ein einfaches Modell nicht ausreicht, um eine ausreichend genaue

Darstellung des Prozesses zu erhalten.

 
Aleksandr Masterskikh:

Es ist wichtig, zwischen diesen beiden Aspekten zu unterscheiden:

- Modularität des Programms (wenn ein einfaches Modell in Module unterteilt wird)

- und die Modularität eines komplexen Modells (bei dem jedes Modul ein unabhängiges Modell ist).


Jeder traditionelle Indikator ist ein einfaches Modell, aber wir brauchen ein komplexes Modell,

weil ein einfaches Modell nicht ausreicht, um eine ausreichende Genauigkeit zu erzielen

des Prozesses zu erreichen.

Nehmen wir an, dass ich nicht weiß, was die Modularität eines komplexen Modells ist, dann hat sich mein Wissen durch Ihren Kommentar nicht erweitert.

Nennen Sie ein Beispiel für ein komplexes Modell, das in den Indikator eingebettet ist.

 

Als Nichtfachmann fand ich den Artikel sehr informativ und gut für Anfänger geeignet.

Aber was die Modularität angeht, ist das Beispiel meiner Meinung nach nicht vollständig. Mir scheint, wenn in demselben Beispiel jede Funktion des Hauptmoduls in einer separaten Datei geschrieben und dann mit Hilfe von bedingter Kompilierung und Inludes in einer Datei zusammengefasst wird - dann ist das modulares Schreiben. In diesem Fall kann jeder einzelne Teil umgeschrieben werden, ohne den Hauptcode zu beeinflussen.

Ein Beispiel: Statt des Codes:

 if(on_lot)
     { // Wenn es ein zusätzliches Modul gibt
      double buffer_m1[];
      ArraySetAsSeries(buffer_m1,true);
      if(CopyBuffer(handle_m1,0,0,1,buffer_m1)<0) return;
      lot=buffer_m1[0];
     }

Code:

 if(on_lot)
     { 
        LotCulcFuntion(lot);//Diese Funktion ist in einer separaten Datei implementiert.
     }

P.S. Die Namen der modularen Indikatoren in der Hauptdatei stimmen nicht mit den Dateinamen überein. Im Hauptmodul müssen Sie "_ind" hinzufügen, z.B. sollte es lauten "Modul_Ausbildung_modul_Filter_ind". und nicht " Modul_Ausbildung_modul_Filter".