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

 
Maxim Kuznetsov:
Warum haben Sie den Beitrag über den nächsten Schritt gelöscht?

Bitte stellen Sie Ihre Arroganz auf die Probe. Und lesen Sie die Regeln der Ressource.

Ihr könnt alle in den Forenbeiträgen und in der Beschreibung in KodoBaz schreiben.

 
Maxim Kuznetsov:
Warum haben Sie den Beitrag über den nächsten Schritt gelöscht?

Ich habe den Beitrag gesehen und konnte nichts Kriminelles erkennen. Ich habe wohl nicht genau genug hingesehen.

 
Maxim Kuznetsov:

Natürlich sinkt der Saldo, was erwarten Sie denn von "zwei sich kreuzenden MAs"?


Sie können eine andere Basis für den EA nehmen - die MAs sind bei weitem nicht die beste Option.

 
aleger:

Sie können eine andere Basis für den EA nehmen - Mashki ist bei weitem nicht die beste Option.

Wenn Sie etwas genauer hinschauen, werden Sie feststellen, dass Sie bereits einige Dinge umsetzen können :-)

Es ergibt sich also folgendes:

* Der Anwendungsprogrammierer (Bibliotheksbenutzer) hat erklärt, dass er/sie über ein Mikroexcel mit mehreren Spalten verfügt (im Anwendungsfall sind dies FAST_MA,SLOW_MA,SIGNAL_BUY,SIGNAL_SELL)

* und skizzierte eine Funktion, wie er einzelne Zellen zu berechnen weiß. In dem Beispiel bezog er sich auf die iMA.

* gleichzeitig kann er frei auf andere Zellen dieser Tabelle zugreifen (DataFrame bricht Sequenzen, wenn möglich, auf)

* und separat schrieb der Benutzer die Funktion "Zeilenwerte prüfen und ob es Zeit zum Handeln ist"

Das reicht natürlich aus, damit der EA mit dem Handel beginnen kann. Und die Strategie kann sehr flexibel geändert werden - alles, was man sich als Tabellenkalkulation vorstellen kann, ist möglich.
Die andere Sache ist, dass dies nur der erste halbe Schritt ist :-) bis jetzt handelt der EA wie der Monkey-Shifter, nur mit dem minimalen Lot, auf einem Symbol und von einem Zeitrahmen.

 

In den ersten beiden Teilen haben wir einen Expert Advisor erhalten, der die einfachsten Strategien ausführen kann, die als "Monkeys" oder "Flips by Signal" bezeichnet werden.
Die Signale selbst sind sehr einfach programmiert, fast wie in Excel :-)

Es ist an der Zeit, dem Expert Advisor ein wenig mehr beizubringen. Legen Sie zumindest StopLoss und ziehen Sie es durch.

Ergänzen Sie die künstlerische Beschreibung der Strategie mit dem Satz "Stop Loss wird auf den Abstand STOPLOSS_POINTS gesetzt und durch Fraktale nachgezogen". Wir führen auch Änderungen an dem oben beschriebenen Anwendungsfall ein:

  • neue EA-Parameter Eingabe int STOPLOSS_POINTS=100;
  • zwei berechnete Felder UPPER_FRACTAL,LOWER_FRACTAL in ENUM_SERIES hinzufügen
  • und in der Funktion "GetData" zwei "case:" hinzufügen, um sie zu berechnen

und dem Benutzer eine Funktion (Methode der Klasse EA) zur Verfügung stellen, um den EA einz urichten. Der einfachste Eintrag kann wie folgt aussehen

SetStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL);

lautet: "Setzt den Stop-Loss in einem bestimmten Abstand und verfolgt den Kauf nach der Spalte LOWER_FRACTAL, den Verkauf nach UPPER_FRACTAL"; ich denke, die Methode hat einen eindeutigen Namen und ihre Syntax ist mehr oder weniger klar.

Der hypothetische Benutzer hat eine Menge Gesten gemacht (Eingabe deklariert, zwei Spalten hinzugefügt und Funktionseinstellungen aufgerufen), wir werden die Bibliothek so entwickeln, dass seine Aktionen zum erwarteten Ergebnis führen. Außerdem müssen wir Tabellenkalkulationen entwickeln und die Grundlage für einen Nachrichten-/Ereignismechanismus schaffen.

Beim Kopieren und Einfügen wurden überflüssige Kommentare und MQL5-Code aus Gründen der Kompaktheit entfernt.

input ENUM_APPLIED_PRICE FAST_MA_PRICE=PRICE_CLOSE;
input ENUM_MA_METHOD FAST_MA_METHOD=MODE_EMA;
input int FAST_MA_PERIOD=14;
input int FAST_MA_SHIFT=0;

input ENUM_APPLIED_PRICE SLOW_MA_PRICE=PRICE_CLOSE;
input ENUM_MA_METHOD SLOW_MA_METHOD=MODE_SMA;
input int SLOW_MA_PERIOD=54;
input int SLOW_MA_SHIFT=0;

// начальные значения StopLoss, TakeProfit
input int STOPLOSS_POINTS=100;
input int TAKEPROFIT_POINTS=200;

#include "EA/EA.mqh"

enum ENUM_SERIES {
   FAST_MA,       // id. значений FAST_MA
   SLOW_MA,       // id. значений SLOW_MA 
   SIGNAL_BUY,    // сигнал к покупкам
   SIGNAL_SELL,   // сигнал к продажам
   UPPER_FRACTAL,       // верхний фрактал (для трала стопов ордеров sell)
   LOWER_FRACTAL, // нижний фрактал
   TOTAL_SERIES   // последний элемент перечисления = кол-во элементов
};

