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 022:29:43.402 TestMSTFMovingAverages (EURUSD,M15) CMSTFIndicators::AddNewMA: MA(10) indicator (handle 10) added to the collection
OS 022:29:43.402 TestMSTFMovingAverages (EURUSD,M15) CMSTFIndicators::AddNewMA: MA(EURUSD,H1:10) indicator (handle 11) added to the collection
DQ 022:29:43.439 TestMSTFMovingAverages (EURUSD,M15) CIndMSTF::Calculate::MA(10): Waiting for data to sync...
QL 022:29:43.439 TestMSTFMovingAverages (EURUSD,M15) CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
IO 022:29:43.439 TestMSTFMovingAverages (EURUSD,M15) CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
PQ 022:29:43.439 TestMSTFMovingAverages (EURUSD,M15) CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
LN 022: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 022:29:43.443 TestMSTFMovingAverages (EURUSD,M15) CIndMSTF::Calculate::MA(10): Waiting for data to sync...
JH 022:29:43.443 TestMSTFMovingAverages (EURUSD,M15) CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
RK 022:29:43.443 TestMSTFMovingAverages (EURUSD,M15) CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
OD 022:29:43.443 TestMSTFMovingAverages (EURUSD,M15) CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
CR 022: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 022:30:04.495 TestMSTFMovingAverages (EURUSD,M15) CIndMSTF::OnTimer::MA(EURUSD,H1:10): Tick emulation. Attempt 1 of 3 ...
II 022:30:34.092 TestMSTFMovingAverages (EURUSD,M15) CIndMSTF::Calculate::MA(10): Waiting for data to sync...
LD 022:30:34.092 TestMSTFMovingAverages (EURUSD,M15) CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
DH 022:30:34.092 TestMSTFMovingAverages (EURUSD,M15) CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
NH 022:30:34.093 TestMSTFMovingAverages (EURUSD,M15) CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
RG 022: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 022:30:35.539 TestMSTFMovingAverages (EURUSD,M15) CIndMSTF::Calculate::MA(10): Waiting for data to sync...
KP 022:30:35.539 TestMSTFMovingAverages (EURUSD,M15) CMSTFIndicators::Calculate::MA(10): Error in indicator calculation: Data is not synchronized
CD 022:30:35.539 TestMSTFMovingAverages (EURUSD,M15) CIndMSTF::Calculate::MA(EURUSD,H1:10): Waiting for data to sync...
FL 022:30:35.539 TestMSTFMovingAverages (EURUSD,M15) CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Data is not synchronized
RK 022: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 022: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 022:30:37.935 TestMSTFMovingAverages (EURUSD,M15) CMSTFIndicators::Calculate::MA(EURUSD,H1:10): Error in indicator calculation: Calculation not completed
ND 022: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 222:30:39.604 TestMSTFMovingAverages (EURUSD,M15) array out of range in'TestMSTFMovingAverages.mq5' (211,34)
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....
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:
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....
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:
voidOnChartEvent(constint id,
constlong &lparam,
constdouble &dparam,
conststring &sparam)
{
//--- Arbeiten mit dem Panel//--- Aufruf des Panel-Ereignishandlers
panel.OnChartEvent(id,lparam,dparam,sparam);
//--- Wenn sich der Cursor bewegt oder das Diagramm angeklickt wirdif(id==CHARTEVENT_MOUSE_MOVE || id==CHARTEVENT_CLICK)
{
//--- Variablen deklarieren, um Zeit- und Preiskoordinaten darin zu speicherndatetime time=0;
double price=0;
int wnd=0;
//--- Wenn die Koordinaten des Cursors in Datum und Uhrzeit umgewandelt werdenif(ChartXYToTimePrice(ChartID(),(int)lparam,(int)dparam,wnd,time,price))
{
//--- schreibt den Index des Balkens, in dem sich der Cursor befindet, in die globale Variablemouse_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 einif(id>CHARTEVENT_CUSTOM)
{
//--- Hier kann das Anklicken der Schaltfläche "Schließen" auf dem Bedienfeld behandelt werdenPrintFormat("%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 - exitif(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).
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.
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
In diesem Zusammenhang: Der Index ist die Taktnummer
Artem, Index - ja, er kann Null sein. Aber die Anzahl der kopierten Elemente
intCopyRates(
string symbol_name, // Zeichenname ENUM_TIMEFRAMES timeframe, // Zeitraum int start_pos, // wo wir anfangen werden int count, // wie viel wir kopierenMqlRates 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...
...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.
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:
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....
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.
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....
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:
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:
Bevor Sie also auf das time[]-Array zugreifen, müssen Sie den dem Array übergebenen Taktindex überprüfen (in Zeile 211):
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).
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.
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
In diesem Zusammenhang: Der Index ist die Taktnummer
Artem, 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...
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:
Wohin zeigt der Index?
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!