Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Indikatorberechnung am Wochenende möglich?

Geschrieben

Hallo,

 

habe mal eine doofe Frage: wenn ich mir nen Indikator programmiere, nutze ich ja den OnCalculate Event Handler. Der wird ja quasi aktiv, wenn er eine neue Preisstellung erhält. WIe ist das denn jetzt, wenn ich mir am Wochenende einen Indikator basteln möchte: kann ich den dann überhaupt testen? Da kommen ja keine Ticks rein, demnach wird die Berechnung ja gar nicht ausgeführt.

 

Ich frage mich halt, ob ich etwas falsch gemacht habe oder ob es an o.g. Gründen liegt. Ich erhalte beim Compilen keine Fehlermeldung oder Warnung oder sonstiges.

 

VIelen Dank für Eure Unterstützung.

 

 

Featured Replies

Geschrieben

Hallo,

 

habe mal eine doofe Frage: wenn ich mir nen Indikator programmiere, nutze ich ja den OnCalculate Event Handler. Der wird ja quasi aktiv, wenn er eine neue Preisstellung erhält. WIe ist das denn jetzt, wenn ich mir am Wochenende einen Indikator basteln möchte: kann ich den dann überhaupt testen? Da kommen ja keine Ticks rein, demnach wird die Berechnung ja gar nicht ausgeführt.

 

Ich frage mich halt, ob ich etwas falsch gemacht habe oder ob es an o.g. Gründen liegt. Ich erhalte beim Compilen keine Fehlermeldung oder Warnung oder sonstiges.

 

VIelen Dank für Eure Unterstützung.

Ticks gibt's am Wochenende nicht, da ja der Forexmarkt nicht offen hat.

Du kannst aber einen Dummy-EA im Strategietester laufen lassen und deinen Indikator einfach reinziehen. Dann siehst du auch, ob er richtig funktioniert.

Geschrieben
  • Autor

Wogo, vielen Dank für die schnelle Info. Ich werde das versuchen. Eine Frage habe ich dennoch: wieso funktioniert eigentlich dann ein Indikator wie ATR auch ohne Ticks?

 

 

Gesendet von iPhone mit Tapatalk

Geschrieben

Eine Frage habe ich dennoch: wieso funktioniert eigentlich dann ein Indikator wie ATR auch ohne Ticks?

 

... beim ersten neuen Aufruf des Chart wird die INIT() durchlaufen . Dabei wird das Chart ein einziges mal aufgebaut, somit auch der Indikator berechnet . Danach "steht" das Chart bis ein einzelner Tick einläuft . Dieser führt zur erneuten Aktualisierung des Chart . KB

Geschrieben
  • Autor

Was meinst du denn mit dem ersten neuen Aufruf des Chart? Habe sowohl meinen Indi als auch den ATR auf den Chart gezogen, dabei wird ATR berechnet, meiner hingegen nicht.

 

 

Gesendet von iPhone mit Tapatalk

Geschrieben

Was meinst du denn mit dem ersten neuen Aufruf des Chart? Habe sowohl meinen Indi als auch den ATR auf den Chart gezogen, dabei wird ATR berechnet, meiner hingegen nicht.

 

 

Gesendet von iPhone mit Tapatalk

Der ATR Indikator berechnet beim ersten Durchlauf alle historischen Bars (prev_calculated==0).

Schau dir mal den Code an.

 

Um den Ablauf zu verstehen ist es u.U. hilfreich, wenn du dir folgende Debugausgabe einbaust:

 

Print("Bars = ",Bars,", rates_total = ",rates_total,",  prev_calculated = ",prev_calculated); 
Geschrieben

Was meinst du denn mit dem ersten neuen Aufruf des Chart? Habe sowohl meinen Indi als auch den ATR auf den Chart gezogen, dabei wird ATR berechnet, meiner hingegen nicht.

 

 

Gesendet von iPhone mit Tapatalk

 

... das kann ein Issue mit Deinem Indi sein . Wenn der ATR berechnet wird, dann ist das eigentlich Indiz dafür, dass der Metatrader ok arbeitet....wenn aller Code OK ist . Neben dem guten Tip von WOGO , sehe auch mal in die Fehlermeldungen des MT4-Terminals ... dort die Registerkarte "Journal" und " Experten" .

 

Ein weiterer Trick um eine (wenigstens) einmalige neue Berechnung aller Chartinhalte zu erreichen ist es , zwischen den TF zu wechseln . Bei jedem Wechsel des TF wird ebenfalls die INIT() neu durchlaufen .

 

Viel Erfolg

 

KB

Geschrieben
  • Autor

Hey Jungs, super Unterstützung!!! Ich erhalte die Meldung im Journal "loaded successfully", aber: Experten-Eintrag: Array out of Range (59,25). Was komisch ist: wenn ich den Indi über den Debugmodus starte, wird er plötzlich wunderbar kalkuliert und bringt korrekte Ergebnisse. Muss mal sehen ob ich am Ende der Schleife was falsch mache, ggf frage ich Kerzen ab die nicht mehr in der Time Series liegen.

 

 

