Fehler, Irrtümer, Fragen - Seite 1805

 
Alexey Kozitsyn:
@Slawa, bitte klären, gibt es irgendwelche Einschränkungen für das Schreiben der Indikatorpuffer außerhalb der Funktion OnCalculate()? Wird beim Schreiben von Puffern in OnTimer(), OnBookEvent(), OnChartEvent() Funktionen immer alles korrekt geschrieben?

Es gibt keine ausdrücklichen Einschränkungen. Sie können es versuchen.

Allerdings kann es beim Hinzufügen eines neuen Balkens zu einer Umverteilung der Puffer kommen (die Umverteilung wird mit einer Reserve durchgeführt, also nicht bei jedem neuen Balken).

PS obwohl nein. alle Verarbeitung ist in einem Thread, so dass es keine Kollisionen sein sollte. Versuchen Sie
 
Slawa:
Es gibt keine offensichtlichen Einschränkungen. Versuchen Sie es.

Allerdings kann es beim Hinzufügen eines neuen Balkens zu einer Umverteilung des Puffers kommen (die Umverteilung wird mit einer gewissen Reserve durchgeführt, also nicht bei jedem neuen Balken).

Hier, mehr Details, bitte. Was ist die Zuweisung, wie geht man damit um?

Ich habe die Frage nur gestellt, weil ich bei einem neuen Balken "Schluckauf" bemerke. Und diese Schluckauf zurückgesetzt Pufferwerte = 0 (mit dem leeren Wert, den ich ausdrücklich festgelegt - EMPTY_VALUE). Bisher ist es mir noch nicht gelungen, diesen Moment zu erwischen. Manchmal "springt" der Indikator einfach und kehrt sofort wieder in den Normalzustand zurück, manchmal "friert" er einfach ein. Wenn sie feststecken, werden die Werte nicht in die Datei geschrieben und die Puffer werden nicht gezeichnet. Die Puffer werden in OnBookEvent() geschrieben.

Derselbe Code funktioniert auch in OnCalculate(), aber OnCalculate() erlaubt es nicht, alle Werte des Open Interest und anderer Börsenparameter zu erfassen.

Sie kann nur durch TF-Umschaltung gelöst werden. Ja, 5-7 gleiche Indikatoren, die zur gleichen Zeit laufen und unterschiedliche Daten schreiben.

Hinzugefügt:

Ja, ich habe heute beim Einschalten des Terminals genau das Gleiche bemerkt. Alles ist einfach hängen geblieben, alle Puffer, alle Werte haben Nullen, der Indikator hat keinen Verlauf (in eine Datei geschrieben) ausgegeben. Mit anderen Worten, es wurde einfach aufgelegt. Der Markt war noch geschlossen. Ich änderte TF - der Verlauf kam zurück, aber noch einmal zur Frage nach der Notwendigkeit eines Zeitstempels für die Werte von SESSION: der letzte bekannte Wert zum Zeitpunkt des Terminalschlusses wurde aufgezeichnet! Die Synchronisierung der Historie war erfolgreich, keine Fehler. TimeCurrent() gab jedoch einen fehlerhaften Wert zurück (etwa 21:03). Die tatsächliche Zeit dieses Wertes ist 23:49:59. Alles in allem eine Art von Traurigkeit.

 
Alexey Kozitsyn:

Hier, mehr Details, bitte. Was ist die Zuweisung, wie sollte sie gehandhabt werden?

Ich habe die Frage nur gestellt, weil ich bei einem neuen Balken "Schluckauf" bemerke. Und diese Schluckauf null Pufferwerte = 0 (und der leere Wert explizit von mir gesetzt - EMPTY_VALUE). Bisher ist es mir noch nicht gelungen, diesen Moment zu erwischen. Manchmal "springt" der Indikator einfach und kehrt sofort wieder in den Normalzustand zurück, manchmal "friert" er einfach ein. Wenn sie feststecken, werden die Werte nicht in die Datei geschrieben und die Puffer werden nicht gezeichnet. Die Puffer werden in OnBookEvent() geschrieben.

Derselbe Code funktioniert auch in OnCalculate(), aber OnCalculate() erlaubt es nicht, alle Werte des Open Interest und anderer Börsenparameter zu erfassen.

Sie kann nur durch TF-Umschaltung gelöst werden. Ja, 5-7 gleiche Indikatoren laufen gleichzeitig und schreiben unterschiedliche Daten.

Es ist ganz einfach. Der erste Tick eines neuen Balkens kommt. Der Puffer ist für 1000 Takte ausgelegt und ist vollständig gefüllt.

Wir teilen den Puffer auf 1250 Takte neu zu und kopieren 1000 Takte aus dem vorherigen Puffer in den neuen Puffer. Setzen Sie den neuen Puffer an die Stelle des alten Puffers, löschen Sie den alten Puffer. Wir fügen den 1001sten Balken hinzu.

Was meinen Sie mit "was damit zu tun ist"?

Beachten Sie, dass alle Indikatoren eines Symbols nacheinander in einem Thread gezählt werden. Wenn ein Indikator langsamer wird, verlangsamt sich auch der gesamte Prozess der Symbolverarbeitung.
 
Slawa:
Einfach. Der erste Tick des neuen Balkens kommt an. Der Puffer ist für 1000 Takte ausgelegt und ist vollständig gefüllt.

Wir ordnen den Puffer auf 1250 Takte neu zu und kopieren 1000 Takte aus dem alten Puffer in den neuen Puffer. Setzen Sie den neuen Puffer an die Stelle des alten Puffers, löschen Sie den alten Puffer. Wir fügen den 1001sten Balken hinzu.

Was meinen Sie mit "was damit zu tun ist"?

Beachten Sie, dass alle Indikatoren eines Symbols nacheinander in einem Thread gezählt werden. Wenn ein Indikator langsamer wird, verlangsamt sich auch der gesamte Prozess der Symbolverarbeitung.
Dessen bin ich mir bewusst. Und die Umverteilung wirkt sich, soweit ich verstanden habe, stärker auf OnBookEvent() als auf OnCalculate() aus?
 
Alexey Kozitsyn:
Ich bin mir der Sache mit den einzelnen Fäden bewusst. Und die Umverteilung wirkt sich, so wie ich es verstehe, eher auf OnBookEvent() als auf OnCalculate() aus?
Die Umverteilung wird durchgeführt, wenn ein neuer Tick eintrifft. Unmittelbar nach dem Eintreffen eines neuen Ticks wird OnCalculate außer der Reihe aufgerufen. Erst danach wird die Verarbeitung der Ereignisse, die der Indikator empfangen hat, fortgesetzt.

Aber, bis der Indikator (jeder Indikator auf diesem Symbol!) seine Berechnungen beendet (OnCalculate, OnTimer, OnChartEvent, OnBookEvent), wird der neue Tick nicht zur Verarbeitung gelangen.
 
Slawa:
Die Neuverteilung erfolgt bei Ankunft eines neuen Ticks. Unmittelbar nachdem ein neuer Tick aus der Warteschlange eingetroffen ist , wird OnCalculate aufgerufen. Und erst danach wird die Verarbeitung der Ereignisse, die der Indikator empfängt, fortgesetzt

Solange der Indikator (jeder Indikator auf diesem Symbol!) seine Berechnungen nicht abgeschlossen hat (OnCalculate, OnTimer, OnChartEvent, OnBookEvent), wird kein neuer Tick verarbeitet.

Soweit ich weiß, werden die Indikatoren für ein Symbol nacheinander berechnet, d. h. wenn ich die Indikatoren i1, i2 und i3 in eine Reihe werfe, werden sie in derselben Reihenfolge berechnet?

Ich habe jetzt einen Standard-MAKD zum Testen hinzugefügt; es ist der letzte in der Liste. Ich werde sehen, ob er langsamer wird, wenn ein neuer Balken gebildet wird.

 
Alexey Kozitsyn:

Soweit ich weiß, werden die Indikatoren für ein Symbol nacheinander berechnet, d. h. wenn ich die Indikatoren i1, i2 und i3 in eine Reihe werfe, werden sie in derselben Reihenfolge berechnet?

Jetzt habe ich einen Standard-MAKD zum Testen hinzugefügt, es ist der letzte in der Liste. Ich werde sehen, ob er daran hängen bleibt, wenn ein neuer Balken gebildet wird.

Zu Beginn, ja, die Berechnung erfolgt in der gleichen Reihenfolge.

Wenn Sie jedoch verschiedene Indikatoren löschen und hinzufügen, kann die Reihenfolge der Neuberechnung Sie überraschen. Verlassen Sie sich daher nicht auf die Reihenfolge
 
Slawa:
Zunächst ja, die Berechnung erfolgt in der gleichen Reihenfolge.

Wenn Sie jedoch verschiedene Indikatoren löschen und hinzufügen, kann die Reihenfolge der Neuberechnung Sie überraschen. Verlassen Sie sich also nicht auf die Reihenfolge.
Dies ist notwendig, um zu überprüfen, ob der letzte Indikator, der Standard-MAKD, berechnet wird, wenn meine Indikatoren hängen. Meine gehen alle vor dem MACD.
 
Slawa:

Das ist es, was ich meinte:

Ein neuer Balken wurde am GOLD-3.17 gebildet, alle meine Indikatoren wurden in OnBookEvent() durch dieses Symbol berechnet, alle aktuellen Werte wurden auf Null gesetzt. Nach der Logik des Indikators werden die Puffer zum Zeitpunkt der Bildung eines neuen Balkens nicht auf Null gesetzt, sondern der aktuelle Wert wird sofort in sie geschrieben. Der MACD ist nicht auf Null gesetzt. Das Protokoll ist leer, d.h. es gab keine Unsynchronisation, alle Werte sollten korrekt sein. In diesem Fall dauerte die Störung etwa 5 Sekunden. Gestern hatte ich mehrere Minuten lang Störungen am Stück.

Alle anderen Charaktere waren in Ordnung. Auch hier gilt, dass die Logik des Indikators die Werte nicht auf 0 zurücksetzt! Die Frage ist also: Bei der Umverteilung von neuen Gegenständen sollte theoretisch Müll enthalten sein. Aber hier 0,0 und hängt...

Ja, noch etwas: Wenn ein Indikator hängt, hätten die anderen ihre Werte behalten müssen! Aber sie alle, alle auf einmal, haben sich auf Null gestellt. Gibt es Situationen, in denen dies passieren könnte?
 

Ein ähnliches Problem ist bei BR-3.17 aufgetreten:

@Slawa eine Idee, in welche Richtung man graben sollte? Gibt es vielleicht eine bessere Möglichkeit, Austauschdaten zu sammeln und anzuzeigen?

Grund der Beschwerde: