Fehler, Irrtümer, Fragen - Seite 3148

 
Roman #:

Das liegt daran, dass IndBuff nicht zu rates_total + 1
zugeordnet ist und ArrayResize nicht darauf anwendbar ist.
Sie brachen das Konstrukt. Müssen wir jetzt if-arses verwenden?

for(int i=limit - 1;....

Immerhin...

 
Roman #:

Dies liegt daran, dass der IndBuff nicht rates_total + 1
zugeordnet ist und ArrayResize darauf nicht anwendbar ist.


Hier brauchen Sie das Minus 1 :))
Der Ausdruck zeigt, dass die Abmessungen in Ordnung sind.
Logik anwenden:
Ist der Grenzwert = 0, handelt es sich um einen neuen Tick.
Wenn der Grenzwert = 1 ist, bedeutet dies einen neuen Balken (das letzte Element des Puffers rates_total ist -1 und Sie haben rates_total - daher der Überlauf)
Wenn der Grenzwert > 1 ist, ist es besser, den gesamten Indikator neu zu berechnen.
 
Maxim Kuznetsov #:

for(int i=limit - 1;....

Zumindest...

Wissen Sie, was am ärgerlichsten ist? Dass jedes Verhalten stillschweigend und ohne Vorwarnung hintergangen wird.
Und dann werden Menschen verletzt. Ich habe genug von diesem Metatrader.

 
Roman #:

Wissen Sie, was am ärgerlichsten ist? Dass jedes Verhalten stillschweigend und ohne Vorwarnung hintergangen wird.
Und dann werden Menschen verletzt. Ich habe genug von diesem Metatrader.

Alles ist wie vorher.
Ihr Fehler.
Tipp: Wenn Sie lernen, den Debugger zu benutzen, müssen Sie nicht mehr Korrektur lesen, sondern sehen alle Ihre Fehler sofort.
 
Roman #:

Wissen Sie, was am ärgerlichsten ist? Dass jedes Verhalten stillschweigend und ohne Vorwarnung hintergangen wird.
Und dann werden Menschen verletzt. Ich habe genug von diesem Metatrader.

Ich habe keine Änderungen bei der Berechnung der Indikatoren festgestellt. Wie Sie oben gesehen haben, hat Nikolay zu Recht erklärt, was die als rates_total-prev_calculated berechneten Grenzwerte bedeuten.

Und es funktioniert seit Jahren - seit dem vierten Terminal.

 
Nikolai Semko #:
Hier brauchen Sie das Minuszeichen :))
Der Ausdruck zeigt, dass die Abmessungen in Ordnung sind.
Logik anwenden:
Wenn Limit = 0, dann ein neuer Tick
Wenn limit = 1 ist, bedeutet dies einen neuen Balken (das letzte Element des Puffers rates_total ist -1, und Sie haben rates_total, daher der Überlauf)
Wenn der Grenzwert > 1 ist, ist es besser, den gesamten Indikator neu zu berechnen.

Nikolay Ich kenne Konstruktionen, wenn und für eine,
aber ich habe immer mit für gearbeitet, ich habe mich einfach daran gewöhnt, es ist bequemer.
Aber ich habe schon vor langer Zeit einige merkwürdige Dinge bemerkt, und ich habe es vor mir hergeschoben, um es herauszufinden.
Vorher funktionierte es einwandfrei

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

Und das ohne Wenn und Aber.

 
Roman #:



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

//+------------------------------------------------------------------+
//|                                                       Simple.mq5 |
//|                              Copyright © 2022, Vladimir Karputov |
//|                      https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, Vladimir Karputov"
#property link      "https://www.mql5.com/en/users/barabashkakvn"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Close
#property indicator_label1  "Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double         CloseBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,CloseBuffer,INDICATOR_DATA);
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


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

//+------------------------------------------------------------------+
//|                                                       Simple.mq5 |
//|                              Copyright © 2022, Vladimir Karputov |
//|                      https://www.mql5.com/en/users/barabashkakvn |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2022, Vladimir Karputov"
#property link      "https://www.mql5.com/en/users/barabashkakvn"
#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Close
#property indicator_label1  "Close"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
input int      Input1=9;
//--- indicator buffers
double         CloseBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,CloseBuffer,INDICATOR_DATA);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit=prev_calculated-1;
   if(prev_calculated==0)
      limit=0;
   for(int i=limit; i<rates_total; i++)
     {
      CloseBuffer[i]=close[i];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+


Ergebnis:

Und es gibt keine Fehler.

Dateien:
Simple.mq5  5 kb
 
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.

Danke natürlich für das direkte i++ Beispiel.
Aber die Tatsache, dass ich eine Kehrschleife habe, haben Sie nicht bemerkt.
Und wenn iClose als Beispiel angeführt wird, muss damit gezeigt werden, dass der Index i später in anderen Funktionen verwendet wird.

 
Roman #:

Nikolai Ich kenne die Konstruktionen von if und for one,

sonst wenn

Nikolai Semko #:
Logik anwenden:
Wenn Limit = 0, dann ein neuer Tick
Wenn limit = 1 ist, bedeutet dies einen neuen Balken (das letzte Element des Puffers rates_total ist -1, und Sie haben rates_total, daher der Überlauf)
Wenn der Grenzwert > 1 ist, ist es besser, den gesamten Indikator neu zu berechnen.

Hier ist
falsch - verwenden Sie besser
if limit != 1

Die ganze Logik ist also ungefähr so, wie sie ist:

limit = rates_total - prev_calculated;
if (limit == 0) {..} // новый тик
else if ( limit == 1) {..} // новый бар
else {..} // полный пересчет всего индикатора
Ich verstehe, dass einige Leute entrüstet sein werden und sagen, warum sollte ich alles neu berechnen, wenn limit == 2,
aber wenn limit nicht gleich 1 und nicht gleich 0 ist, bedeutet das, dass dies die erste Initialisierung des Indikators ist oder etwas schief gelaufen ist (z.B. Verbindungsfehler oder Serverfehler)
Außerdem bin ich oft auf Situationen gestoßen, in denen prev_calculated höher war als rates_total. Wahrscheinlich handelte es sich um einen Fehler, der inzwischen behoben wurde, aber seither verwende ich dieses Design als Sicherheitsvorkehrung.
 
Nikolai Semko #:

wenn Grenze != 1

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