OnCalculate() und seine Mysterien

Einloggen oder registrieren, um einen Kommentar zu schreiben
Otto Pauser
2167
Otto Pauser  

Es gibt ja zwei überladene Varianten von OnCalculate(). Nun ist mir bei nachfolgender Variante nachfolgendes aufgefallen:

int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
{
   // ...
   return(rates_total);
}

begin nimmt nie einen anderen Wert als 0 an.

Obwohl in einem Beispiel begin sehr wohl eingesetzt wird.

https://www.mql5.com/de/articles/37 von Nikolay Kositsin

Es hat zwar dort keine Auswirkungen daß der Wert immer 0 ist, aber was soll das!? Wieder einmal eine Verunsicherung für Einsteiger?

Hat bei irgend jemandem begin jemals einen anderen Wert als 0 angenommen?

Benutzerdefinierte Indikatoren in MQL5 für Anfänger
Benutzerdefinierte Indikatoren in MQL5 für Anfänger
  • www.mql5.com
Grundlage eines umfassenden Verständnisses jedes rationalen Themas (egal ob Mathematik, Musik oder Programmierung) beginnt mit dem Studium seiner Grundlagen. Natürlich ist es toll, wenn man sich damit bereits in jungen Jahren beschäftigt, da man die Grundlagen dann wesentlich leichter versteht und man sich schneller ein spezifisches und...
Carl Schreiber
Moderator
9838
Carl Schreiber  
Otto Pauser:

Es gibt ja zwei überladene Varianten von OnCalculate(). Nun ist mir bei nachfolgender Variante nachfolgendes aufgefallen:

begin nimmt nie einen anderen Wert als 0 an.

Obwohl in einem Beispiel begin sehr wohl eingesetzt wird.

https://www.mql5.com/de/articles/37 von Nikolay Kositsin

Es hat zwar dort keine Auswirkungen daß der Wert immer 0 ist, aber was soll das!? Wieder einmal eine Verunsicherung für Einsteiger?

Hat bei irgend jemandem begin jemals einen anderen Wert als 0 angenommen?

Kannst Du ein konkretes Beispiel geben inkl. dem, was 'rauskommt'?

Ich denke, mit dieser Version von OnCalculate() kann man Indikatoren von Indikatoren oder anderen Preisreihen berechnen - hast Du so ein Beispiel?

Otto Pauser
2167
Otto Pauser  
Carl Schreiber:

Kannst Du ein konkretes Beispiel geben inkl. dem, was 'rauskommt'?

Ich denke, mit dieser Version von OnCalculate() kann man Indikatoren von Indikatoren oder anderen Preisreihen berechnen - hast Du so ein Beispiel?

Also kleines Beispiel mit beiden Varianten. Für die 2. Variante Zeile 2 auskommentieren.

#define VARIANTE_1               // auskommentieren für andere Variante

#property indicator_chart_window
#property indicator_buffers 0
#property indicator_plots   0

#ifdef VARIANTE_1
   #property description "OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])"
#else
   #property description "OnCalculate"
   #property description "           (const int rates_total,"
   #property description "            const int prev_calculated,"
   #property description "            const datetime &time[],"
   #property description "            const double &open[],"
   #property description "            ...."
   #property description "            const int &spread[])"
#endif

#ifdef VARIANTE_1
   int OnCalculate(const int rates_total, const int prev_calculated, const int begin, const double &price[])
#else
   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[])
#endif
{
   int start=(prev_calculated==0)?0:prev_calculated-1;      // startindex berechnen

   Comment("\nrates_total "    +IntegerToString(rates_total)+
           "\nprev_calculated "+IntegerToString(prev_calculated)+
#ifdef VARIANTE_1
           "\nbegin "          +IntegerToString(begin)+
#endif
           "\nstart "          +IntegerToString(start));

   if(rates_total!=prev_calculated)          // nur beim begin einer neuen bar unterschiedlich
      Delay(500);                            // kleine pause sonst sieht man das nicht

   for(int i=start; i<rates_total; i++)      // übliche Schleife für indikatoren
      {
      }
   
   return(rates_total);
}

void Delay(int mSecs=100)                    // waits number of mSecs(milliseconds)
{
   datetime endTime=GetTickCount()+mSecs;    // calculate the endTime
   while(GetTickCount()<=endTime)            // wait in a loop until endTime is reached
      ChartRedraw();
}