Gesendet von iPhone mit Tapatalk

Geschrieben
  • Autor

Hier mal der Version1-Quelltext, ich komme nicht wirklich weiter.

 

 

 

#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 10
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Anzahl
#property indicator_label1  "Anzahl"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         Anzahl[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,Anzahl);
   
//---
   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[])
  {
//---
   ArraySetAsSeries(Anzahl,true);
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(close,true);
   
   int bars = rates_total - 2;
   if(prev_calculated > 0) bars = rates_total - prev_calculated;
   Anzahl[bars+1]=0;
   
   for(int i = bars; i >= 0; i--)
   {
//wenn Schlusskurs größer vorheriger Schlusskurs, dann Anzahl steigender Kerzen erhöhen  
    if (close[i] > close[i+1]) Anzahl[i] = (Anzahl[i+1]+1);
//sonst Zähler zurücksetzen
    if (close[i] <= close[i]) Anzahl[i] = 0;
   }
//--- return value of prev_calculated for next call
   return(rates_total);
   }
   
//+------------------------------------------------------------------+

 

Bearbeitet von whipsaw
Code Tag hinzugefügt

Geschrieben

Hier mal der Version1-Quelltext, ich komme nicht wirklich weiter.

 

...

 

//+------------------------------------------------------------------+

 

Da sind ein paar Fehler drin. cleanglasses.gif

 

Mach's mal so:

#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 10
#property indicator_buffers 1
#property indicator_plots   1
//--- plot Anzahl
#property indicator_label1  "Anzahl"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         Anzahl[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
	IndicatorBuffers(1);  //<===
  SetIndexBuffer(0,Anzahl);
   
//---
   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[])
  {
//---
   ArraySetAsSeries(Anzahl,true);
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(close,true);
   
   int bars = rates_total - 2;
   if(prev_calculated > 0) bars = prev_calculated-1;    //<===
   //Anzahl[bars+1]=0;                                 //<===
   
   for(int i = bars; i >= 0; i--)
   {
//wenn Schlusskurs größer vorheriger Schlusskurs, dann Anzahl steigender Kerzen erhöhen  
    if (close[i] > close[i+1]) Anzahl[i] = (Anzahl[i+1]+1);
//sonst Zähler zurücksetzen
    if (close[i] <= close[i+1]) Anzahl[i] = 0;    //<===
   }
//--- return value of prev_calculated for next call
   return(rates_total);
   }
   
//+------------------------------------------------------------------+
Geschrieben
  • Autor

Danke. Aber wenn ich prüfe ob schon Bars berechnet wurden, dann kann ich doch nicht die bars mit der Anzahl-1 der schon berechneten Bars initialisieren. Das wäre doch falsch, wenn nur die neuen Bars berechnet werden sollen???

 

 

Gesendet von iPhone mit Tapatalk

Geschrieben
  • Autor

Und leider wird der immer noch nicht berechnet, wenn ich den Indi auf nen Chart ziehe

 

 

Gesendet von iPhone mit Tapatalk

Geschrieben

Danke. Aber wenn ich prüfe ob schon Bars berechnet wurden, dann kann ich doch nicht die bars mit der Anzahl-1 der schon berechneten Bars initialisieren. Das wäre doch falsch, wenn nur die neuen Bars berechnet werden sollen???

 

 

Gesendet von iPhone mit Tapatalk

 

Ja, das ist natürlich Unsinn. Dann würde ja ständig alles nochmal berechnet.

Mach 's einfach so:

if(prev_calculated > 0) bars = rates_total-prev_calculated+1;

 

Und leider wird der immer noch nicht berechnet, wenn ich den Indi auf nen Chart ziehe

 

 

Gesendet von iPhone mit Tapatalk

Trotzdem sollte der Indikator was zeichnen.

Hast du ihn 1:1 übernommen?

 

 

Und leider wird der immer noch nicht berechnet, wenn ich den Indi auf nen Chart ziehe

 

 

Gesendet von iPhone mit Tapatalk

Geschrieben
  • Autor

Das nenne ich mal spooky;-) wenn ich mich auf ner Chart-Period >= Tag befinde wird der berechnet. Bei <= H4 wird er nicht gezeichnet

 

 

Gesendet von iPhone mit Tapatalk

Geschrieben

... any ideas?

Hm, am Indikator kann das nicht liegen. Dem ist 's egal in welchen TF er gezogen wird.

Andere Indikatoren funktionieren?

Geschrieben
  • Autor

Ja, das ist zum Verrückt-werden. Hier mal ein Update, ich habe an Anlehnung an den funktionierenden ATR mal bei der Initialisierung ein wenig was hinzugefügt. Dann habe ich noch eine zweite Linie für fallende Kerzen gemalt und eine iATR Bedingung hinzugefügt:

 

 

 

#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_minimum 0
#property indicator_maximum 20
#property indicator_buffers 2
#property indicator_plots   2
//--- plot Anzahl steigend
#property indicator_label1  "Anzahl steigend"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrGreen
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1

//--- plot Anzahl fallend
#property indicator_label2  "Anzahl fallend"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed
#property indicator_style2  STYLE_SOLID
#property indicator_width2  1

//sollen nur Kerzen > ATR beachtet werden?
input bool     Inp_Respect_ATR = true; //Nur große Kerzen > ATR-Durschschnitt beachten
input int      Inp_ATR_Period = 14; //ATR-Period
input double   Inp_ATR_Factor = 1.0; //ATR-Faktor

//--- indicator buffers
double         Anz_Up[];
double         Anz_Down[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   IndicatorBuffers(2);
   IndicatorDigits(0);
   
//--- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexStyle(1,DRAW_LINE);   
   SetIndexBuffer(0,Anz_Up);
   SetIndexBuffer(1,Anz_Down);
   
//--- name for DataWindow and indicator subwindow label
 string short_name="No. rising / falling candles > "+DoubleToString(Inp_ATR_Factor,1)+" * ATR";
   IndicatorShortName(short_name);
   SetIndexLabel(0,"No. cons. rising");
   SetIndexLabel(1,"No. cons. falling");
   
//--- check for input parameter
   if((Inp_ATR_Period < 3) || (Inp_ATR_Factor < 0))
     {
      Print("Wrong input parameter: ATR-Period="+IntegerToString(Inp_ATR_Period)+", ATR-Faktor="+DoubleToString(Inp_ATR_Factor));
      return(INIT_FAILED);
     }
//--- wenn ATR verwendet wird, dann Linie ab ATR-Period malen
   if(Inp_Respect_ATR == true)
    {
    SetIndexDrawBegin(0,Inp_ATR_Period);
    SetIndexDrawBegin(1,Inp_ATR_Period);
    }
//--- wenn ATR nicht verwendet wird, dann Linie ab Anfang malen
   if(Inp_Respect_ATR == false)
    {
    SetIndexDrawBegin(0,0);
    SetIndexDrawBegin(1,0);
    }
//---
   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[])
  {
//---
   ArraySetAsSeries(Anz_Up,true);
   ArraySetAsSeries(Anz_Down,true);
   ArraySetAsSeries(open,true);
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(time,true);
   
   int bars = rates_total - 2;
   if(prev_calculated > 0) bars = rates_total - prev_calculated+1;

//erste Kerze mit 0 initialisieren   
   Anz_Up[rates_total-1]=0;
   Anz_Down[rates_total-1]=0;
   
   for(int i = bars; i >= 0; i--)
   {
//wenn Schlusskurs größer als vorheriger Schlusskurs und Kerze > ATR-Faktor, dann Anzahl steigender Kerzen erhöhen und Anzahl fallender zurücksetzen
    if ((close[i] > close[i+1]) && (iATR(NULL,0,1,0) > (Inp_ATR_Factor * iATR(NULL,0,Inp_ATR_Period,0))))
     {
     Anz_Up[i] = (Anz_Up[i+1]+1);
     Anz_Down[i] = 0;
     }

//wenn Schlusskurs kleiner als vorheriger Schlusskurs und Kerze > ATR-Faktor, dann Anzahl fallender Kerzen erhöhen und Anzahl steigender zurücksetzen  
    if ((close[i] < close[i+1]) && (iATR(NULL,0,1,0) > (Inp_ATR_Factor * iATR(NULL,0,Inp_ATR_Period,0))))
     {
     Anz_Down[i] = (Anz_Down[i+1]+1);
     Anz_Up[i] = 0;
     }

//wenn Schlusskurs = vorheriger Schlusskurs, dann Anzahl steigender und fallender Kerzen zurücksetzen
    if (close[i] == close[i+1])
     {
     Anz_Down[i] = 0;
     Anz_Up[i] = 0;
     }
   }
//--- return value of prev_calculated for next call
   return(rates_total);
   }
   
//+------------------------------------------------------------------+
 

Bearbeitet von whipsaw
Code Tag hinzugefügt

Geschrieben
  • Autor

Auch, wenn Montag ist ;-))) : hat noch jemand eine Idee, wieso der nicht sauber angezeigt wird? Würde mich über jeden Hinweis freuen.

 

Danke und Gruß

Geschrieben

Idee nicht, ich kann dir aber sagen, wie ich das analysieren würde.

Stell deinen Chart so ein, dass er nur ein paar Bars anzeigt (z.B. 200) unter Extras - Optionen - Diagramme - Max. Kerzen im Chart.

Dann lass dir über "Print" an den entscheidenden Stellen ausgeben, was der Indikator macht.

Die Limitierung der Kerzen ist dazu da, dass dir dein Report-Fenster nicht zu sehr zugemüllt wird.

 

Auf diese Weise solltest du relativ einfach rausfinden, woran es scheitert.

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.