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

 

Ich habe einen kleinen Stresstest durchgeführt. Ich habe das Internet ausgeschaltet, den Indikator mit dem Panel auf dem Chart gestartet. Die Parameter habe ich bereits oben angegeben. Dann habe ich das Internet wieder eingeschaltet und folgendes Ergebnis erhalten:

CL      0       22:29:43.402    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(10) indicator (handle 10) added to the collection
OS      0       22:29:43.402    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::AddNewMA: MA(EURUSD,H1:10) indicator (handle 11) added to the collection
DQ      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(10): Waiting for data to sync...
QL      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
IO      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
PQ      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
LN      0       22:29:43.439    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
KE      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(10): Waiting for data to sync...
JH      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
RK      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
OD      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
CR      0       22:29:43.443    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
GE      0       22:30:04.495    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::OnTimer::MA(EURUSD,H1:10): Tick emulation. Attempt 1 of 3 ...
II      0       22:30:34.092    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(10): Waiting for data to sync...
LD      0       22:30:34.092    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
DH      0       22:30:34.092    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
NH      0       22:30:34.093    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
RG      0       22:30:34.093    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
JM      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(10): Waiting for data to sync...
KP      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
CD      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
FL      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
RK      0       22:30:35.539    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
OM      0       22:30:37.935    TestMSTFMovingAverages (EURUSD,M15)     CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for a new tick and when the indicator will be calculated...
PI      0       22:30:37.935    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Calculation not completed
ND      0       22:30:37.935    TestMSTFMovingAverages (EURUSD,M15)     CMSTFIndicators::Calculate: Not all indicators have been calculated successfully. It is necessary to recalculate the buffers of all indicators
PN      2       22:30:39.604    TestMSTFMovingAverages (EURUSD,M15)     array out of range in 'TestMSTFMovingAverages.mq5' (211,34)


Der Indikator stürzte ab.

 

Mir ist auch etwas Seltsames aufgefallen. M15-Chart auf USDCHF.



Wenn wir uns den USDCHF-Chart ansehen, oder besser gesagt die rote Kurve des MA(USDCHF, H1)-Indikators, dann ist in den letzten 7 Stunden der Übergang zum nächsten Wert 5 Mal um 00 Minuten erfolgt. Ich habe es mit roten Vertikalen hervorgehoben. Und nur für die letzten 2 Stunden ist alles normal. Blaue Vertikalen. Imho ein klarer Fehler mit Pufferfüllung....

 
Denis Kirichenko #:

Ich habe einen kleinen Stresstest durchgeführt. Ich habe das Internet ausgeschaltet, den Indikator mit dem Panel auf dem Chart gestartet. Die Parameter habe ich bereits oben angegeben. Dann schaltete ich das Internet ein und erhielt das folgende Ergebnis:


Der Indikator stürzte ab.

Denis Kirichenko #:

Ich habe auch einige seltsame Dinge bemerkt. M15-Chart für USDCHF.



Wenn wir uns den USDCHF-Chart ansehen, oder besser gesagt die rote Kurve des MA(USDCHF, H1)-Indikators, dann ist in den letzten 7 Stunden der Übergang zum nächsten Wert 5 Mal um 00 Minuten erfolgt. Ich habe es mit roten Vertikalen hervorgehoben. Und nur für die letzten 2 Stunden ist alles normal. Blaue Vertikalen. Imho ein klarer Fehler mit Pufferfüllung....

Danke, ich werde es mir ansehen
 
Denis Kirichenko #:

Ich habe einen kleinen Stresstest durchgeführt. Ich habe das Internet ausgeschaltet, den Indikator mit dem Panel auf dem Chart gestartet. Die Parameter habe ich bereits oben angegeben. Dann schaltete ich das Internet ein und erhielt das folgende Ergebnis:


Der Indikator stürzte ab.

In Zeile 211 an Cursorposition 34 wird auf das vordefinierte Array time[] zugegriffen:

DrawData(mouse_bar_index,time[mouse_bar_index]);

Es stellt sich heraus, dass der dem Array übergebene Index falsch ist.

Er kann kaum größer als rates_total-1 sein, höchstwahrscheinlich ist er gleich -1, weil er seine Werte im OnChartEvent-Handler von der Funktion iBarShift() erhält, die -1 zurückgeben kann:

void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- Arbeiten mit dem Panel
//--- Aufruf des Panel-Ereignishandlers
   panel.OnChartEvent(id,lparam,dparam,sparam);

//--- Wenn sich der Cursor bewegt oder das Diagramm angeklickt wird
   if(id==CHARTEVENT_MOUSE_MOVE || id==CHARTEVENT_CLICK)
     {
      //--- Variablen deklarieren, um Zeit- und Preiskoordinaten darin zu speichern
      datetime time=0;
      double price=0;
      int wnd=0;
      //--- Wenn die Koordinaten des Cursors in Datum und Uhrzeit umgewandelt werden
      if(ChartXYToTimePrice(ChartID(),(int)lparam,(int)dparam,wnd,time,price))
        {
         //--- schreibt den Index des Balkens, in dem sich der Cursor befindet, in die globale Variable
         mouse_bar_index=iBarShift(Symbol(),PERIOD_CURRENT,time);
         //--- Anzeige von Balkendaten unter dem Cursor auf dem Bedienfeld
         DrawData(mouse_bar_index,time);
        }
     }

//--- Wenn wir ein Benutzerereignis erhalten, geben wir eine Meldung darüber in das Protokoll ein
   if(id>CHARTEVENT_CUSTOM)
     {
      //--- Hier kann das Anklicken der Schaltfläche "Schließen" auf dem Bedienfeld behandelt werden
      PrintFormat("%s: Event id=%ld, object id (lparam): %lu, event message (sparam): %s",__FUNCTION__,id,lparam,sparam);
     }
  }


In DrawData() wird ein ungültiger Indexwert durch den Aufruf von CopyRates() behandelt, der keine Daten erhält, wenn der Index negativ ist, und dann DrawData() beendet:

//--- Wenn die Taktdaten für den angegebenen Index nicht ermittelt werden konnten - exit
   if(CopyRates(Symbol(),PERIOD_CURRENT,index,1,rates)!=1)
      return;

Bevor Sie also auf das time[]-Array zugreifen, müssen Sie den dem Array übergebenen Taktindex überprüfen (in Zeile 211):

//--- Anzeige der Balkendaten unter dem Cursor auf dem Panel (oder des aktuellen Balkens, wenn sich der Cursor außerhalb des Diagramms befindet)
   if(mouse_bar_index>WRONG_VALUE && mouse_bar_index<rates_total)
      DrawData(mouse_bar_index,time[mouse_bar_index]);


Im Allgemeinen - Theorie. Ich habe es nicht getestet, da ich damit beschäftigt bin, die Fortsetzung des Themas zu entwickeln (farbige Puffer von Multi-Indikatoren und so weiter). Nach Erscheinen des nächsten Artikels zu diesem Thema werde ich es prüfen und testen (wenn Sie es nicht vor mir mit Änderungen in S.211 testen).

 
Artyom Trishkin #:

In Zeile 211 wird an der Cursorposition 34 auf das vordefinierte Array time[] zugegriffen:

Es scheint, dass der Index des Arrays falsch übergeben wird.

Er kann kaum größer als rates_total-1 sein, höchstwahrscheinlich ist er gleich -1, denn er erhält seine Werte im OnChartEvent-Handler durch die Funktion iBarShift(), die -1 zurückgeben kann:


In DrawData() wird ein ungültiger Indexwert durch den Aufruf von CopyRates() behandelt, der keine Daten erhält, wenn der Index negativ ist, und DrawData() dann beendet:

Bevor Sie also auf das time[]-Array zugreifen, müssen Sie den an das Array übergebenen Taktindex überprüfen (in Zeile 211):


Im Allgemeinen - Theorie. Ich habe es nicht getestet, da ich mit der Entwicklung der Fortsetzung des Themas beschäftigt bin (farbige Puffer von Multi-Indikatoren und so weiter). Nach Erscheinen des nächsten Artikels zu diesem Thema werde ich es prüfen und testen (wenn Sie es nicht vor mir mit Änderungen in S.211 testen).

Artem, der Taktindex kann aktuell sein, iBarShift() gibt 0 zurück. Aber man kann nicht weniger als 1 in CopyRates() eingeben. Deshalb sollten wir wahrscheinlich iBarShift()+1 in jeder Variante schreiben, da die Taktnummer und die Anzahl der Takte nicht gleich sind.

 
Alexey Viktorov #:

Artem, der Taktindex kann aktuell sein, iBarShift() gibt 0 zurück. Aber Sie können nicht weniger als 1 in CopyRates() eingeben. Daher sollten wir wahrscheinlich iBarShift()+1 in jeder Variante schreiben , da die Taktnummer und die Anzahl der Takte nicht gleich sind.

In diesem Zusammenhang: Der Index ist die Taktnummer

 
Artyom Trishkin #:

In diesem Zusammenhang: Der Index ist die Taktnummer

Artem, Index - ja, er kann Null sein. Aber die Anzahl der kopierten Elemente

int  CopyRates( 
   string           symbol_name,       // Zeichenname 
   ENUM_TIMEFRAMES  timeframe,         // Zeitraum 
   int              start_pos,         // wo wir anfangen werden 
   int              count,             // wie viel wir kopieren 
   MqlRates         rates_array[]      // Array, in das die Daten kopiert werden 
   );

kann nicht gleich Null sein.

Genau wie die Anzahl der Elemente und der Index in der Liste der Elemente...

 
Alexey Viktorov #:

Artem, der Index - ja, er kann Null sein. Aber die Anzahl der kopierten Elemente

kann nicht gleich Null sein.

Genau wie die Anzahl der Elemente und der Index in der Liste der Elemente...

Genau hier:

if(CopyRates(Symbol(),PERIOD_CURRENT,index,1,rates)!=1)

Wohin zeigt der Index?

 
Artyom Trishkin #:

Es ist genau hier:

Wohin zeigt der Index?

Das war's, ich halte die Klappe. Ich habe mir den Code der Funktion DrawData(mouse_bar_index,time) nicht angeschaut; deshalb habe ich mich geirrt...

 

Forum zum Thema Handel, automatisierte Handelssysteme und Testen von Handelsstrategien

Diskussion über den Artikel "Vorbereitung von Multisymbol-Multiperioden-Indikatoren"

Artyom Trishkin, 2023.11.01 04:46 AM

...Nach der Veröffentlichung des nächsten Artikels zu diesem Thema, werde ich prüfen und testen (wenn Sie mich nicht vorher mit Änderungen in S.211 testen ).


Um etwas zu testen, muss man im Paradigma dessen sein, was vor sich geht ))

Ich habe gemerkt, dass es für mich einfacher ist, meine eigene Version zu skizzieren, da ich mit dem derzeitigen Ansatz nicht vertraut bin. Insbesondere scheint es mir, dass die Klasse CIndMSTF eine Art Superklasse ist. Auf ihrer Basis werden dann eine Reihe von Indikatorklassen erstellt. Unheimlich - die Datei IndMSTF.mqh besteht aus 4 Tausend Zeilen Code )) Ich bin den Weg gegangen, eine Instanz der Klasse CIndicators als Indikatorensammlung zu verwenden . Das ist sehr praktisch. Man braucht kein Fahrrad zu erfinden.

Warum sollte die Klasse CIndMSTF dann Daten in Puffern (SBuffer m_buffers[]) speichern? Wir haben sie einmal in OnCalculate() berechnet, und das reicht aus. D.h. als Parameter per Referenz akzeptiert, berechnet und gegeben....

Ich werde später mehr darüber schreiben, womit ich nicht einverstanden bin, sobald ich meine Version fertiggestellt habe....

Ja, ich finde es gut, dass es diesen Mechanismus gibt:

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


Artem, eine Sache noch. Wenn Artikel als Handbuch geschrieben werden, das man studieren möchte, dann gibt es imho nicht genug Schemata für die Beziehungen der Klassen, die der Entwickler erstellt....

Warum sollte man dann den Code aller Indikatoren in das Material des Artikels aufnehmen? Ich meine diesen Abschnitt - "Eine vollständige Liste aller Erbenklassen der Basisklasse des Multisymbol-Multiperioden-Indikators". Ich habemir angesehen, wie viele Codezeilen das sind.

Hier ist der Anfang:

Und hier ist das Ende:


Fast 2.000. Wow!