Fehler, Irrtümer, Fragen - Seite 3032

 
Andrey Dik:

Vielen Dank, Andrew. Sie sind der Einzige, der die Frage richtig verstanden hat.


Jetzt funktioniert alles wie gewünscht, die Indikatoren haben nur einmal beim ersten Durchlauf voll gerechnet und dann jeweils nur einmal bei ihrem neuen Balken.


Der endgültige Code des zweiten Indikators wird hoffentlich für jemanden nützlich sein:

Hier ist der Anfang dessen, woran Sie hätten denken sollen

Forum zum Thema Handel, automatisierte Handelssysteme und Strategietests

Wanzen, Wanzen, Fragen

Alexey Viktorov, 2021.05.28 08:36

Wozu dient dieser Scheck?

//проверка готовности данных и индикатора на другом TF
if (SeriesInfoInteger (Symbol (), tf, SERIES_SYNCHRONIZED))
{
  if (iBars (Symbol (), tf) != BarsCalculated (handleFr)) return 0;
}
else return 0;

Es wäre einfacher, return 0; ohne irgendwelche Bedingungen zu schreiben...

Bei jedem neuen Balken wird die Bedingung erfüllt und alle Balken werden neu berechnet, unabhängig von der Synchronisation. Sie haben einen unüberlegten Code geschrieben und geben vor, dass es sich um einen Terminalfehler handelt...


Und Igor Makanu sagte dies sogar schon früher...
 

Ich möchte Sie daran erinnern.

1. Für jedes Symbol, für das mindestens ein Chart geöffnet ist, gibt es einen eigenen Thread für die Verarbeitung eingehender Ticks. Es können mehrere Diagramme für ein bestimmtes Symbol geöffnet sein, aber es gibt trotzdem nur einen Thread.

2. Der Symbol-Thread behandelt Zeitreihen, keine Diagramme. Das heißt, dieselben Datenfelder, die der CopyRates-Anfrage unterzogen werden.

3. Es ist nutzlos, Ihr Symbol in OnTick oder OnCalculate zu fragen, ob es synchronisiert ist. Natürlich ist es das!

4. Alle Zeitreihen werden in der Reihenfolge vom niedrigsten zum höchsten Wert bearbeitet. Zunächst wird der Tick angewandt und dann die Berechnung aller Indikatoren, die für diese Zeitreihe erstellt wurden. Wenn Sie Daten für dasselbe H1-Symbol vom Indikator abfragen, der auf M1 arbeitet, werden Sie niemals Daten mit dem angewandten Tick erhalten. Die Daten werden immer um einen Tick zurückliegen, egal welche Tricks Sie anwenden. Denn ein Thread pro Symbol mit fortlaufender Zeitrahmenverarbeitung.

5. Die obige Aussage gilt nicht für EAs und Skripte, da EAs und Skripte jeweils in ihren eigenen separaten Threads arbeiten.

 
Slava:

Ich möchte Sie daran erinnern.

1. Für jedes Symbol, für das mindestens ein Chart geöffnet ist, gibt es einen eigenen Thread für die Verarbeitung eingehender Ticks. Es können mehrere Diagramme für ein bestimmtes Symbol geöffnet sein, aber es gibt trotzdem nur einen Thread.

2. Der Symbolfaden verarbeitet keine Diagramme, sondern Zeitreihen. Das heißt, dieselben Datenfelder, die der CopyRates-Anfrage unterzogen werden.

3. Es ist nutzlos, Ihr Symbol in OnTick oder OnCalculate zu fragen, ob es synchronisiert ist. Natürlich ist es das!

4. Alle Zeitreihen werden in der Reihenfolge vom niedrigsten zum höchsten Wert bearbeitet. Zunächst wird der Tick angewandt und dann die Berechnung aller Indikatoren, die für diese Zeitreihe erstellt wurden. Wenn Sie Daten für dasselbe H1-Symbol vom Indikator abfragen, der auf M1 arbeitet, werden Sie niemals Daten mit dem angewandten Tick erhalten. Die Daten werden immer um einen Tick zurückliegen, egal welche Tricks Sie anwenden. Denn ein Thread pro Symbol mit fortlaufender Zeitrahmenverarbeitung.

5. Die obige Aussage betrifft nicht Expert Advisors und Skripte, da Expert Advisors und Skripte in ihren eigenen separaten Threads arbeiten.

Bitte schicken Sie mir mehr solche detaillierten Mahnungen! Ich danke Ihnen!

 
Slava:

Ich möchte Sie daran erinnern.

4. Alle Zeitreihen werden in der Reihenfolge von der niedrigsten zur höchsten verarbeitet. Zuerst die Tick-Anwendung, dann die Berechnung aller Indikatoren, die auf dieser Zeitreihe basieren. Wenn Sie Daten für dasselbe H1-Symbol von einem Indikator abfragen, der auf M1 arbeitet, werden Sie niemals Daten mit einem angewandten Tick erhalten. Die Daten werden immer einen Tick zurückliegen, egal welche Tricks Sie anwenden. Denn ein Thread pro Symbol mit fortlaufender Zeitrahmenverarbeitung.

5. Die vorherige Aussage gilt nicht für EAs und Skripte, da EAs und Skripte jeweils in einem separaten Thread arbeiten.

Verstehe ich das richtig, wenn ein EA, der auf M1 arbeitet, einen Indikator auf M1 (oder einem anderen TF?) verwendet, der Daten aus dem oberen TF bezieht, dann kann er beim ersten Tick eines neuen Balkens auf keinen Fall den aktuellen Wert zurückgeben, weil die Warteschlange für die Berechnung des oberen TF ihn nach n Ticks erreicht?

Ich war einfach mit einem solchen Verhalten konfrontiert und habe nach einem Problem im Indikator gesucht, und jetzt stellt sich heraus, dass es so sein sollte. Aber wenn dies der Fall ist, beeinträchtigt es das Testen stark, da ich mehrere Ticks überspringen muss, was beim Testen im OHLC-Modus kritisch ist.

 
Slava:

2. Der Symbolstrom verarbeitet keine Diagramme, sondern Zeitreihen. Das heißt, die Datenfelder, die der CopyRates-Anfrage übergeben werden

....

4. Alle Zeitreihen werden in der Reihenfolge vom niedrigsten zum höchsten Wert verarbeitet. Zuerst die Anwendung des Ticks, dann die Berechnung aller Indikatoren, die auf dieser Zeitreihe erstellt wurden. Wenn Sie Daten für dasselbe H1-Symbol von einem Indikator abfragen, der auf M1 arbeitet, werden Sie niemals Daten mit einem angewandten Tick erhalten. Die Daten werden immer um einen Tick zurückliegen, egal welche Tricks Sie anwenden. Denn ein Thread pro Symbol mit fortlaufender Zeitrahmenverarbeitung.

Warum bekomme ich schwarze "Update"-Bildschirme, wenn ich die TFs wechsle?

öffnete das Diagramm, das ich vorher verwendete (H1 auf EURUSD), verließ den Indikator, tat nichts für 2-3 Minuten, dann wechseln Sie zu einem niedrigeren Diagramm (M30...M1), schwarzen Bildschirm "Update" kann für 10 Sekunden erscheinen

und dieser schwarze Bildschirm hängt von der Build ab - wenn das Terminal ohne schwarzen Bildschirm ist, und wenn es mich wirklich ärgert, weil Sie genau wissen, welche Geschichte geladen ist, brauchen Sie nur ein Diagramm auf dem Terminal zu rendern, und warum für diesen schwarzen Bildschirm warten


D.h. wenn der Indikator auf M5 läuft und alle 30 Minuten den Indikator auf H1 aufruft - wird CopyBuffer() immer die richtigen Daten von H1 erhalten?

oder nicht, also "ziehen Sie den Indikator" auf H1 jeden Tick(Bruch der Verbindung ist noch nicht berücksichtigt)

 

Wie kann man Variablen aus einer Schleife/Funktion in einer anderen Funktion behandeln?

Kann die Sichtbarkeit globaler gestaltet werden?

 
Igor Makanu:

Warum erscheinen schwarze "Update"-Bildschirme beim Wechsel der TFs?

Ich öffnete den Chart, den ich zuvor verwendet habe (H1 auf EURUSD), warf den Indikator, tat nichts für 2-3 Minuten, dann wechsle ich zu einem niedrigeren Chart (M30...M1) und ein schwarzer Bildschirm "Refresh" kann für 10 Sekunden erscheinen

und dieser schwarze Bildschirm hängt von der Build ab - wenn das Terminal ohne schwarzen Bildschirm ist, und wenn es mich wirklich ärgert, weil Sie genau wissen, welche Geschichte geladen ist, brauchen Sie nur ein Diagramm auf dem Terminal zu rendern, und warum für diesen schwarzen Bildschirm warten


D.h. wenn der Indikator auf M5 läuft und alle 30 Minuten den Indikator auf H1 aufruft - wird CopyBuffer() immer die richtigen Daten von H1 erhalten?

oder nicht, also "ziehen Sie den Indikator" auf H1 jeden Tick(wir berücksichtigen die Verbindungsabbruchvarianten noch nicht)

