Diskussion zum Artikel "Universeller Expert Advisor: Pending Orders und Hedging Support (Part 5)" - Seite 2

[Gelöscht]  
Vasiliy Sokolov:
Voreingenommenheit gegenüber const-Methoden. Ich wurde Programmierer in C# - und dort gibt es das nicht, weil die durch den Modifikator auferlegte Beschränkung nicht wirksam ist.

Ich dachte naiverweise, dass dieser Modifikator dem Compiler auch mitteilt, wo er beim Kompilieren optimalen nativen Code erstellen soll....

Ich verwende ihn selbst zur Selbstkontrolle.

[Gelöscht]  
Vasiliy Sokolov:

Die meiste Zeit im Strategietester wird für die Arbeit der Infrastruktur aufgewendet (Scrollen der Balken, Emulation der Handelsumgebung usw.). Der Expert Advisor-Code selbst benötigt viel weniger Zeit.

Andererseits hat das Profiling gezeigt, dass die wichtigsten ressourcenintensiven Methoden von CSTartegy die BuyInit-, SellInit-, BuySupport- und SellSupport-Methoden sind - d.h. die Expert Advisor-Logik selbst. Alle anderen Methoden werden in optimaler Weise in flachen Code kompiliert oder einfach weggelassen, wenn sie nicht gebraucht werden. Deshalb ist die OOP-Programmierung auf hoher Ebene gerechtfertigt.

Beachten Sie, dass bei mehr oder weniger komplexen Expert Advisors mit vielen Regeln und einer umfangreichen Infrastruktur die Programmierung in einer ursprünglich flachen Form (ohne Funktionen und OOP) zu unvermeidlichen Programmierfehlern führen wird, und dass die Leistung eines solchen Expert Advisors infolgedessen noch geringer sein wird als mit OOP. Die Zeiten von Assembler sind vorbei. Der Compiler hat den Menschen in bestimmten Bereichen der Optimierung schon längst besiegt. Es bleibt dem Menschen überlassen, eine zunächst kompetente und skalierbare Architektur mit einer minimalen Anzahl von Schnittstellen und guter Handhabbarkeit zu definieren.
.

Ich bin mit Händen und Füßen für OOP. Solange sich dahinter nicht nur Krückenlösungen verstecken, wie bei Multisymbol OnTick. Was offiziell von Entwicklern nicht als Krückenlösung angesehen wird.
 
Anton Zverev:

Ich dachte naiverweise, dass dieser Modifikator dem Compiler auch mitteilt, wo er bei der Kompilierung optimalen nativen Code erstellen soll.....

Ich verwende ihn selbst zur Selbstkontrolle.

Vielleicht ist das in C++ und MQL genau der Fall, aber... Ich habe es nie verstanden.
 
Anton Zverev:
Ich bin mit Händen und Füßen für OOP. Solange sich dahinter nicht nur Krückenlösungen verstecken, wie bei Multisymbol OnTick. Was offiziell von Entwicklern als keine Krückenlösung angesehen wird.

Leider kann man hier auf der Benutzerebene nichts machen. Obwohl OnTick in CStrtategy multivalent ist, wird seine Multivalenz auch durch Krücken emuliert. Es wird einfach bei jedem eingehenden Ereignis der Tick eines anderen Instruments abgefragt, und wenn er sich geändert hat, wird ein neues OnTick-Ereignis für dieses Instrument erzeugt. Bei FORTS bietet CStrategy übrigens dank des OnBookEvent-Ereignisses ein echtes Multicurrency-OnTick. Aber auch hier handelt es sich um eine Emulation bei der Arbeit im Testprogramm.

Eine weitere Möglichkeit besteht darin, CStrategy mit einem Ressourcenindikator zu versehen. Beim Start startet CStrategy eine Instanz dieses Indikators auf dem erforderlichen Symbol und empfängt von ihm das Ereignis eines neuen Ticks. Dann wird es in OnTick CStrategy umgewandelt. Das ist eine klassische Krücke, aber die gesamte Implementierung ist meisterhaft hinter den Kulissen versteckt, und jede Strategie arbeitet auf einheitliche Weise, ohne zu wissen, wie diese Ticks empfangen wurden.

[Gelöscht]  
Vasiliy Sokolov:

Leider kann hier auf Benutzerebene nichts getan werden. Obwohl OnTick in CStrtategy mehrwährungsfähig ist, wird die Mehrwährungsfähigkeit auch durch Krücken emuliert. Es wird einfach bei jedem eingehenden Ereignis der Tick eines anderen Instruments abgefragt, und wenn er sich geändert hat, wird ein neues OnTick-Ereignis für dieses Instrument erzeugt. Bei FORTS bietet CStrategy übrigens dank des OnBookEvent-Ereignisses ein echtes Multicurrency-OnTick. Aber auch hier handelt es sich um eine Emulation bei der Arbeit im Testprogramm.

Leider fehlen bei diesem Ansatz die Ticks.

Eine andere Möglichkeit besteht darin, CStrategy mit einem Ressourcenindikator zu versehen. Beim Start startet CStrategy eine Instanz dieses Indikators auf dem erforderlichen Symbol und empfängt von ihm das Ereignis der Ankunft eines neuen Ticks. Dann wird es in OnTick CStrategy umgewandelt. Das ist eine klassische Krückenvariante, aber die gesamte Implementierung ist meisterhaft hinter den Kulissen versteckt, und jede Strategie arbeitet auf einheitliche Weise, ohne zu wissen, wie diese Ticks empfangen wurden.

Ja, diese Variante und von den Entwicklern genehmigt. Aber IMHO erscheint sie furchtbar krückenhaft, wenn man bedenkt, wie die Ressourcen eines optimierten Testers für eine Aufgabe verschwendet werden, die für andere Plattformen die einfachste ist. OOP versteckt die Krücke sicherlich meisterhaft.
 
Anton Zverev:

Leider geht dieser Ansatz daneben.

Ja, diese Option wird von den Entwicklern befürwortet. Aber IMHO erscheint sie furchtbar krüppelhaft, wenn man bedenkt, wie die Ressourcen eines optimierten Testers für die einfachste Aufgabe auf anderen Plattformen verwendet werden. OOP versteckt die Krücke sicherlich meisterhaft.
Nun, so schlimm ist es nicht. Denn die Indikatoren in MQL sind sehr schnell und arbeiten in ihrem eigenen Thread. Es stellt sich heraus, dass wir einen Mini-Listener starten, der uns das Eintreffen eines neuen Ereignisses meldet. Ich werde über diese Implementierung in den nächsten Teilen des Artikels nachdenken.
 
Ich habe diagonal gelesen, sehr nützliche Artikel, ich komme kaum durch - vielleicht habe ich etwas übersehen, ich interessiere mich für Anhänger, aber viele Daten fehlen im Impuls, bitte Fingerzeig... oder muss ich sie selbst eingeben?????
'Ask' - function not defined    Impulse.mqh     51      20
'Ask' - function not defined    Impulse.mqh     51      28
'PendingOrders' - undeclared identifier Impulse.mqh     56      16
'GetOrder' - object pointer expected    Impulse.mqh     58      44
'IsMain' - member function not defined  Impulse.mqh     59      34
'Modify' - member function not defined  Impulse.mqh     66      19
'Delete' - member function not defined  Impulse.mqh     69      19
'Bid' - function not defined    Impulse.mqh     85      20
'Bid' - function not defined    Impulse.mqh     85      28
'PendingOrders' - undeclared identifier Impulse.mqh     90      16
'GetOrder' - object pointer expected    Impulse.mqh     92      44
'IsMain' - member function not defined  Impulse.mqh     93      34
'Modify' - member function not defined  Impulse.mqh     100     19
'Delete' - member function not defined  Impulse.mqh     103     19
'Bid' - function not defined    Impulse.mqh     118     23
'Bid' - function not defined    Impulse.mqh     118     31
'Bid' - function not defined    Impulse.mqh     124     7
'Ask' - function not defined    Impulse.mqh     136     23
'Ask' - function not defined    Impulse.mqh     136     31
'Ask' - function not defined    Impulse.mqh     142     7
20 error(s), 0 warning(s)               21      1
 
Сергей Криушин:
Ich habe diagonal gelesen, sehr nützliche Artikel, ich komme kaum durch - vielleicht habe ich etwas übersehen, ich interessiere mich für Anhänger, aber viele Daten fehlen im Impuls, bitte Fingerzeig... oder muss ich sie selbst eingeben????
Schönen guten Tag. Bitte aktualisieren Sie die Trading Engine auf die neueste Version. Sie ist dem fünften Teil des Artikels beigefügt.
 
Сергей Криушин:
Ich habe diagonal gelesen, sehr nützliche Artikel, ich komme kaum durch - vielleicht habe ich etwas übersehen, ich interessiere mich für Anhänger, aber viele Daten fehlen im Impuls, bitte Fingerzeig... oder muss ich sie selbst eingeben????
Wenn Sie etwas nicht verstehen, können Sie in diesem Thread Fragen stellen.
 
Vasiliy Sokolov:
Wenn du etwas nicht verstehst, kannst du in diesem Thread Fragen stellen.
Es funktioniert nicht - diese Zeilen sind nicht in Impulse selbst....