Diskussion zum Artikel "Universal Expert Advisor: Das Event-Modell und der Trading-Strategie Prototyp (Part 2)" - Seite 4

 
Andrey Khatimlianskii:
Analysieren Sie zumindest den Preis. Vielleicht brauchen Sie gar nicht einzusteigen.
Ja, es gibt einen solchen Mechanismus. Und wo sollte er eingebaut werden, wenn nicht in der Klasse der Handelsaufträge? Und wie lässt sich ein solcher Mechanismus formalisieren, welche starke Bewegung sollte als kritisch angesehen werden?
 
Гога:
Ja, es gibt einen solchen Mechanismus. Und wo sollte er eingebaut werden, wenn nicht in der Klasse der Handelsaufträge? Und wie lässt sich ein solcher Mechanismus formalisieren, welche scharfe Bewegung sollte als kritisch angesehen werden?

Nun, das ist die Frage! Deshalb ist er auch nicht in die Engine eingebaut.

Bei einer Strategie spielt ein Ausrutscher von 20 Pips keine Rolle, und man sollte trotzdem einsteigen, während bei einer anderen Strategie ein Ausrutscher von 2 Pips alle Statistiken sprengt, und man sollte nicht schlechter einsteigen.

Und was sollte eine universelle Handelsmaschine für diese beiden Strategien tun? Richtig, den Kurs zurückgeben und die Handelslogik eine Entscheidung treffen lassen.

Nun, oder eine Anpassung hinzufügen. Genauer gesagt, Einstellungen für alle Fälle des Lebens )

 
Dies ist ein sehr guter Artikel. Ich habe eine Menge gelernt. Guter Beitrag, danke.
 
Alain Verleyen:

Auf Build 1241 wird der Code gut kompiliert, also habe ich versucht, einen Backtest durchzuführen. Es nimmt keine Trades.

Nachdem ich ein wenig gegraben habe, fand ich heraus, dass es am Füllmodus liegt. Der bei dem von mir verwendeten Broker/Symbol zulässige Modus ist ORDER_FILLING_IOC. Ihre TradeCustom-Klasse setzt den Füllmodus standardmäßig auf ORDER_FILLING_FOK. Ich weiß nicht, wie ich diesen Füllmodus ändern kann, damit der Agent.mq5 EA den Handel aufnehmen kann. Ich könnte suchen, aber es wird mich eine Menge Zeit kosten.

Das ist das Problem mit solchen Tools, sehr ähnlich wie MQL5 Wizard EA von Metaquotes, es ist fast unbrauchbar für jeden, der nicht alle Details der Klassen kennt. Sobald man auf ein Problem stößt, das nicht vom Autor bereitgestellt wurde, wird es zu einer echten Qual, es zu beheben oder zu ändern/hinzuzufügen. Ich sehe keinen wirklichen Unterschied zwischen Ihrer Lösung und der von Metaquotes (Assistent).

Wie auch immer, ich gratuliere Ihnen zu dieser enormen Arbeit. Es ist eine großartige Programmierarbeit.

Es gibt einige Klassen im MetaEditor5-Include-Ordner. Wenn uns jemand eine ausführliche Erklärung der Klassen des Expertenordners geben könnte, wäre das sehr hilfreich, da sie sehr kompliziert aussehen. Die Leute möchten Standard-EAs schreiben, die auf formalen Basisklassen basieren und nicht immer neue Räder erstellen.... Wie auch immer, dieser Artikel hilft eine Menge für nicht neu zu erstellen Räder.
 
Amy Liu:
Es gibt einige Klassen im MetaEditor5 Include-Ordner. Wenn jemand uns eine ausführliche Erklärung der Klassen des Expertenordners geben kann, wäre das sehr hilfreich, da sie sehr kompliziert aussehen. Die Leute mögen es, Standard-EAs zu schreiben, die auf formalen Basisklassen basieren, und nicht immer neue Räder zu erstellen.... Wie auch immer, dieser Artikel hilft sehr dabei, Räder nicht neu zu erstellen.
Ich stimme zu. Das Problem ist, wenn es einen Fehler im Framework gibt. Bevor man ein Framework verwendet, sollte man sich entweder tief in die Materie einarbeiten oder sich vergewissern, dass es vom Autor gut unterstützt wird.
 
Alain Verleyen:
Ich stimme zu. Das Problem ist, wenn es einen Fehler im Framework gibt. Bevor wir ein Framework verwenden, sollten wir entweder entscheiden, es tief zu lernen oder sicher sein, dass es vom Autor gut unterstützt wird.
Das ist der Grund, warum ich Klassen in MetaEditor5 lernen möchte, sie sind von der "Regierung" ;)
 
Amy Liu:
Das ist der Grund, warum ich Klassen in MetaEditor5 lernen möchte, sie sind von der "Regierung" ;)
Und fehlerhaft und nicht gut unterstützt :-D
 
Danke. Sehr guter Artikel.
 

Herr Vasily,

sehr schöner Code... und nützlich für mich...

in den mt5-News-Builds (1952) haben wir eine "Nachricht" im Compiler,


bool CBarDetector::IsNewBar(void)

  {

   datetime time[];

   if(CopyTime(m_symbol, m_timeframe, 0, 1, time) < 1)return false;

   if(time[0] == m_last_time)return false;

   return (m_last_time = time[0]);    //<=============HERE

  }

//+------------------------------------------------------------------+

///////////MESSAGE in THE METAEDITOR compiler///////////////
expression not boolean NewBarDetector.mqh 87 24


sollte das richtig sein? bitte bestätigen Sie dies

//+------------------------------------------------------------------+
//| Gibt true zurück, wenn für das angegebene Symbol und den Zeitrahmen |
//| ein neuer Balken.|
//+------------------------------------------------------------------+
bool CBarDetector::IsNewBar(void)
  {
   datetime time[];
   if(CopyTime(m_symbol, m_timeframe, 0, 1, time) < 1)return (false);
   if(time[0] == m_last_time)return (false);
   return (m_last_time == time[0]);
  }
//+------------------------------------------------------------------+



 

Hallo Vasiliy,

bitte entschuldige, dass ich eine Frage zu deinem Artikel so weit unten stelle, nachdem du ihn geschrieben hast. Ich gehe die Artikel erst jetzt richtig durch auf der Suche nach Alternativen zu einem Framework. Etwas ist mir seltsam vorgekommen, was sehr wahrscheinlich auf mein Missverständnis zurückzuführen ist.

In Bezug auf die Ereignis-Handler für "New Tick" und "New Bar". Du durchläufst die Liste der hinzugefügten Ticks, baust dann die Ereignisstruktur auf und übergibst sie an Init- und Support-Ereignishandler, z.B. neues Tick-Ereignis unten:

//+------------------------------------------------------------------+
//| Erkennt das Eintreffen neuer Ticks von Multi-Instrumenten. ||
//+------------------------------------------------------------------+
void CStrategy::NewTickDetect(void)
  {
   if(m_ticks_detectors.Total()==0)
      AddTickEvent(ExpertSymbol());
   for(int i=0; i<m_ticks_detectors.Total(); i++)
     {
      CTickDetector *tick=m_ticks_detectors.At(i);
      if(tick.IsNewTick())
        {
         m_event.period=PERIOD_CURRENT;
         m_event.type=MARKET_EVENT_TICK;
         m_event.symbol=tick.Symbol();
         CallSupport(m_event);
         CallInit(m_event);
        }
     }
  }

In einem Ihrer Beispiele, z.B. gleitender Durchschnittsclip unten;

bool CMovingAverage::IsTrackEvents(const MarketEvent &event)
  {
//--- Wir behandeln nur die Eröffnung eines neuen Balkens auf dem Arbeitssymbol und Zeitrahmen
   if(event.type != MARKET_EVENT_BAR_OPEN)return false;
   if(event.period != Timeframe())return false;
   if(event.symbol != ExpertSymbol())return false;
   return true;
  }

Diese IsTrackEvents-Funktion scheint den Zweck der obigen NewTickDetect-Funktion zunichte zu machen! Das obige Beispiel des gleitenden Durchschnitts sollte also in der Lage sein, mit mehreren Instrumenten zu handeln, da es mehrere Symbole wie in NewTickDetect überprüfen kann, aber IsTrackEvents erlaubt den Handel nur für den Zeitrahmen der Strategie und das Symbol (das Symbol ist hier der Schlüssel). Bedeutet dies nicht, dass die NewTickDetect-Schleife nicht wirklich erforderlich ist, da die Strategie nur auf ihrem Symbol handeln kann? Tatsächlich sollte die NewTickDetect-Schleife nur prüfen, ob der empfangene Tick dem Symbol der Strategie entspricht - ohne Schleife. Was in der Tat ist ähnlich wie mit einem Strategie-Objekt für jedes Symbol von Interesse, die die CStragyList Schleifen über?

Ich hoffe sehr, dass ich mich verständlich ausdrücke, und hoffe, dass Sie mir das erklären können.

Ich liebe Ihre Arbeit. Ich habe viel aus Ihren Artikeln gelernt, also vielen Dank.

Mit freundlichen Grüßen,

Shep