double GetData(EA *ea,int id,int shift,DataFrame *table)
{
   switch ((ENUM_SERIES)id) {
      case FAST_MA:
         return table[FAST_MA][shift]=iMA(ea.Symbol,ea.Period,FAST_MA_PERIOD,0,FAST_MA_METHOD,FAST_MA_PRICE,shift);
      case SLOW_MA:
         return table[SLOW_MA][shift]=iMA(ea.Symbol,ea.Period,SLOW_MA_PERIOD,0,SLOW_MA_METHOD,SLOW_MA_PRICE,shift);
      case SIGNAL_BUY:
         return table[SIGNAL_BUY][shift]=table.CrossedUp(FAST_MA,SLOW_MA,shift);
      break;
      case SIGNAL_SELL:
         return table[SIGNAL_SELL][shift]=table.CrossedDn(FAST_MA,SLOW_MA,shift);
      break;
      // Расчёт уровней трала
      case UPPER_FRACTAL:
         // верхний фрактал. уровень по которому тралятся sell
         return table[UPPER_FRACTAL][shift]=iFractal(ea.Symbol,ea.Period,MODE_UPPER,shift+2);
      case LOWER_FRACTAL:
         return table[UPPER_FRACTAL][shift]=iFractal(ea.Symbol,ea.Period,MODE_LOWER,shift+2);
   }
   return EMPTY_VALUE;
}
int SignalOfCross(EA *ea,int shift,DataFrame *data)
{
   if (FAST_MA_PRICE!=PRICE_OPEN || SLOW_MA_PRICE!=PRICE_OPEN) shift++;
   if (data[SIGNAL_BUY][shift]==1.0)  return OP_BUY;
   if (data[SIGNAL_SELL][shift]==1.0) return OP_SELL;
   return -1;
}
EA *ea=NULL;

int OnInit()
{
   ea = new EA();
   ea.SetupTimeframe(_Symbol,_Period,TOTAL_SERIES,30,GetData);
   ea.SetupSignal(SignalOfCross);

        // укажем начальный стоп-лосс ордеров и уровни для тралов 
   ea.SetupStopLoss(STOPLOSS_POINTS,LOWER_FRACTAL,UPPER_FRACTAL);
   // и заодно тейк-профит
   ea.SetupTakeProfit(TAKEPROFIT_POINTS);
   // остальная часть одинакова для всех советников
   //................
}


 
Maxim Kuznetsov:

Es ist schon schwer, sich einen solchen Code anzusehen. Äußerlich einfach zu schreiben ist eine schwierige Aufgabe. Prägnanz ist wichtig, aber auch bei ihr kann die Einfachheit leicht verloren gehen.

Ihre Meinung über Ihren Code ist, ebenso wie meine Meinung über meinen, sehr subjektiv. Beobachter von außen können viel objektiver feststellen, ob es kompliziert oder einfach ist.

Als Beobachter Ihres Codes - kompliziert.

 
fxsaber:

Es ist schon schwer, sich einen solchen Code anzusehen. Äußerlich einfach zu schreiben ist eine schwierige Aufgabe. Prägnanz ist wichtig, aber auch dabei kann die Einfachheit leicht verloren gehen.

Ihre Meinung über Ihren Code ist, ebenso wie meine Meinung über meinen, sehr subjektiv. Beobachter von außen können viel objektiver feststellen, ob es kompliziert oder einfach ist.

Als Beobachter Ihres Codes - kompliziert.

Schlagen Sie einen klareren und prägnanteren Eintrag nur für den Anwendungsfall vor. Oder Änderungen an der aktuellen Version.

Dies ist der schwierigste Punkt - und derjenige, der am häufigsten zur Diskussion gestellt wird.




 
Maxim Kuznetsov:

Sie haben eine klarere und prägnantere Notation nur für den Anwendungsfall vorgeschlagen. Oder Änderungen an der aktuellen Version.

Dies ist der schwierigste Punkt - und gerade der, der am häufigsten zur Diskussion gestellt wird.

Ich werde es nicht vorschlagen, da ich nicht weiß und nicht einmal verstehe, warum es notwendig ist. Für einen außenstehenden Beobachter wird MQL4 kaum einfacher sein als MQL4. Die MQL4-Entwickler haben sich eine einfache Architektur ausgedacht.

 

Was wollen Sie damit erreichen? Um ehrlich zu sein, verstehe ich das nicht. Zuerst dachte ich, es sei ein Rahmenwerk vorgesehen, aber nein, keine Wrapper-Klassen für Indikatoren, Aufträge, Standardalgorithmen für die Entscheidungsfindung, nichts. Viel lesbarer ist zwar dieses Konstrukt: fast.Get(2)>=slow.Get(1); (nur als Beispiel), aber die Erklärung:

CMA fast=new CMA(NULL,0,12,...);

CMA slow=new CMA(NULL,0,100,...);

Darüber können wir diskutieren, während Sie, IMHO, auf der Stelle trampeln.

 
fxsaber:

Als Beobachter Ihres Codes - schwierig.

Ich stimme zu, dass es sehr schwierig ist, Ihren Code zu lesen, selbst wenn Sie die Sprache beherrschen.