Indikator berechnet vergangene Kerzen korrekt, aber zukünftige falsch

 
Hallo zusammen,

bin gerade an den ersten Versuchen eines Indikators. Habe Ihn zu beginn noch relativ einfach gehalten (daher die zeitfressende For-Schleife).

Wenn ich den Indi im StrategyTester überprüfe, erkennt man, dass er den vergangenen chart korrekt berechnet, sobald allerdings neue Kerzen erscheinen, berechnet der Indikator völlig andere Werte. In dem Video im Anhang kann man diese Anomalie feststellen.

ab dem 31.12. um etwa um 17:30 beginnt der Strategy Tester:



Habe ein Video angehangen, welches das ganze zusätzlich zum Bild verdeutlicht:

Hier der Code:

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_plots   1

#property indicator_type1   DRAW_LINE
#property indicator_color1  DodgerBlue
#property indicator_label1  "PriceDensity"
#property indicator_width1  2
//--- input parameters
input int DensityPeriod=14;  // ATR period
//--- indicator buffers
double    priceDensity[];
double    maxHigh[];
double    maxLow[];

//--- global variable
double       sumHighLow;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
void OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,priceDensity,INDICATOR_DATA);
   SetIndexBuffer(1,maxLow,INDICATOR_CALCULATIONS);
   SetIndexBuffer(2,maxHigh,INDICATOR_CALCULATIONS);
   //SetIndexBuffer(1,ExtTRBuffer,INDICATOR_CALCULATIONS);
//---
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//--- sets first bar from what index will be drawn
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,DensityPeriod);
//--- name for DataWindow and indicator subwindow label
   IndicatorSetString(INDICATOR_SHORTNAME,"Price Density");
   PlotIndexSetString(0,PLOT_LABEL,"Price Density");
//--- initialization done
  }
//+------------------------------------------------------------------+
//| Average True Range                                               |
//+------------------------------------------------------------------+
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 &TickVolume[],
                const long &Volume[],
                const int &Spread[])
  {
  
//ArraySetAsSeries(High,true);
//ArraySetAsSeries(Low,true);

   if(rates_total < DensityPeriod) return(rates_total);
   
   int limit,i;
   
   if(prev_calculated==0)
     {
      limit=(DensityPeriod+1); 
      for(i = 0 ; i<limit ;i++) 
        {
         priceDensity[i]=0;
        }
     }  
   else limit=prev_calculated-1;
 
 
   for(i = limit; i < rates_total && !IsStopped() ; i++)
      {        
       Comment("i: ",i,
             "\n limit: ",limit,
             "\n rates_total: ",rates_total,
             "\n prev_calculated: ",prev_calculated );
             
       if(i == 24800)DebugBreak();
       if(i < DensityPeriod)continue;
       
       for(int k = i- DensityPeriod; k < i ; k ++)
         {
          sumHighLow += High[k] - Low[k];
         }
      
       maxHigh[i] = High[ArrayMaximum(High,i-DensityPeriod,i)];
       maxLow[i] =  Low [ArrayMinimum(Low ,i-DensityPeriod,i)];
       priceDensity[i] = sumHighLow / (maxHigh[i] - maxLow[i]);
       
       sumHighLow = 0;
      }             
   return(rates_total);
  }
//+------------------------------------------------------------------+

Für einen Hinweis wäre ich euch sehr dankbar...



https://gofile.io/d/mbEeJ0
Gofile - Free file sharing and storage platform
  • gofile.io
Gofile is a free file sharing and storage platform. You can store and share data of all types. There is no limit and everything is free.
 

Ich verstehe nicht wirklich, was der Indi. soll aber nicht tut.

Wenn alles ok ist bis auf die neue, trennen die Berechnung in alte und die neue Bar(s) und schau mit dem Debugger (mit hist. Daten) was bei der neuen passiert.

 
Carl Schreiber #:

Ich verstehe nicht wirklich, was der Indi. soll aber nicht tut.

Wenn alles ok ist bis auf die neue, trennen die Berechnung in alte und die neue Bar(s) und schau mit dem Debugger (mit hist. Daten) was bei der neuen passiert.

auf dem Bild oben soll der Indie (mal grob gesagt) den graph in etwa so fortführen, wie er das bisher tat, allerdings fängt er an den graph völlig anders zu zeichnen (siehe bild oben, etwa in der Mitte)

Die berechnung der vergangenen Kerzen ist definitiv korrekt.

Zu deinem Hinweis: Wie trenne ich denn die Berechnung in alte und neuen Bars?

 
Claudius Marius Walter #:

auf dem Bild oben soll der Indie (mal grob gesagt) den graph in etwa so fortführen, wie er das bisher tat, allerdings fängt er an den graph völlig anders zu zeichnen (siehe bild oben, etwa in der Mitte)

Die berechnung der vergangenen Kerzen ist definitiv korrekt.

Zu deinem Hinweis: Wie trenne ich denn die Berechnung in alte und neuen Bars?

Was tut man mit einem indi der im wesentliche ein gerader strich ist

 
erstmal reinzoooOOomen?

Aber es liegt definitiv an der Berechnung der neuen Bars...

@Carl meinst du, ich soll einfach eine

if(Bars = rates_total-10) DebugBreak();

einbauen und mal sehen, was passiert, wenn er bei rates_total ankommt?
 
Claudius Marius Walter #:
erstmal reinzoooOOomen?

Aber es liegt definitiv an der Berechnung der neuen Bars...

@Carl meinst du, ich soll einfach eine

if(Bars = rates_total-10) DebugBreak();

einbauen und mal sehen, was passiert, wenn er bei rates_total ankommt?

Naja, der Index rates_total  verursachte einen Fehler (Zugriff außerhalb des Arrays), aber das weißt Du wahrscheinlich.

Ich meine

a) 0(?) .. rates_total - 2 // die ändern sich ja nicht mehr (außer bei Repainting-Indis.)

b) rates_total - 1

Von daher if(Bars >= rates_total-2) DebugBreak();

Oder entsteht das Problem erst, wenn prev_calculated > 0 ist?

Dann muss DebugBreak() da platziert werden!

 
Carl Schreiber #:

Naja, der Index rates_total  verursachte einen Fehler (Zugriff außerhalb des Arrays), aber das weißt Du wahrscheinlich.

Ich meine

a) 0(?) .. rates_total - 2 // die ändern sich ja nicht mehr (außer bei Repainting-Indis.)

b) rates_total - 1

Von daher if(Bars >= rates_total-2) DebugBreak();

Oder entsteht das Problem erst, wenn prev_calculated > 0 ist?

Dann muss DebugBreak() da platziert werden!

Dass bei rates_total ein "Array out of Range" Fehler auftritt, fiel mir nicht auf..

jedenfalls tritt der Fehler erst bei prev_calculated > 0 auf. Allerdings bleibt prev_calculated, nachdem es größer 0 ist konstant, bzw. prev_calculated == rates_total.

Sollte das prev_calculated nicht stetig um einen wert erhöht werden, sowie auch rates_total..? irgendwo verstehe ich noch nicht so ganz, wie das Programm arbeitet..

 
Claudius Marius Walter #:

Dass bei rates_total ein "Array out of Range" Fehler auftritt, fiel mir nicht auf..

jedenfalls tritt der Fehler erst bei prev_calculated > 0 auf. Allerdings bleibt prev_calculated, nachdem es größer 0 ist konstant, bzw. prev_calculated == rates_total.

Sollte das prev_calculated nicht stetig um einen wert erhöht werden, sowie auch rates_total..? irgendwo verstehe ich noch nicht so ganz, wie das Programm arbeitet..

Mach einfach mal ein time[ rates_total ] :)

Ein Array der Größe n hat Werte mit den Indices 0,..,n-1. Demnach haben die rates_total Kurse Indices von 0,..,rates_total-1.

Lade mal im Indi den Array time[] in den Debugger und prüf die Zeit-Daten.

Wenn prev_calculated == rates_tota, dann gibt es keine neue Bar, erst, wenn prev_calculated < rates_total!

 
Fehler gefunden..

ArrayMinimu/maximum() wurde falsch belegt. Daher wurde der Indikator auch so langsam...

das wäre die Korrektur:

maxHigh[i] = High[ArrayMaximum(High,i-DensityPeriod+1,DensityPeriod)];
maxLow[i] =  Low [ArrayMinimum(Low ,i-DensityPeriod+1,DensityPeriod)];
 
Claudius Marius Walter #:
Fehler gefunden..

ArrayMinimu/maximum() wurde falsch belegt. Daher wurde der Indikator auch so langsam...

das wäre die Korrektur:

Danke, das hilft sicher auch anderen!
Grund der Beschwerde: