Wann ist es sinnvoll, einen Teil des Robotercodes in einem Indikator zu behalten? - Seite 33

 

Ein zelo nützlicher Diskurs...

Und da ich die Ressourcen und das Potenzial der Teilnehmer kenne, schlage ich provokativ vor, die Geschwindigkeit und "Unflottierbarkeit" der Tics zu messen:

1) Sovnig

2) zyklisches Skript, das mit einer Frequenz von 1 Millisekunde läuft

3) induziert

4) einen DDE-Empfänger eines Drittanbieters.

Auch für Neulinge - wie mich - wird es nützlich sein.

;)

 

Am Ende des Abends:

Dateien:
experts.zip  1 kb
 

Ich möchte meinen eigenen Beitrag dazu leisten:

Die Leistung von Expert Advisors, bei denen der Indikatorcode vollständig im EA platziert ist, ist oft etwa dreimal so schnell wie die ihrer Gegenstücke, die benutzerdefinierte Indikatoren aufrufen. Dies gilt für die Varianten mit sehr schweren Indikatorberechnungen. Wenn diese Berechnungen sehr leicht sind, gibt es keinen Unterschied. Die Berechnung des EMA-Indikators ist zu primitiv, um ihn für solche Messungen zu verwenden. In einigen meiner letzten Artikel auf dieser Seite habe ich sogar eine Variante des Expert Advisors mit einer sehr schweren Indikatorberechnung des JMA vorgestellt. Die Version mit dem Code ohne Indikatoraufrufe ist dreimal so schnell.

Ich persönlich habe nicht das Bedürfnis, irgendjemandem etwas zu beweisen; ich ziehe nur meine eigenen Schlüsse, die ich mit meinen eigenen Augen gesehen habe, und das nicht nur einmal; obwohl ich diese Art von Dingen natürlich nicht ewig mache, und es kann gut sein, dass die letzten Builds von MT4 dieses Bild irgendwie anders aussehen ließen. Und auch im MT5 war es anfangs absolut gleich. Aber ich behalte solche Details nicht im Auge und kann daher nicht behaupten, dass es jetzt genauso ist.

 

GODZILLA:

In einigen meiner letzten Artikel auf dieser Seite habe ich sogar eine Variante des Expert Advisors mit einer sehr starken Indikatorberechnung von JMA gepostet. Die Variante mit Code ohne Indikatoraufrufe arbeitet dreimal schneller.

Hier? Die Schlussfolgerung ist einfach: Es gibt 3 Möglichkeiten:

1. der Code ohne Indikatoraufrufe ist falsch geschrieben, was unwahrscheinlich ist.

2. der Indikator unwirksam geschrieben ist.

(3) Die angegebenen Zahlen entsprechen nicht der Realität.

 
GODZILLA:

Ich möchte meinen eigenen Beitrag dazu leisten:

Die Leistung von Expert Advisors, bei denen der Indikatorcode vollständig im EA platziert ist, ist oft etwa dreimal so schnell wie die ihrer Gegenstücke, die benutzerdefinierte Indikatoren aufrufen. Dies gilt für die Varianten mit sehr schweren Indikatorberechnungen. Wenn diese Berechnungen sehr leicht sind, gibt es keinen Unterschied. Die Berechnung des EMA-Indikators ist zu primitiv, um ihn für solche Messungen zu verwenden. In einigen meiner letzten Artikel auf dieser Seite habe ich sogar eine Variante des Expert Advisors mit einer sehr schweren Indikatorberechnung des JMA vorgestellt. Die Variante ohne Indikatoraufrufe ist dreimal schneller.

Ich persönlich habe nicht das Bedürfnis, irgendjemandem etwas zu beweisen; ich ziehe nur meine eigenen Schlüsse, die ich mit meinen eigenen Augen gesehen habe, und das nicht nur einmal; obwohl ich diese Art von Dingen natürlich nicht ewig mache, und es kann gut sein, dass die letzten Builds von MT4 dieses Bild irgendwie anders aussehen ließen. Und auch im MT5 war es anfangs absolut gleich. Aber ich behalte solche Details nicht im Auge und kann daher nicht behaupten, dass es jetzt genauso ist.


Machen Sie sich nicht lächerlich. Sie haben nur noch nicht gelernt, wie man Indikatoren schreibt.

Nach solcher Ketzerei:

//---- ЭМУЛЯЦИЯ ИНДИКАТОРНЫХ БУФЕРОВ
  int NewSize = iBars(symbol, timeframe);
  //----  Проверка на смену нулевого бара
  if(ArraySize(Ind_Buffer0) < NewSize)
    {
      //---- Установить прямое направление индексирования в массиве 
      ArraySetAsSeries(Ind_Buffer0, false);
      ArraySetAsSeries(Ind_Buffer1, false);
      ArraySetAsSeries(Ind_Buffer2, false);
      //---- Изменить размер эмулируемых индикаторных буферов 
      ArrayResize(Ind_Buffer0, NewSize); 
      ArrayResize(Ind_Buffer1, NewSize); 
      ArrayResize(Ind_Buffer2, NewSize); 
      //---- Установить обратное направление индексирования в массиве 
      ArraySetAsSeries(Ind_Buffer0, true);
      ArraySetAsSeries(Ind_Buffer1, true);
      ArraySetAsSeries(Ind_Buffer2, true); 
    } 
//----

Sie hätten Ihre Meinung in diesem Thema auch ganz weglassen können.

 

Entlarvung des Trugschlusses Nr. 1: Es geht auch ohne IndicatorCounted()

Ein Indikator dazu:

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red

extern double Alpha = 0.9;

double EMA[];

int init()
{
   SetIndexBuffer(0, EMA);
   return(0);
}

int start()
{
   int toCount = MathMin(Bars - 1, Bars - IndicatorCounted());
   if (toCount == Bars - 1) EMA[Bars - 1] = Open[Bars - 1];
   for(int i = toCount - 1; i >= 0; i--)
   {
      EMA[i] = (1 - Alpha)*Open[i] + Alpha*EMA[i + 1];
   }
   return(0);
}

Ohne sie, nach dem Prinzip der hrenfx

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Yellow

extern double Alpha = 0.9;

double EMABuffer[];

double GetPrice( int Shift )
{
  return(Open[Shift]);
}

double EMA;

int init()
{
   EMA = GetPrice(Bars - 1);

   SetIndexBuffer(0, EMABuffer);
   return(0);
}

double GetEMA()
{
   static int PrevTime = 0;

   if (PrevTime == Time[0])
      return(EMA);

   int i = iBarShift(Symbol(), Period(), PrevTime) - 1;

   PrevTime = Time[0];
   while (i >= 0)
   {
      EMA = EMA * Alpha + (1 - Alpha) * GetPrice(i);
      EMABuffer[i] = EMA;
      i--;
   }
   return(EMA);
}

void start()
{
  GetEMA();
}

Dann wenden wir die Indizes auf das Diagramm an und emulieren den Verlust der Verbindung, während der Automat läuft. Ergebnis:


 

Ja, ich habe das Thema auch ein bisschen recherchiert. Natürlich ist es Blödsinn, sich mit dem Blödsinn der Plattformentwickler herumzuschlagen, aber egal.

Sie haben meinen EA in einen Indikator verwandelt. Wie Sie war ich mir vor 24 Stunden sicher, dass der Indikator des Expert Advisors und der Indikator des einfachen EA die gleichen Ergebnisse zeigen müssen, da beide auf Tick ausgelöst werden. Aber sie werden unterschiedlich ausgelöst. Der erste Tick nach dem Erscheinen der Verbindung ist für den EA nicht derselbe wie für den aus dem EA gezogenen Indikator. Sie können es selbst überprüfen.

Der obige Screenshot zeigt, dass der EA (nicht der Indikator aus dem EA) nach dem Verbindungsabbruch mit iCustom verglichen wird. Der Zusammenbruch der Kommunikation verläuft dort ohne Probleme.

 

Ich gehe davon aus, dass der Indikator beim ersten Tick nach einem Verbindungsabbruch nicht sofort ausgelöst wird. Genauer gesagt, wartet der Indikator auf die Ausführung der Funktion IndicatorCounted(). Diese Funktion kann aber (je nach Verbindung) bis zu mehreren Sekunden ausgeführt werden. D.h., hier ist das Schema:

  1. Erstes Häkchen nach einem Verbindungsabbruch.
  2. Der Indikator hat begonnen.
  3. IndicatorCounted() wird einige Zeit lang ausgeführt (anscheinend direkt nach dem Start des Indikators, auch wenn IndicatorCounted() nicht im Körper des Indikators vorhanden ist).
  4. Nach Erhalt des Ergebnisses wird die Handelsumgebung aktualisiert.
  5. Und der Indikator beginnt mit der Ausführung seines Codes, als ob er nicht beim ersten Tick, sondern beim letzten Tick vor dem IndicatorCounted()-Ergebnis gestartet wurde.

P.S. Testen mit Build 226.

 
Es stellt sich heraus, dass wir für die absolute Zuverlässigkeit von "all in one" EAs einen Startaufruf des Empty Indikators und RefreshRates() ganz am Anfang der Funktion machen sollten. Dies garantiert das Laden der Historie (nach der Pause) und die Ausführung des EA beim ersten Tick, der der bereits geladenen Historie entspricht.
 
hrenfx:
Es stellt sich heraus, dass wir für die absolute Zuverlässigkeit von "all in one" EAs einen Startaufruf des Empty Indikators und RefreshRates() ganz am Anfang der Funktion machen sollten. Dies garantiert das Laden der Historie (nach der Pause) und die Ausführung des EA beim ersten Tick, der der bereits geladenen Historie entspricht.


Und können Sie die Nachforschungen und Kontrollen zu dieser Vermutung veröffentlichen?

Hmmm... Wenn dies der Fall ist und eine Ladegarantie gegeben wird, dann ist das eine sehr gute Option.

Ich habe einen ForexTools-Thread gesehen, in dem es keine Lösung für das Problem der Vertauschung der Historie beim Starten des Terminals und des Expert Advisors gab.