Diskussion zum Artikel "Erstellen von Multi-Symbol- und Multi-Perioden-Indikatoren"

 

Neuer Artikel Erstellen von Multi-Symbol- und Multi-Perioden-Indikatoren :

In diesem Artikel werden wir uns mit den Grundsätzen der Erstellung von Multi-Symbol- und Multi-Perioden-Indikatoren befassen. Wir werden auch sehen, wie man auf die Daten solcher Indikatoren von Expert Advisors und anderen Indikatoren zugreifen kann. Wir werden die Hauptmerkmale der Verwendung von Multi-Indikatoren in Expert Advisors und Indikatoren besprechen und sehen, wie man sie durch nutzerdefinierte Indikatorpuffer darstellen kann.

Nachdem wir den Testindikator kompiliert haben, starten wir ihn auf einem Chart mit der Periode M1. In den Einstellungen wählen wir das aktuelle Symbol und die Berechnungsperiode des Indikators M5. In diesem Fall werden zwei gleitende Durchschnitte, die in den Indikatoreinstellungen ausgewählt wurden, erstellt. Einer davon wird anhand der Daten des aktuellen Charts berechnet, der zweite basiert auf den Daten des 5-Minuten Zeitrahmen. Wenn Sie den Zeitrahmen des Charts wechseln, können Sie sehen, wie zwei Linien auf M1 gezeichnet werden: eine entspricht dem auf M1 berechneten gleitenden Durchschnitt und die zweite Linie entspricht dem auf M5 berechneten gleitenden Durchschnitt. Wenn Sie das Chart auf M5 umstellen, wird nur ein Indikator erstellt, da der zweite Indikator mit dem ersten identisch ist und nicht erstellt wird. Wenn Sie das Chart auf M15 umstellen, wird ein Indikator für M15 und der zweite für M5 berechnet und auch im Chart angezeigt.


Wie Sie sehen können, funktioniert die angegebene Funktionalität und wir können die Indikatoren im Hauptfenster des Charts sehen. Mehrere Indikatoren werden unter Verwendung eines Puffers erstellt.

Autor: Artyom Trishkin

 

Vielen Dank an den Autor. Es gibt etwas zu bedenken...

Imho, wenn die Klasse basic ist, dann sollte ihr Name CBaseIndMSTF sein . Oder sogar CBaseIndMSMTF. MSMTF - Multi-Symbol-Multi-Timeframe.

Nach dem Namen.

ENUM_IND_CATEGORY ist gut.

Die folgenden sind nicht so gut.

ENUM_COMPARE_MODE --> ENUM_IND_COMPARE_MODE

ENUM_LINE_STATE --> ENUM_IND_LINE_STATE

ENUM_ERR_TYPE --> ENUM_IND_CALC_ERR_TYPE


enum ENUM_ERR_TYPE            // Art des Fehlers bei der Berechnung des Indikators
  {
   ERR_TYPE_NO_ERROR,         // Kein Fehler
   ERR_TYPE_NO_CYNC,          // Daten nicht synchronisiert
   ERR_TYPE_NO_DATA,          // Daten nicht geladen
   ERR_TYPE_NO_CALC,          // Berechnung nicht abgeschlossen
  };

ERR_TYPE_NO_CYNC --> ERR_TYPE_NO_SYNC

 
Denis Kirichenko Multi-Symbol-Multi-Timeframe.

Nach Namen.

ENUM_IND_CATEGORY ist in Ordnung.

Die folgenden sind nicht gut.

ENUM_COMPARE_MODE --> ENUM_IND_COMPARE_MODE

ENUM_LINE_STATE --> ENUM_IND_LINE_STATE

ENUM_ERR_TYPE --> ENUM_IND_CALC_ERR_TYPE


ERR_TYPE_NO_CYNC --> ERR_TYPE_NO_SYNC

Ich stimme mitdieser Option überein. Die anderen sind spezifisch

 
synchronisieren/synchronisieren
 
Denis Kirichenko #:
zu synchronisieren/zu synchronisieren

Ich kann mir keinen Reim darauf machen. Zwei "s" sind hervorgehoben, was nun?

"Keine Synchronisierung" - nicht synchronisiert. Was ist falsch? "Fehler: Nicht synchronisiert"

Aaah!

Ich habe in der letzten Minute ein C statt eines S gesehen... Okay. Danke. Ich werde es korrigieren.

 

Artem, hat den Indikator TestMSTFMovingAverages auf dem EURUSD-Chart ausgeführt. Tag aus. Tf1 = M15, Tf2 = H1.

Eingabeparameter:

InpIndicator=26
InpSymbol=
InpTimeframe=16385
InpPrice=1
InpMethod=0
InpShift=0
InpAsSeries=true

Dies ist das Ergebnis:

Logs:

HD      0       20:22:12.149    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(10) indicator (handle 10) added to the collection
PJ      0       20:22:12.150    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(EURUSD,H1:10) indicator (handle 11) added to the collection
CG      0       20:22:12.179    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Start downloading data by EURUSD/H1. Waiting for the next tick...
OG      0       20:22:12.179    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data not loaded
HQ      0       20:22:12.179    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
QH      0       20:22:12.224    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::DataToBuffer::MA(EURUSD,H1:10) First start, or historical data has been changed. Initialize Buffer(0)


Die Kerze um 23:00 Uhr wurde mit einem Fadenkreuz markiert. Sie können sehen, dass die rote SMA10-Linie ihren Wert erst bei der nächsten Kerze nach 23:00 Uhr ändert. D.h. wir haben einen Übergang der Werte um 23:00 und 23:15.

