Berechnung Customindikator

 

Hallo im Rahmen meines Kurses schreibe ich einige Übungen um mein Verständnis zu erweitern, das Thema Customindikatoren ist nach wie vor ein Schwerpunkt.

Nun hab ich also als Übungsaufgabe vorgenommen ein eigenen Indikator zu Schreiben.

Dieser Indikator soll den Kijunsen des Ichimoku nachzeichen. Als Kontrolle vergleiche ich dann die Werte mit den Ichhimoku wo ja Der Kijunsen ei teil davon ist.

Klar kann ich den ichimoku so utzen und einfach nur den Wert der Kijunsen ausgeben aber das ist nicht zielführend, ich will ja lernen wie man so n Indi selber schreibt und den Aufbau kapieren.

So aber nu an´s Werk:


//+------------------------------------------------------------------+
//|                                         EigenerTest Kijunsen.mq5 |
//+------------------------------------------------------------------+

#property version   "1.00"
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots 1
#property indicator_color1 clrAqua
#property indicator_width1 1
#property indicator_type1 DRAW_LINE
#property indicator_style1 STYLE_SOLID
#property indicator_label1 "Kijunsen"

input int Candles=26; //Basis zur Berechnung

double kijunsenBuffer[];


//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,kijunsenBuffer);
   ArraySetAsSeries(kijunsenBuffer,true);
//---
   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(high,true); //Arraysortieren

   if(rates_total<Candles)
      return(rates_total);

   int limit=rates_total-prev_calculated;
   if(limit==0)
      limit++;

   for(int i=0; i<limit; i++)
     {
     if(i>rates_total-Candles)
         continue;
      int HighestHigh=iHighest(_Symbol,PERIOD_CURRENT,MODE_HIGH,Candles,i);
      int LowestLow=iLowest(_Symbol,PERIOD_CURRENT,MODE_LOW,Candles,i);


      kijunsenBuffer[i]=high[HighestHigh]+low[LowestLow]/2.0/Candles; //Kijun Linie = (Höchstes Hoch + Tiefstes Tief) / 2 (für die letzten 26 Perioden)
Print(kijunsenBuffer[0]);
     }
     
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Also angezeigt wird die Linie schon mal und macht auch den Verlauf schon mal gut mit, aber leider ist der Wert total falsch!

Woran liegt das jetzt?

 
was genau möchtest du mit dieser Funktion machen?

 int HighestHigh=iHighest(_Symbol,PERIOD_CURRENT,MODE_HIGH,Candles,i);
 int LowestLow=iLowest(_Symbol,PERIOD_CURRENT,MODE_LOW,Candles,i);
ihighest spuckt dir lediglich den index raus. Also die stelle, andem sich der höchste wert der Candles-Kerzen befindet.


Oh vergiss es. du frägst das ja richtig ab. entschuldige!
 

Was heißt den:

//Kijun Linie = (Höchstes Hoch + Tiefstes Tief) / 2 (für die letzten 26 Perioden)

? Ist das ein Mittelwert und für welche Kerze wird denn mit welchen anderen Werten der Preis berechnet?

 
Aleksi-Trader:

Also angezeigt wird die Linie schon mal und macht auch den Verlauf schon mal gut mit, aber leider ist der Wert total falsch!

Woran liegt das jetzt?

kijunsenBuffer[i]=high[HighestHigh]+low[LowestLow]/2.0/Candles;

Die Candles(=26) ist zuviel. Du willst ja nur den Mittelwert aus HH und LL. In denen hast Du schon die Candles verbaut.

 
Carl Schreiber:

Was heißt den:

? Ist das ein Mittelwert und für welche Kerze wird denn mit welchen anderen Werten der Preis berechnet?

Das was da steht als Kommentar, die Letzetn 26 Kerzen als Berechnugsbasis und davon der Mittelwert also das höchste Hoch und das tiefste Tief basierend auf 26 Kerzen das durch 2 als Mittelwert.

Verstehe deine Frage nicht

 
pennyhunter:

Die Candles(=26) ist zuviel. Du willst ja nur den Mittelwert aus HH und LL. In denen hast Du schon die Candles verbaut.

Ja hatte ich auch gedacht aber dann kommt n gar nix mehr. bzw der wert st astronomisch hoch
 
Aleksi-Trader:
Ja hatte ich auch gedacht aber dann kommt n gar nix mehr.
kijunsenBuffer[i]=high[HighestHigh]+low[LowestLow]/2.0/Candles; //Kijun Linie = (Höchstes Hoch + Tiefstes Tief) / 2 (für die letzten 26 Perioden)


Das macht an mehreren Stellen keinen wirklichen Sinn:

1. willst Du ja keinen gleitenden Durchschnitt berechnen, brauchst also die Candles an der Stelle nicht (mehr).

2. Gilt immer noch Punkt- vor Strichrechnung! In Deinem Fall addierst Du also zum high noch das "doppelt" geteilte low

3. Versuchs mal anstatt des high[] mit High[] (musst Du dann auch nicht als Array vorab initialisieren)


Probier das mal (ansonsten ggf. mal mit iHigh probieren):

kijunsenBuffer[i]=(High[HighestHigh]+Low[LowestLow])/2.0;
 
Aleksi-Trader:
Ja hatte ich auch gedacht aber dann kommt n gar nix mehr. bzw der wert st astronomisch hoch
Also wie schon gesagt, wenn Du nur den Mittelwert nehmen möchtest, hat die 26 da nichts mehr zu suchen.

Mir ist gerade aufgefallen, dass Du high[] als Series gesetzt hast, aber low[] nicht.

Würde Beides weglassen beim Indikator, sonst ist der ganze Buffer verkehrtherum.
 
pennyhunter:
Also wie schon gesagt, wenn Du nur den Mittelwert nehmen möchtest, hat die 26 da nichts mehr zu suchen.

Mir ist gerade aufgefallen, dass Du high[] als Series gesetzt hast, aber low[] nicht.

Würde Beides weglassen beim Indikator, sonst ist der ganze Buffer verkehrtherum.
   if(rates_total<Candles)
      return(rates_total);

   int limit=rates_total-prev_calculated;
   if(limit==0)
      limit++;

   for(int i=0; i<limit; i++)
     {
     if(i>rates_total-Candles)
         continue;
      int HighestHigh=iHighest(_Symbol,PERIOD_CURRENT,MODE_HIGH,Candles,i);
      int LowestLow=iLowest(_Symbol,PERIOD_CURRENT,MODE_LOW,Candles,i);


      kijunsenBuffer[i]=high[HighestHigh]+low[LowestLow]/2; //Kijun Linie = (Höchstes Hoch + Tiefstes Tief) / 2 (für die letzten 26 Perioden)
Print(kijunsenBuffer[0]);
     }

Gibt immer noch falsche Werte, an sich sollte es doch aber stimmen. Denn das höchte hoch der letzten 26 Kerzen und das Tiefste Tief der letzten 26 Kerzen wird ja berechnet mittels iHighest und iLowest das ganze + und dann /2

 

Wie findest Du heraus, dass es falsche Werte gibt?

Hoffentlich nicht durch das:

Print(kijunsenBuffer[0]);

Wenn ja, dann ersetze die 0 mal durch das i.

 
Michael Martens:

Wie findest Du heraus, dass es falsche Werte gibt?

Hoffentlich nicht durch das:

Wenn ja, dann ersetze die 0 mal durch das i.

In dem ich den Ichimoku im seperaten Fenster anzeigen lasse und beide vergleiche.

Grund der Beschwerde: