Fehler, Irrtümer, Fragen - Seite 3149

 
Vladimir Karputov #:

Schritt 1: Erstellen Sie eine Vorlage mit dem "MQL5-Assistenten":


Schritt 2: Schreiben Sie "limit" richtig und verwenden Sie das close-Array - NICHT den iClose-Aufruf!!!


Ergebnis:

und es treten keine Fehler auf.

Wer sagt, dass dies die einzig richtige Berechnung von Grenzwert und Indikator ist?

Wir diskutieren eine andere Berechnung des Grenzwerts und den Indikator selbst - von links nach rechts - vom Beginn der Geschichte bis zum heutigen Zeitpunkt. Es ist einfacher und offensichtlicher.

In einem solchen berechneten Limit (int limit = rates_total - prev_calculated; if(limit>1) limit=rates_total-1;) werden alle Daten über

  1. ob es sich um einen aktuellen Tick handelt,
  2. ob es sich um die Eröffnung einer neuen Bar handelt,
  3. ob es sich um eine Änderung der historischen Daten handelt.

Wenn der aktuelle Tick (Limit==0), dann for(int i=Limit; i>=0; i--) { // . } wird der Indikator bei jedem neuen Tick berechnet, und nur der Null-Balken wird neu berechnet.

Wenn wir einen neuen Balken öffnen (Limit==1), dann for(int i=Limit; i>=0; i--) { // ... } führt die Berechnung des ersten und des Null-Balkens durch - des vorherigen und des neu geöffneten

Wenn sich diese Geschichte ändert (limit>1), dann for(int i=limit; i>=0; i--) { // ... } führt eine vollständige Neuberechnung des Indikators für den gesamten verfügbaren Verlauf durch (der Verlauf wurde irgendwo geändert)

 
TheXpert #:
Was macht das für einen Unterschied? Kann es weniger als Null werden?

Ja, das habe ich (zum vorherigen Beitrag hinzugefügt)

 
Artyom war der Einzige, der das Problem verstand.
Aber dieses Problem ist offenbar von Dauer.
Und jetzt gibt es nur noch Wenns.
 
Roman #:
Nur Artyom verstand das Problem.
Aber dieses Problem ist offenbar von Dauer.
Und jetzt gibt es nur noch Wenns.

Nein, ich habe es nicht verstanden. Klären Sie, was ich verstanden habe...

 
Vladimir Karputov #:
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit; i<rates_total; i++)
     {
      CloseBuffer[i]=close[i];
     }

ternärer Operator sieht lakonischer aus (IMHO)

int limit = prev_calculated==0 ? 0: prev_calculated-1;

Außerdem, wie gesagt, was ist, wenn etwas schief geht und prev_calculated sich als höher als rates_total herausstellt?
Ich bin auf eine solche Situation gestoßen, wenn die maximalen Balken im Fenster != unbegrenzt sind, aber zum Beispiel 50000. In diesem Fall würde sich die Größe des Balkenfelds mit jedem neuen Balken um 1 erhöhen, aber irgendwann würde sie wieder 50000 betragen. Ich kann dieser Logik nicht folgen. Ich habe es vor ein paar Jahren entdeckt. Ich muss es jetzt überprüfen. Ich werde eine Freischaltung auf meinem VPS einrichten.

 
Artyom Trishkin #:

Nein, ich habe es nicht verstanden. Klären Sie, was ich verstanden habe...

Was im Moment noch nicht so funktioniert wie früher

Limit==0
für Ticks i>=0
für Bars i>0

Sie haben oben alles richtig geschrieben,
nur für neuen Takt falsch gedrucktfor(int i=limit; i>=0; i--)
der Operator = wird hier nicht benötigt, aber er ist wahrscheinlich in der Vergangenheit,
es sei denn, sie geben das vorherige Verhalten zurück
.

 
Roman #:

Was im Moment noch nicht so funktioniert wie früher

Limit==0
für Ticks i>=0
für Bars i>0

Du hast oben alles richtig geschrieben,
nur bei new bar ist es falsch ausgedrucktfor(int i=limit; i>=0; i--)
hier wird der Operator = nicht benötigt, aber er muss schon in der Vergangenheit liegen,
wenn nicht, wird das vorherige Verhalten zurückgegeben
.

Auch hier verstehe ich nichts. Was ist daran falsch? Alles scheint so zu sein, wie es vorher war.

 
Artyom Trishkin #:

Ich verstehe es wieder nicht. Was ist daran falsch? Alles scheint so zu sein, wie es vorher war.

Mit diesem Entwurf.

int limit = rates_total-prev_calculated;

for(int i=limit; i>=0; i--)


Indikatorpuffer ist außerhalb der Grenzen.

Bitte zeigen Sie mir ein Beispiel fürTicks mit Zyklus i>=0
Vielleicht habe ich etwas vergessen und mache es falsch
.

 
Roman #:

Bei diesem Entwurf
gerät der Indikatorpuffer außer Rand und Band.

ist immer ausgegangen.
 
Roman #:

Mit diesem Entwurf.


Indikatorpuffer ist außerhalb der Grenzen.

Bitte zeigen Sie mir ein Beispiel fürTicks mit Zyklus i>=0
vielleicht habe ich vergessen, was ich falsch mache
.

Ich habe bereits geschrieben, dass Sie bei dieser Konstruktion mit rates_total auf den Pufferindex zugreifen (wenn prev_calculated == 0 ).
Und das ist ein Überlauf, denn rates_total ist die Größe des Puffers, dessen letztes Element rates_total-1

Grund der Beschwerde: