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

 

Ich danke Ihnen für Ihre Erklärung.

Ich sehe es jetzt besser.

SCFX

 

Hallo!

Ich kratze meinen Kopf mit diesem verrückten Fehler.

Noch diese einfache Anzeige von 4 Zeilen Code verschwinden, wenn ich Zeitrahmen ändern.

Verrückterweise habe ich die Vorschläge hier bereits gepostet, aber immer noch nicht.

Ich fühle mich so schlecht...

Bitte helfen Sie mir.

Vielen Dank!

SCFX

//+------------------------------------------------------------------+
//|                                                        H_roc.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
//#property indicator_minimum -3.5
//#property indicator_maximum 3.5
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Label1
#property indicator_label1  "boring"
#property indicator_type1   DRAW_ARROW
#property indicator_color1  clrBlue
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- input parameters
//--- indicator buffers
double         boring[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,boring);
   
          
//---
   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=rates_total-prev_calculated;
   if(limit<=0) limit=300;
//---
 
 for(int i=1;i<=limit  ;i++)
{  if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50
     ) 
      boring[i]=Close[i];
    
}  
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
 
scfx:

Hallo!

Ich kratze meinen Kopf mit diesem verrückten Fehler.

Noch diese einfache Anzeige von 4 Zeilen Code verschwinden, wenn ich Zeitrahmen ändern.

Verrückterweise habe ich die Vorschläge hier bereits gepostet, aber immer noch nicht.

Ich fühle mich so schlecht...

Bitte helfen Sie mir.

Vielen Dank!

SCFX



2014.06.15 11:26:39.908 Nullteilung in 'test.mq4' (59,44)
 
angevoyageur:
2014.06.15 11:26:39.908 Nullteilung in 'test.mq4' (59,44)


Danke für die Antwort.

In meinem Journal gibt es keinen solchen Hinweis, aber wenn ich die TF ändere, wird dieser Indikator entfernt.

Ich kann das Problem noch nicht beheben.

SCFX

2014.05.18 08:41:31.080Benutzerdefinierter Indikator H_889_boring GBPUSD,H1: entfernt
2014.05.18 08:41:25.441 Benutzerdefinierter Indikator H_889_boring GBPUSD,H4: erfolgreich geladen

 
scfx:

Ich kann es immer noch nicht reparieren.

SCFX

Das liegt daran, dass Sie sich nicht besonders viel Mühe geben.

Du wirst nichts lernen, wenn du andere Leute dazu bringst, es für dich zu tun. Der einzige Weg ist, es selbst zu tun, damit du es verstehst, der einzige Weg, es selbst zu tun, ist, jede Codezeile zu untersuchen, sie aufzuschlüsseln und genau herauszufinden, was sie tut, und es gibt mehrere Möglichkeiten, das zu tun.

for(int i=1;i<=limit  ;i++)
{  if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50
     ) // what is this parentheses doing here ? How can you expect to write code that works if you are this sloppy about it ?
      boring[i]=Close[i];
    
}  

Dies sind alles Dinge, die Sie tun könnten, um die Ursache des Problems zu finden

  • Sie sagten, Sie hätten die Registerkarte "Journal" überprüft, haben Sie auch in der Registerkarte "Experten" daneben nachgesehen?
  • Ich habe Ihnen bereits letzte Woche gesagt, dass Ihr Code Array außerhalb des Bereichs verursacht, haben Sie das nachgeschlagen, um herauszufinden, was es bedeutet?
  • Es gibt einen Debugger im Metaeditor, mit dem du lernen könntest, wie du deinen Code debuggen kannst.
  • Du könntest Print() verwenden, um zu überprüfen, welche Werte deine Variablen hatten, als der Code ausgeführt wurde.

Wenn Sie auf die Registerkarte "Experten" geklickt hätten, wüssten Sie, dass Ihr Indikator in dieser Zeile eine Nullteilung vorgenommen hat und der Wechsel des Zeitrahmens nichts damit zu tun hat.