Nach den Worten von Slava denke ich, dass dies nicht der Fall ist.

Da alle Berechnungen nur für den Tick durchgeführt werden, kann es sein, dass die Kette der gebundenen Indikatoren nicht vollständig ist und wir auf den nächsten Tick warten müssen.

Es gibt jedoch einige interessante Probleme, für die ich in der Dokumentation keine Antworten gefunden habe.

Was ist zu tun, wenn keine Ticks auftreten (z.B. am Wochenende)? Wenn Sie einen Indikator platzieren, der im aktuellen Zeitrahmen funktioniert, wird er ohne Probleme gezeichnet, und was interessant ist - er braucht keinen Tick, um empfangen zu werden! Aber wenn der Indikator Daten aus einem anderen Zeitrahmen anfordert, wird er nichts tun, bis ein neuer Tick kommt, und es kommt kein Tick - Wochenende!

Wenn wir ChartRedraw (ChartID ()) im Timer aufrufen, dann für einen bestimmten Kommentar (cnt); wobeicnt um 1 erhöht wird, sehen wir, dass cnt richtig auf dem Bildschirm funktioniert, aber der Indikator wird nicht gezeichnet.

Wenn ich den Bildschirm mit der Schaltfläche Aktualisieren aus dem Kontextmenü aktualisiere, wird der Indikator vom Anfang bis zum Ende neu gezeichnet.

Sobald Sie jedoch den Bildschirm mit derSchaltfläche Aktualisieren aktualisieren, wird der Indikator ohne Probleme gezeichnet.


HH Ihr Beispiel für den zweiten Indikator funktioniert, aber der Code des Experten ist schneller.

 
Andrey Dik:

Was ist zu tun, wenn es keine Ticks gibt (z.B. am Wochenende)? Wenn Sie einen Indikator setzen, der auf dem aktuellen TF arbeitet, wird er ohne Probleme gezeichnet, und was interessant ist - die Ankunft eines Ticks ist dafür nicht erforderlich!

es ist nicht erforderlich

Wenn Sie den Indikator auf dem Diagramm zeichnen, gibt es eine streng definierte Abfolge von Aufrufen: OnInit() und sofort OnCalculated(). d.h. das erste OnCalculated() wird vor dem Tick-Empfang aufgerufen, deshalb muss prev_calc mit 0 verglichen werden. Beim Tick-Empfang oder der Verbindung mit dem Server wird OnCalculated() erneut aufgerufen undprev_calc wird gleich Null sein

Andrey Dik:

Es stellt sich heraus, dass ChartRedraw () und Aktualisieren per Schaltfläche nicht dasselbe sind, auch wenn ich mir das anders vorstellen kann.

Wahrscheinlich sollten Sie ChartSetSymbolPeriod() mit den Parametern NULL und aktueller Periode verwenden, das sollte helfen

 
Igor Makanu:

Höchstwahrscheinlich sollten Sie ChartSetSymbolPeriod() mit den Parametern NULL und aktuelle Periode verwenden, das sollte helfen

ChartSetSymbolPeriod

Der ChartSetSymbolPeriod-Aufruf mit demselben Symbol und Zeitrahmen kann zur Aktualisierung des Charts verwendet werden (ähnlich wie der Befehl Refresh im Terminal). Die Aktualisierung des Diagramms löst wiederum eine Neuberechnung der zugehörigen Indikatoren aus. So können Sie den Indikator im Diagramm neu berechnen, auch wenn es keine Ticks gibt (z.B. am Wochenende).

Es hat geholfen. Und, wie ich mich jetzt erinnere, hat Ak Puschkin gesagt:

Oh, wie viele wundersame Entdeckungen
Bereitenunserenerleuchteten Geist
Und die Erfahrung, den Sohn harter Irrtümer,
Und das Genie, den Freund der Paradoxa,
Und den Zufall, Gott den Erfinder.

 
Andrey Dik:


Was ist zu tun, wenn keine Ticks kommen (z.B. am Wochenende)? Wenn der Indikator im aktuellen Zeitrahmen funktioniert, wird er ohne Probleme gezeichnet, und was interessant ist - er braucht keinen Tick, um zu kommen! Aber wenn der Indikator Daten aus einem anderen Zeitrahmen anfordert, kann er nichts tun, bis ein neuer Tick kommt, und der kommt nicht - am Wochenende!


Aus dem anderen Zeitrahmen werden die Daten entnommen, die im Moment zur Verfügung stehen. Bei der Ausgabe werden also alle Daten perfekt synchronisiert sein.