Weniger Code, mehr Action... einen EA schreiben - Seite 2

 
Maxim Kuznetsov:

der Use-Case-Stil ist grundsätzlich verfahrensorientiert, da er am weitesten verbreitet ist. Potenzielle Benutzer(unerfahrene Programmierer) schreiben auf diese Weise.

Was ich meine, ist, dass Ihr Stil im Wesentlichen prozedural ist. Das heißt, es handelt sich sowohl um ein inneres als auch um ein äußeres Verfahren, mit allen sich daraus ergebenden Problemen. Auf der Benutzerebene können Sie grundsätzlich keine Einzelheiten der Implementierung offenlegen. Und Sie haben eine ganz bestimmte Sache in Ihrem Code auf der Benutzerebene vor sich:

double GetData(EA *ea,int id,int shift,double &data[])
{
#ifdef __MQL4__
   // для 4-ки всё просто - по идентификаторам серии и бара получить данные
   switch ((ENUM_SERIES)id) {
      case FAST_MA:
         return data[shift]=iMA(ea.Symbol,ea.Period,FAST_MA_PERIOD,0,FAST_MA_METHOD,FAST_MA_PRICE,shift);
      case SLOW_MA:
         return data[shift]=iMA(ea.Symbol,ea.Period,SLOW_MA_PERIOD,0,SLOW_MA_METHOD,SLOW_MA_PRICE,shift);
   }
   return EMPTY_VALUE;
#else
   ...
#endif
}

Bedingte Kompilierungsmakros, Aufrufe bestimmter MA-Funktionsimplementierungen usw. usw. D.h. nicht OOP, nicht FP, sondern diese Art der matten prozeduralen Programmierung. Und als Sahnehäubchen: ea.Symbol, d.h. formal gesehen, ist es immer noch OOP.

 
Maxim Kuznetsov:

Ich werde versuchen (oder werde versuchen, wenn Interesse besteht), eine Grundlage für EAs zu schaffen.

Das Ergebnis wird (für die meisten Menschen) genauso nutzlos sein wie alle anderen in diesem Thread genannten.

weil Sie sofort versuchen, auf Ihre eigene Art und Weise zu schreiben, anstatt gut zu sein, genau wie die Autoren der genannten Werke.

 
Vasiliy Sokolov:

Ich meine damit, dass Ihr Stil prozessorientiert ist. Das heißt, sie ist sowohl intern als auch extern verfahrensorientiert, mit all den damit verbundenen Problemen. Auf der Benutzerebene können die Einzelheiten der Umsetzung grundsätzlich nicht offengelegt werden. Und Sie haben eine ganz bestimmte Sache in Ihrem Code auf der Benutzerebene vor sich:

Bedingte Kompilierungsmakros, Aufrufe bestimmter MA-Funktionsimplementierungen usw. usw. D.h. nicht OOP, nicht FP, sondern diese Art der matten prozeduralen Programmierung. Und als Sahnehäubchen: ea.Symbol, d.h. formell ist es immer noch OOP.

Auch hier wird der Anwendungsfall aus der vermuteten Sicht der potenziellen Nutzer geschrieben.

Aber in einem Ausmaß, das ausreicht, um zur Bibliothek zu gelangen, ohne den eigentlichen Anwendungsfall zu berühren.

Wir müssen die bedingte Kompilierung verwenden, da sowohl 4 als auch 5 im Forum stehen.


 
Maxim Kuznetsov:

Auch hier wird der Anwendungsfall aus der angenommenen Perspektive der potenziellen Nutzer geschrieben.

Um es anders zu formulieren: Wo ist die prozedurale Anforderung, Aufrufe von spezifischen plattformabhängigen Funktionen wie iMA(...) einzufügen?

Maxim Kuznetsov:

Aber in ausreichendem Umfang, damit man die Bibliothek starten kann, ohne den eigentlichen Anwendungsfall zu berühren.

Wie können wir das tun, wenn der Anwendungsfall voll von spezifischen Aufrufen plattformabhängiger Funktionen ist?

Maxim Kuznetsov:

Sie müssen die bedingte Kompilierung verwenden, weil es sowohl 4 als auch 5 im Forum gibt.

Der "universelle Code" auf Benutzerebene kann also nicht einmal plattformunabhängig sein?

 
Maxim Kuznetsov:

...

Wenn wir über User-Cases sprechen - Gebot Nummer eins: keine spezifischen Implementierungen auf dieser Ebene. Aber auf Benutzerebene sind Sie bereits vollständig abhängig von: 1) der Plattform und 2) der API des Terminals. D.h. die vorgeschlagene Umsetzung ist völlig unvereinbar mit dem erklärten Konzept.

 
Vasiliy Sokolov:

Wenn wir über User-Cases sprechen - Gebot Nummer eins: keine spezifischen Implementierungen auf dieser Ebene. Auf Benutzerebene sind Sie bereits vollständig abhängig von: 1) der Plattform und 2) der Terminal-API. D.h. die vorgeschlagene Implementierung entspricht überhaupt nicht dem angegebenen Konzept.

Im Allgemeinen schreiben die Entwickler in MQL, und für die API der Handels-Terminals MT4, MT5 :-) Daher ist die Verwendung der API-Terminal normal.

Der Anwendungsfall sollte die für den Bereich typischen Dinge demonstrieren/erfüllen. Nicht nur ein paar Zahlen hinzufügen, sondern einen verständlichen Zweck für den Benutzer haben, den wir erreichen wollen. Der kleinstmögliche Zweck von Expert Advisors ist der Handel :-) Der einfachste Expert Advisor, den ich mir vorstellen kann, ist der Handel auf Crossover-Durchschnitten. Der vollständige Wortlaut ist im Originalbeitrag enthalten.

Übrigens, es funktioniert. In diesem Moment werden statt der Handelsfunktionen Stubs und Häkchen gezeichnet :-) Ich schreibe/debugge die Daten. Sobald der Teil mit den Daten, wenn auch nur grob, aber diskussionsfähig ist, werde ich ihn veröffentlichen.


 
Maxim Kuznetsov:

Sie schreiben in der Regel in MQL und API von MT4, MT5 Handels-Terminals:-) so beziehen sich auf die API-Terminal ist normal.

Der Anwendungsfall sollte die für den Bereich typischen Dinge demonstrieren/erfüllen. Fügen Sie nicht einfach ein paar Zahlen hinzu, sondern haben Sie ein für den Benutzer verständliches Ziel, das wir erreichen wollen. Der kleinstmögliche Zweck von Expert Advisors ist der Handel :-) Der einfachste Expert Advisor, den ich mir vorstellen kann, ist der Handel auf Crossover-Durchschnitten. Der vollständige Wortlaut ist in der Quellenangabe zu finden

Und das funktioniert übrigens auch. Im Moment schreibe ich Daten und debugge sie, anstatt Funktionen zu handeln und Ticks zu zeichnen :-). Sobald ein Teil der Daten, wenn auch roh, aber bereit für die Diskussion sein wird - ich werde es auch posten

Sie schreiben es richtig. Aber der Benutzer versteht einen solchen Pseudocode viel besser:

if(SMA(Close, 12) > SMA(Close, 24))
   BUY();
else
   SELL();

Eine andere Sache ist, dass es sehr schwierig ist, es in dieser Form (verfahrenstechnisch, wie ich anmerke) zu realisieren, aber es ist dennoch möglich. Genau das sollte man versuchen zu erreichen - die Anweisungen auf Benutzerebene so einfach und abstrakt wie möglich zu gestalten. Aber in Ihrem Code muss der Benutzer bedingte Kompilierungsmakros, spezifische Funktionen zur Berechnung von Durchschnittswerten und andere technische Details angeben, die er einfach nicht handhaben kann.

 
Vasiliy Sokolov:

Um es anders zu formulieren: Wo ist es im prozeduralen Stil erforderlich, plattformspezifische Funktionsaufrufe wie iMA(...) einzufügen?

Wie unantastbar, wenn der Anwendungsfall mit spezifischen plattformabhängigen Funktionsaufrufen gespickt ist?

Der "universelle Code" auf Benutzerebene kann also nicht einmal plattformunabhängig sein?

4/5 Plattformen haben unterschiedliche APIs, das ist einfach so.

Ich schreibe keine weitere Kompatibilitätsschicht für alles oder eine Universalbibliothek. Auch wenn ich das nicht möchte :-)

nur die Grundlage für EAs.

 
Vasiliy Sokolov:

Nun, Sie schreiben es richtig. Aber der Benutzer versteht einen solchen Pseudocode viel besser:

Eine andere Sache ist, dass es viel schwieriger ist, es in dieser speziellen Form (verfahrensorientiert, wie ich feststelle) zu realisieren, aber es ist trotzdem möglich. Das ist es, was man erreichen sollte - Anweisungen auf Benutzerebene so einfach und abstrakt wie möglich zu gestalten. In Ihrem Code muss der Benutzer jedoch Makros für die bedingte Kompilierung, spezielle Funktionen für die Berechnung von Durchschnittswerten und andere technische Details angeben, mit denen er einfach nicht umgehen kann.

Im Prinzip können Sie einen Eintrag wie den von Ihnen zitierten in GetData OnCrossSignal verwenden. Möglicherweise können Sie sogar Skripte schreiben :-) Aber alles zu seiner Zeit... Die Datenverarbeitung ist als elektronische Tabelle aufgebaut.

 
Maxim Kuznetsov:

4/5 Plattformen haben unterschiedliche APIs, so ist das nun einmal.

Ich schreibe keine weitere Kompatibilitätsschicht für alles oder eine Universalbibliothek. Auch wenn ich das nicht möchte :-)

nur die Grundlage für EAs.

Schauen Sie sich den Code von Artem an. Sein Code hat eine einzige API, die von der Zielplattform unabhängig ist. Deshalb ist das Argument, dass "es so funktioniert", seltsam zu hören.