Die kleine Funktion Delay ist auch eine der wenigen Möglichkeiten den Tester gezielt zu bremsen.

Beim Startbildschirm ergeben sich durch die Varianten auch Unterschiede in den Tabs: Ein zusätzlicher Tab (Parameters) erscheint bei Variante 1.



Ein weiteres Beispiel wird folgen, da ich mir zu https://www.mql5.com/de/forum/328359 Gedanken gemacht habe.

Das hat dann diese Fragen aufgeworfen.

Christian
3171
Christian  
Otto Pauser:

Da ich keine Ahnung von Indikatoren habe (nie benutzt) ,wie wird denn die OnCalculate aufgerufen ?

Irgendwer oder was muss diesen Parameter ja übergeben.

Oder besser gesagt wo ? Laut Doku ist "begin" nur der Versatz ab wann der Indikator saubere Werte liefern DARF.

Denke das ist ein Relikt aus den Anfängen des MTs und wurde über die Jahre Vergessen.

Otto Pauser
2167
Otto Pauser  
Christian:

Da ich keine Ahnung von Indikatoren habe (nie benutzt) ,wie wird denn die OnCalculate aufgerufen ?

Irgendwer oder was muss diesen Parameter ja übergeben.

Oder besser gesagt wo ? Laut Doku ist "begin" nur der Versatz ab wann der Indikator saubere Werte liefern DARF.

Denke das ist ein Relikt aus den Anfängen des MTs und wurde über die Jahre Vergessen.

OnCalculate() wird wie OnInit(), OnTick() etc. vom System aufgerufen. Die Parameter bekommst du vom System mit Daten befüllt.

Ich halte es auch für ein Relikt.

Alain Verleyen
40376
Alain Verleyen  
=
Otto Pauser :

OnCalculate() wird wie OnInit(), OnTick() etc. vom System aufgerufen. Die Parameter bekommst du vom System mit Daten befüllt.

Ich halte es auch für ein Relikt.

Begin wird auf etwas anderes als 0 gesetzt, wenn Sie einen anderen Indikator als Preis [] angeben.

Platzieren Sie beispielsweise einen gleitenden Durchschnitt in einem Diagramm. Wenden Sie dann den angehängten Indikator auf dasselbe Diagramm an und setzen Sie auf der Registerkarte "Parameter" die Option "Daten des vorherigen Indikators" für das Feld "Anwenden auf".

Dies kann auch durch Code erfolgen.

Dateien:
328438.mq5 2 kb
Otto Pauser
2167
Otto Pauser  
Alain Verleyen:
=

Begin wird auf etwas anderes als 0 gesetzt, wenn Sie einen anderen Indikator als Preis [] angeben.

Platzieren Sie beispielsweise einen gleitenden Durchschnitt in einem Diagramm. Wenden Sie dann den angehängten Indikator auf dasselbe Diagramm an und setzen Sie auf der Registerkarte "Parameter" die Option "Daten des vorherigen Indikators" für das Feld "Anwenden auf".

Dies kann auch durch Code erfolgen.

Danke für die Info! Steht das irgendwo in der Dokumentation?

Die ist ja mittlerweile als pdf über 5800 Seiten lang. https://www.mql5.com/files/pdf/mql5.pdf

Dazu kommen noch die Dokumentations-links https://www.mql5.com/en/docs https://www.mql5.com/de/docs usw.

MQL5 Reference - How to use algorithmic/automated trading language for MetaTrader 5
MQL5 Reference - How to use algorithmic/automated trading language for MetaTrader 5
  • www.mql5.com
MetaQuotes Language 5 (MQL5) is a high-level language designed for developing technical indicators, trading robots and utility applications, which automate financial trading. MQL5 has been developed by MetaQuotes Software Corp. for their trading platform. The language syntax is very close to C++ enabling programmers to develop applications in...
Alain Verleyen
40376
Alain Verleyen  
Otto Pauser :

Danke für die Info! Steht das irgendwo in der Dokumentation?

...

Ich weiß nicht, es gibt viele Dinge in der Dokumentation, aber nicht immer gut organisiert. Es gibt auch Dinge, die Sie aus Erfahrung lernen müssen.

Einloggen oder registrieren, um einen Kommentar zu schreiben