if(   MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50

Das muss also bedeuten, dass dieses High[i]-Low[i] aus irgendeinem Grund null war. Wenn Sie sich den Indikator auf dem Chart ansehen, können Sie sehen, dass der Indikator einige seiner Werte gezeichnet hat und dann bei einem Balken stoppt, bei dem es nur einen Tick gibt. Wenn es nur einen Tick gibt, ist high[i] == low[i], was eine Nullteilung verursachen würde.

Stellen Sie nun sicher, dass high[i]-low[i] nicht verwendet wird, wenn es Null ist.

   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=300;
//---
   for(int i=1;i<=limit  ;i++)
   {
    if(High[i] - Low[i] == 0) continue; // --------------- skip this bar
    
    if( MathAbs(Close[i]-Open[i])/(High[i]-Low[i])<0.50 ) 
    {boring[i]=Close[i];
   }}
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Jetzt sehen Sie auf der Registerkarte "Experten", dass der Code keine Nullteilung mehr vornimmt, aber in dieser Zeile einen Fehler "Array out of range" erzeugt.

if(high[i] - low[i] == 0)  

Was passiert also, wenn Sie alle Berechnungen und Bedingungen entfernen, um die Schleife zu testen?

   int limit=rates_total-prev_calculated;
   if(limit<=0) limit=300;
//---

   for(int i=1;i<=limit  ;i++)
   { 
    boring[i]=Close[i];
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Jetzt meldet die Registerkarte Experten wieder Array außerhalb des Bereichs, diesmal in dieser Zeile:

boring[i]=Close[i];

Jetzt wissen Sie, dass Ihr Code jedes Mal, wenn ein Preis-Array in der Schleife verwendet wird, eine Bereichsüberschreitung verursacht. Finden Sie also heraus, was mit der Schleife nicht stimmt und warum Close[i], Low[i], High[i] außerhalb des Bereichs liegt. Sie können sehen, dass der Indikator den ganzen Weg bis zum Ende des Diagramms zeichnet, also muss der Fehler am Ende liegen, an den höchsten Array-Indizes.

   int limit=rates_total-prev_calculated; // what is the value of limit in this calculation when prev_calulated == 0 ?
   if(limit<=0) limit=300;
//---

   for(int i=1;i<=limit;i++) // how does the value of limit compare with the highest available Close[] array index ?

Es scheint, dass Sie versuchen, einen Indikator zu erstellen, ohne vorher gelernt zu haben, wie man eine Schleife programmiert, die korrekt funktioniert. Es gibt viele Beispiele dafür, wie man das macht. Schauen Sie sich den Code der mitgelieferten Indikatoren an und experimentieren Sie mit ihnen, bis Sie genau verstehen, wie sie funktionieren. Versuchen Sie dann, einen Indikator zu erstellen, der eine einfache Linie zeichnet, die richtig funktioniert, bevor Sie versuchen, Berechnungen durchzuführen.
 

@ scfx

Die einzige Person, die das Problem beheben kann, sind Sie selbst. Oder geh auf https://www.mql5.com/en/job

und poste die Aufgabe dort.

 
SDC:
...

Bitte SDC, seien Sie nicht so streng, auch wenn Sie Recht haben.
 
angevoyageur:

Bitte SDC, kein Grund, so hart zu sein, auch wenn du Recht hast.

lol Ich habe meinen Beitrag ein wenig umformuliert ;)

 

Entschuldigung, ich habe Sie falsch verstanden, ich entschuldige mich, Indikatoren können so kodiert werden:

int limit = -1;
   if( prev_calculated == 0 ) limit =  rates_total - 3000;// will calculate 3000 Bars
  if( prev_calculated > 0 )   limit = rates_total-prev_calculated;

 for(int i=limit;  i>=0; i--)
   {
    if(High[i] - Low[i] == 0) continue; // --------------- skip this bar
    

// Please test it, check if it's OK;
// Put the indicator in a backtest EA, say MACDSample, to check it
 

Wenn das Diagramm weniger als 3000 Balken hat, liegt es immer nochaußerhalb des Bereichs.