Nach meinem Verständnis sollte der Übergang vom aktuellen zum nächsten Wert auf Tf2 um22:45 und 23:00 stattfinden.


Dann habe ich folgendes Ergebnis. Ich lasse den SMA10-Indikator mit Offset = 1 in einem separaten EURUSD-H1-Chart laufen.

Ich öffne einen neuen Chart und führe TestMSTFMovingAverages aus. Und wie durch ein Wunder sehe ich, dass das Bild korrigiert zu sein scheint.


Protokolle:

2023.10.29 20:38:42.583 TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(10) indicator (handle 10) added to the collection
2023.10.29 20:38:42.584 TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(EURUSD,H1:10) indicator (handle 11) added to the collection
2023.10.29 20:38:42.622 TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::DataToBuffer::MA(10) First start, or historical data has been changed. Initialize Buffer(0)
2023.10.29 20:38:42.654 TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::DataToBuffer::MA(EURUSD,H1:10) First start, or historical data has been changed. Initialize Buffer(0)


Und sowohl im ersten Fall als auch im zweiten Fall auf dem Panel um 23:00 Uhr der Wert von MA(EURUSD,H1:10) = 1.056959. Was, imho, korrekt ist. Offensichtlich ist im ersten Fall etwas falsch mit der Pufferfüllung für MA(EURUSD,H1:10).

 
Denis Kirichenko EURUSD-H1-Chart ausgeführt.

Ich öffne ein neues Diagramm und führe TestMSTFMovingAverages aus. Und Wunder, ich sehe, dass das Bild zu sein scheint korrigiert.


Protokolle:


Außerdem ist sowohl im ersten als auch im zweiten Fall auf dem Panel um 23:00 der Wert von MA(EURUSD,H1:10) = 1.056959. Was imho korrekt ist. Offenbar ist im ersten Fall etwas mit der Pufferfüllung für MA(EURUSD,H1:10) falsch.

Danke, Denis. Ich werde später einen Blick darauf werfen - ich bin mit der Fortsetzung dieses Themas beschäftigt und habe leider noch keine Zeit.
 

...При работе с данными не текущего графика для исключения "освобождения" таймсерии, необходимо не реже. чем раз в две минуты обращаться к этой таймсерии. В этом случае будет происходить "удержание" таймсерии, что ускорит к ней обращение (не нужно будет каждый раз дожидаться синхронизации данных)...

Wie haben Sie diesen Frequenzwert ermittelt? Wurde er experimentell ermittelt?

 
Denis Kirichenko #:

Wie haben Sie diesen Frequenzwert ermittelt? Wurde er experimentell ermittelt?

Nachricht von den Entwicklern im Forum.

 

Es gibt eine solche Struktur:

//--- struct
struct SBuffer                // Aufbau des Indikatorpuffers
  {
   double            array[];    // Indikator-Array-Puffer
   double            init_value; // Initialisierungswert
   int               shift;      // Den Puffer horizontal verschieben
   string            descript;   // Beschreibung des Puffers
   //--- (1) setzt, (2) gibt den Initialisierungswert zurück,
   void              SetInitValue(const double value) { init_value=value;                             }
   double            InitValue(void)                  { return init_value;                            }
   //--- (1) Setzt, (2) Gibt Pufferverschiebung zurück
   void              SetShift(const int value)        { shift=value;                                  }
   int               Shift(void)                      { return shift;                                 }
//--- (1) Ändert die Größe des Pufferarrays, (2) gibt die Größe des Pufferarrays zurück,
//--- (3) initialisiert das Array mit dem eingestellten "leeren" Wert
   bool              BuffResize(const int new_size)   { return(ArrayResize(array,new_size)==new_size);}
   uint              BufferSize(void)                 { return array.Size();                          }
   int               InitBuffer(void)                 { return ArrayInitialize(array,init_value);     }
  };

Da es set\get-Methoden gibt, fehlt imho derprivate access specifier:

//--- struct
struct SBuffer                // Aufbau des Indikatorpuffers
   {
   private:
      double            array[];    // Indikator-Array-Puffer
      double            init_value; // Initialisierungswert
      int               shift;      // Den Puffer horizontal verschieben
      string            descript;   // Beschreibung des Puffers
   public:
      //--- (1) setzt, (2) gibt den Initialisierungswert zurück,
      void              SetInitValue(const double value)
         {
         init_value = value;
         }
      double            InitValue(void)
         {
         return init_value;
         }
      //--- (1) Setzt, (2) Gibt Pufferverschiebung zurück
      void              SetShift(const int value)
         {
         shift = value;
         }
      int               Shift(void)
         {
         return shift;
         }
//--- (1) Ändert die Größe des Pufferarrays, (2) gibt die Größe des Pufferarrays zurück,
//--- (3) initialisiert das Array mit dem eingestellten "leeren" Wert
      bool              BuffResize(const int new_size)
         {
         return(ArrayResize(array, new_size) == new_size);
         }
      uint              BufferSize(void)
         {
         return array.Size();
         }
      int               InitBuffer(void)
         {
         return ArrayInitialize(array, init_value);
         }
   };


Und wir brauchen auch Methoden für die Arbeit mit dem Puffer...

 
Denis Kirichenko #:

Es gibt eine solche Struktur:

Da es set\get-Methoden gibt, fehlt imho derprivate access specifier:


Und wir brauchen auch Methoden für die Arbeit mit dem Puffer...

Ursprünglich habe ich versucht, die Dinge nicht zu verkomplizieren.