Mein Indikator verschwindet jedes Mal, wenn ich zu einem neuen Zeitdiagramm wechsle. - Seite 3

 

Hallo SDC,

ich habe es verstanden. Vielen Dank dafür.

wenn es 100 bar gibt, beginnen die Gesamtraten von 0 bis 99.

Am Anfang, pre_cal =0 --> limit=100 bar - 0 =100.

for(int=1 bis limit=100; I++)

ganz am Ende ist I=100(Indexwert) und es gibt keinen solchen Balken 100.

Um den maximalen Wert I=99 zu erreichen, setze ich limit -1;

Ich frage mich, ob es einen besseren Weg gibt.

Was mich außerdem verwirrt, ist, dass ich bei vielen anderen Indikatoren den gleichen Ansatz verwende und es kein solches Problem mit dem Überschreiten des Bereichs gibt.

Außerdem danke ich Ihnen für die Expertentabelle.

SCFX


   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=2;
//---
 
 for(int i=1;i<limit-1  ;i++)
{  if((High[i]-Low[i])==0) continue;

   if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50     ) 
      boring[i]=Close[i];
 
scfx:

Darüber hinaus, was mich verwirrt ist, dass in vielen anderen Indikator, verwende ich den gleichen Ansatz und es gibt keine solche out of range Problem.



vor B600 außerhalb des Bereichs war nicht ein kritischer Fehler
 
scfx:.

Um den maximalen Wert von I=99 zu erreichen, setze ich daher den Grenzwert -1;

Ich frage mich, ob es einen besseren Weg gibt.

Ihr Code zeichnet nun den Chartverlauf von Balken 1 aufwärts ohne Fehler, aber er zeichnet nicht für neue Balken. Es gibt viele Möglichkeiten, es zu codieren, je nachdem, was Sie wollen, dass es zu tun. Schauen Sie sich die mitgelieferten Indikatoren im Metaeditor an, um zu sehen, wie die MQ-Programmierer es machen. Wenn Sie deren Code lesen können und den Grund für jede Zeile verstehen, werden Sie keine Probleme haben, Indikatoren zu erstellen.

 

Ich habe es jetzt verstanden, DEZA.

Für mich persönlich ist es schwer vorstellbar, wenn ich das Dokument lese. Dennoch bin ich mir nicht sicher, warum prev_calculated= Total_rates -1.

Deshalb mache ich hier ein numerisches Beispiel. Ich hoffe, dass es jemandem, der so neu ist wie ich, helfen könnte.

Normalerweise sehen wir:

Limit= rates_total- prev_calculated; //(no-1)

ODER

for(i=1;i<limit;i++) oder for(i=1;i<=limit;i++)

Das Wichtigste ist, dass LIMIT >=1 ist. In meiner Situation ist LIMIT=0 und deshalb wird der Indikator nicht REFESHED, wenn ein neuer Tick hereinkommt.

Warum, wird sich zeigen. (Ich denke, die Ursache ist die prev_calculated zumindest in meinem Fall)

Angenommen, ich hänge den Indikator an, wenn es 100 Balken im Chart gibt. Hier sind die Werte der Variablen:

Erste Wertetabelle
Variable
Total_rates 100
Index of bar 0-99
prev_calculated 0
Limit 100
Loop i value 1-99

Alles ist gut. Der Wert wird das erste Mal von Takt 1 bis zum Beginn des Charts angezeigt.Wie viele Balken wurden bereits berechnet? Es ist ein kritischer Punkt zu meinem Fehler und ich bin nicht 100% klar.

Wenn ein neuer Balken beginnt, wird im Chart jetzt 101 Balken angezeigt. Der Indikator wird nicht für den bereits geschlossenen Balken aktualisiert, der jetzt Balken 1 ist.

Zweite Wertetabelle
Variable
Total_rates 101
Index of bar 0-100
prev_calculated 99 OR 100 (siehe unten)
Limit2 OR 1
Schleife i Wert 1bis1 OR 1 bis 0

Basierend auf der 1. Tabelle, Indikator berechnen 99 bar (wie es Schleife von 1 bis 99).
Im Dokument heißt es jedoch: "ABER wenn es nicht der erste Aufruf von start() ist, wird der Wert gleich Balken-1 zurückgegeben). Es wird also 101-1=100 zurückgegeben.
Dieser eine andere Balken verursacht Probleme. Wenn das System 100 als prev_calculated zurückgibt.
Sie sehen, dass die Schleife funktioniert, wenn prev_calculated=99 ist.
Wenn prev_calculated jedoch 100 ist, funktioniert die Schleife nicht, da das Limit von 0 oder -1 abhängt.
Kann mir jemand helfen, die Logik hinter prev_calculated= Bars-1 in diesem Fall zu verstehen?

Die Lösung ist also ganz klar: Mach for(i=1; ___ dieser hier muss größer als 1 sein for (<) oder größer oder gleich 1 for (<=)___; i++). In meinem letzten Code ist es gleich 0.

   int pcal=prev_calculated;
   
   if(prev_calculated>0)
   pcal--; 
      
   int limit=rates_total-pcal;
   for(int i=1;i<=limit  ;i++)	//it is <=


//--------------OR ------------------------

  int limit=rates_total-prev_calculated-1;
  if(limit<=0) limit=2; //NOT limit

for(int i=1;i<=limit  ;i++) //it is <=

Ich hoffe es hilft.

SCFX

 

prev_calculated == rates_total

scfx:

Ich habe es jetzt verstanden, SDC.

Für mich persönlich ist es schwer vorstellbar, wenn ich das Dokument lese. Dennoch bin ich mir nicht sicher, warum prev_calculated= Total_rates -1.

SCFX

Erstellen Sie einen neuen Indikator, fügen Sie diesen Code in die Startfunktion ein, hängen Sie ihn an einen 1-Minuten-Chart und beobachten Sie die Alarme, wenn die Ticks eintreffen.

Alert("rt = ",rates_total,"  pc = ",prev_calculated);

Sie werden sehen, dass rates_total die aktuelle Anzahl der Balken ist.

prev_calculated ist die Anzahl der Balken, die zum vorherigen Tick vorhanden waren.

 
SDC:

prev_calculated == rates_total

Erstellen Sie einen neuen Indikator, fügen Sie diesen Code in die Startfunktion ein, hängen Sie ihn an ein 1-Minuten-Diagramm an und beobachten Sie die Warnungen, wenn die Ticks eintreffen.

Sie werden sehen, dass rates_total die aktuelle Anzahl der Ticks ist.

prev_calculated ist die Anzahl der Balken, die zum vorherigen Tick vorhanden waren.


Wow, das ist seltsam.

In dem zuvor geposteten Link heißt es, dass wenn :BUT, wenn es nicht der erste Aufruf von start() ist, der Wert gleich Bars-1 zurückgegeben wird.

Wie kommt es, dass er Bars (Rate_totals) zurückgibt.

 

Ja, ich weiß, dass man das sagt, aber es ist nicht ganz richtig.

Was tatsächlich passiert, ist Folgendes.

rates_total == Gesamtzahl der Balken bei Ankunft des aktuellen Ticks. prev_calculated == Gesamtzahl der Balken bei Ankunft des vorherigen Ticks.

Balken im Chart Indikator Status Kurse_Gesamt prev-calculated rates_total-prev_calculated
1000 erster Lauf beim Laden 1000 0 1000
1000 nächster Tick 1000 1000 0
1000 nächster Tick 1000 1000 0
1001 1. Tick des neuen Balkens 1001 1000 1
1001 nächster Tick 1001 1001 0
1001 nächster Tick 1001 1001 0

Sie haben also 3 Hauptzustände von prev-calculated vs rates_total: Indikator geladen, Ticks in der Mitte des Balkens, erster Tick des neuen Balkens.

prev_calculated == 0 beim ersten Durchlauf, weil es seit dem Laden des Indikators keinen vorherigen Tick gab.

Auch wenn das Diagramm geändert oder eine Historie hinzugefügt wird, wird prev_calculated wieder auf Null zurückgesetzt.

Der Rückgabewert von OnCalculate wird nicht verwendet, aber es ist am besten, den Standardrückgabewert (rates_total) zu verwenden, falls das jemals behoben wird.

 
Balken im Diagramm Indikator Zustand Kurse-gesamt vorausberechnet raten_gesamt-vorher_berechnet
1000 erster Lauf beim Laden 1000 0 1000
Und bar 1000 existiert nicht.

Ich weiß, was in den neuen Dokumenten steht. Wenn man es so macht, muss man prev_calculated auf einen Wert ungleich Null testen und rates_total - prev_calculated um eins nach unten korrigieren. Das ist zurück zu dekrement indicator_counted Verwirrung.
int OnCalculate(const int rates_total,
                const int prev_calculated, ...){
   #define LOOKBACK 1 // iMA(... iBar+1)
   int indicator_counted = prev_calculated;
   if(indicator_counted < LOOKBACK) indicator_counted = LOOKBACK;
   for(iBar = rates_total - 1 - indicator_counted; i>=0 i--){
      Buffer[iBar] = ...;
   }
   return(rates_total - 1); // Recalculate bar zero next tick.
}
Siehe Fortschritt des Indikators anzeigen - MQL4 Forum
 

Es macht keinen Sinn, return( rates_total - 1 ) zu machen, denn der Wert von prev_calculated ist so, als ob er return(rates_total) wäre, unabhängig davon, was Sie ihm gesagt haben.

 
SDC: Es hat keinen Sinn, return( rates_total - 1 ) zu machen, denn der Wert von prev_calculated ist so, als ob er return(rates_total) wäre, unabhängig davon, was Sie ihm gesagt haben.
Haben Sie das Problem an den Service Desk gemeldet?