Vertikale Linie. - Seite 4

 

Ich bin noch dabei, die Feinheiten der Indikatoren zu lernen und habe Fragen. Ich setze den Indikatorpuffer in OnInit() zurück, aber aus irgendeinem Grund werden die Puffer während der Kompilierung des Indikators nicht zurückgesetzt. Für die Logik sollte es nach der Kompilierung eine volle Zelle für jeden Puffer geben , aber auf dem Bild können Sie sehen, dass es viele davon gibt (ich denke, dass dies die vorherigen Pufferzellen sind). Wo mache ich einen Fehler?

int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,ColorHistogram_2Buffer1,INDICATOR_DATA);
   SetIndexBuffer(1,ColorHistogram_2Buffer2,INDICATOR_DATA);
   SetIndexBuffer(2,ColorHistogram_2Colors,INDICATOR_COLOR_INDEX);
//--- установим пустое значение
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);

   ArrayInitialize(ColorHistogram_2Buffer1,0);
   ArrayInitialize(ColorHistogram_2Buffer2,0);
   ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);

   Print("-INITALIZATION-");

   false;
//---
   return(INIT_SUCCEEDED);
  }
      if(rates_total-8==i)// || rates_total-5==i || rates_total-2==i)
        {
         ColorHistogram_2Buffer1[i]=high[i];
         ColorHistogram_2Buffer2[i]=low[i];
         ColorHistogram_2Colors[i]=0;
        }


.
 
Nauris Zukas:

Ich bin noch dabei, die Feinheiten der Indikatoren zu lernen und habe Fragen. Ich setze den Indikatorpuffer in OnInit() zurück, aber aus irgendeinem Grund werden die Puffer während der Kompilierung des Indikators nicht zurückgesetzt. Für die Logik sollte es nach der Kompilierung eine volle Zelle für jeden Puffer geben , aber auf dem Bild können Sie sehen, dass es viele davon gibt (ich denke, dass dies die vorherigen Pufferzellen sind). Wo mache ich einen Fehler?

Bei OnInit haben die Indikatorpuffer die Länge Null.


Deshalb können sie tun und lassen, was sie wollen, denn für sie sieht das alles aus wie die Arbeit eines toten Mannes.

Und wenn die Codeausführung zu OnCalculate wechselt, wird die Größe sofort gleich rates_total.

und es gibt "Müll" in allen Zellen des Feldes. Es können auch Reste aus der alten Indikatorberechnung vorhanden sein.

 
Alexey Viktorov:

Bei OnInit haben die Indikatorpuffer die Länge Null.


Deshalb kann man mit ihnen machen, was man will, sie sind ein untrügliches Zeichen.

Und wenn die Codeausführung zu OnCalculate übergeht, wird die Größe sofort mit rates_total gleichgesetzt.

und alle Zellen in der Anordnung haben "Müll" in ihnen. Es kann sein, dass von der alten Indikatorberechnung noch etwas übrig ist.

Vielen Dank, ich habe alles bekommen und es hat funktioniert! Ich habe es so gemacht:

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   return(INIT_SUCCEEDED);
  }
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[])
  {
   if(!ResetOnInit)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
      ResetOnInit=true;
     }
  }
 
Nauris Zukas:

Vielen Dank, es hat alles geklappt! Ich habe es so gemacht:

Warum wird einer Variablen ein Wert zweimal zugewiesen?

bool ResetOnInit=false;
int OnInit()
  {   
   ResetOnInit=false;
   return(INIT_SUCCEEDED);
  }

Und eine Frage: Was ist der Sinn von all dem? Schließlich müssen beim Durchlaufen aller Balken in der Schleife ohnehin alle Zellen des Arrays mit etwas gefüllt werden. Es sei denn, der Indikator soll nur die aktuelle Position anzeigen, aber dann muss das Array bei jedem Takt initialisiert werden, nicht nur zu Beginn...

 
Alexey Viktorov:

Warum wird einer Variablen ein Wert zweimal zugewiesen?

Ich war mir nicht sicher, ob alle Aktionen mit dem Graphen von OnInit() nachgeahmt werden, zum Beispiel das Ändern von Taimfreims. Ändern taimfreim zurückgesetzt (gerade überprüft), aber vielleicht gibt es etwas anderes, so habe ich die zweite in OnInit(), um sicher zu sein. Aber wenn nicht, dann werde ich sie nicht dort platzieren.
 
Alexey Viktorov:

Und die Frage ist: Wozu brauchen wir das alles? Schließlich müssen beim Durchlaufen aller Balken in der Schleife ohnehin alle Zellen des Arrays mit etwas gefüllt werden. Es sei denn, der Indikator soll nur die aktuelle Position anzeigen, aber dann sollte das Array bei jedem Takt initialisiert werden, nicht nur zu Beginn...

In diesem Beispiel wollte ich nur verstehen, wie man den Puffer zurücksetzt. Aber in Zukunft (in dem Indikator, an dem ich gerade arbeite) werde ich sowohl die bisherigen Zellen belassen als auch neue hinzufügen müssen. Und genau daran begann ich zu arbeiten - sozusagen die ersten Tests.

 
Nauris Zukas:
Ich war mir nicht sicher, ob alle Aktionen mit dem Diagramm von OnInit() nachgeahmt werden, z.B. der Wechsel des Taimfreims. Ändern taimfreim zurückgesetzt (überprüft es jetzt), aber vielleicht gibt es etwas anderes, so habe ich die zweite in OnInit(), um sicher zu sein. Aber wenn nicht, dann werde ich sie nicht dort platzieren.

Ahh. Nun ja, die Variablen der globalen Ebene werden nicht initialisiert, wenn sich die Diagrammperiode ändert. Ich glaube... Ich kann mich nicht mehr genau erinnern.

Und im Allgemeinen kann man auf die zusätzliche boolsche Variable verzichten.

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[])
  {
   if(prev_calculated == 0)
     {
      ArrayInitialize(ColorHistogram_2Buffer1,0);
      ArrayInitialize(ColorHistogram_2Buffer2,0);
      ArrayInitialize(ColorHistogram_2Colors,EMPTY_VALUE);
     }
  }
 
Alexey Viktorov:

Und im Allgemeinen kann man auf diese zusätzliche boolsche Variable verzichten.

Ja, genau, noch besser, danke.

 

Können Sie mir sagen, warum bei einem Zeitraum von mehr als 30 Minuten eine so seltsame Zahl angezeigt wird?

Print("PERIOD: ",Period()); 

KP 0 14:33:22.423 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,M30) PERIOD: 30

GG 0 14:33:24.402 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H1) PERIOD: 16385

RJ 0 14:33:25.675 Test_DRAW_COLOR_HISTOGRAM2 (EURUSD,H4) PERIOD: 16388
 
Nauris Zukas:

Können Sie mir sagen, warum bei einem Zeitraum von mehr als 30 Minuten eine so seltsame Zahl angezeigt wird?

Im MT5 sind die Periodenwerte nicht gleich der Anzahl der Minuten, wie im MT4

Grund der Beschwerde: