Berechnung Customindikator - Seite 2

 
Michael Martens:


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):

Ahh, mir war so als ob jemand mal sagte das MT Punkt vor Strichrechnung kann und daher Klammern dann egal wären.

gut,klammern gesetzt allerding muss ich sagen das  

kijunsenBuffer[i]=(High[HighestHigh]+Low[LowestLow])/2.0;

keinen Sinn macht, denn in der OnCalculate steht nicht High sondern high, das selbe mit low.

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[]
               )

mit High weis er nicht woher er Daten beziehen soll.

'[' - array required

'High' - undeclared identifier    EigenerTest Kijunsen.mq5    64    26

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

wird wesentlich besser allerdings jetzt übertrieben weit unten

 
Aleksi-Trader:

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

Wieso nimmst Du nicht einfach den Code vom Ichimoku und löscht, was Du nicht brauchst - um dann das entsprechend Deines Kurses wieder dahin aufzubauen?

Außerdem braucht die Linie des Kijun-sen eine andere Linie bzw. andere Werte zum Vergleich:

Kijun-sen wird als Indikator für die Marktbewegung genutzt. Wenn der Preis höher ist als der Indikator, steigt der Preis vermutlich weiter. Wenn der Preis diese Linie kreuzt, ist eine Trend-Umkehr wahrscheinlich. Eine andere Art zur Nutzung der Kijun-sen ist das Finden von Signalen. Ein Kauf-Signal entsteht, wenn die Tenkan-sen Linie die Kijun-sen von unten nach oben kreuzt. Von oben nach unten ist dies ein Verkaufssignal. Tenkan-sen wird genutzt als Indikator für den Markttrend. Wenn die Linie steigt oder sinkt, existiert ein Trend. Wenn die Linie horizontal verläuft, befindet sich der Markt in einem Kanal.

von hier: https://www.metatrader5.com/de/terminal/help/indicators/trend_indicators/ikh.

 
Aleksi-Trader:

Ahh, mir war so als ob jemand mal sagte das MT Punkt vor Strichrechnung kann und daher Klammern dann egal wären.

Eben WEIL Punkt- vor Strichrechnung kommt führt der Ansatz Ergebnis = high + low/Candles/2 zum falschen Ergebnis.

Die Klammern brauchst Du eben, damit er erst die Strichrechnung durchführt.


Mit dem High, high, iHigh kannst Du Recht haben (deswegen schrieb ich auch, dass es ein Versuch wert wäre) - da muss man dann mal probieren und testen.
Ich selber arbeite da meist mit iHigh - da brauche ich dann auch kein extra Array. Aber ist ja auch ein gutes Thema, an dem man lernen kann.

 
Carl Schreiber:

Wieso nimmst Du nicht einfach den Code vom Ichimoku und löscht, was Du nicht brauchst - um dann das entsprechend Deines Kurses wieder dahin aufzubauen?

Außerdem braucht die Linie des Kijun-sen eine andere Linie bzw. andere Werte zum Vergleich:

von hier: https://www.metatrader5.com/de/terminal/help/indicators/trend_indicators/ikh.

Naja es geht darum den Indikator selbst zu programmieren, den Aufbau zu verstehen, "Copy -Paste und manpulieren" bringt da nicht viel bzw wäre nicht Sinn der Übung.

 
Michael Martens:

Eben WEIL Punkt- vor Strichrechnung kommt führt der Ansatz Ergebnis = high + low/Candles/2 zum falschen Ergebnis.

Die Klammern brauchst Du eben, damit er erst die Strichrechnung durchführt.


Mit dem High, high, iHigh kannst Du Recht haben - da muss er dann mal probieren und testen.
Ich selber arbeite da meist mit iHigh - da brauche ich dann auch kein extra Array. Aber ist ja auch ein gutes Thema, an dem er lernen kann.

Ach ja stimmt, durch Klammern kannst ja auch die Prioritäät bestimmen was als 1. oder eben 2. als schritt dran ist, hab ich nicht bedacht.


Wie meinst das genau? " Ich selber arbeite da meist mit iHigh - da brauche ich dann auch kein extra Array. "

meinst so hier?

double HighestHigh= high[ArrayMaximum(high)];

 


 
Aleksi-Trader:
Ach ja stimmt, durch Klammern kannst ja auch die Prioritäät bestimmen was als 1. oder eben 2. als schritt dran ist, hab ich nicht bedacht.


Wie meinst das genau? " Ich selber arbeite da meist mit iHigh - da brauche ich dann auch kein extra Array. "

meinst so hier?

Nein, so nicht ;). Muss aber dazu sagen, dass ich in MQL4 unterwegs bin - kann natürlich sein, dass MQL5 da mehr oder andere Funktionen hat. Vom Quelltext sah es zumindest nicht unbekannt aus ;).

 
Michael Martens:

Nein, so nicht ;). Muss aber dazu sagen, dass ich in MQL4 unterwegs bin - kann natürlich sein, dass MQL5 da mehr oder andere Funktionen hat. Vom Quelltext sah es zumindest nicht unbekannt aus ;).

MQL4 hab ich ehrlich gesagt noch nie nachgesehen. Weis aber das es zwar sehr ähnlich ist aber so einige Befehle anders sind.
 
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.

Die Version funzt jetzt. Ich verstehe nur nicht warum Ihr das als Series macht... jedenfalls wenn man low auch als Series setzt, die Candles weg und die Klammer in die Formel sieht es schonmal ganz gut aus. Ich probier jetzt noch rum mit limit um das auch ohne Series hinzubekommen. Das Thema hatte ich bisher eher gemieden, daher möchte ich das jetzt auch mal auf die Kette kriegen...

 Jedenfalls der hier geht:

//+------------------------------------------------------------------+
//|                                             Revised Kijunsen.mq5 |
//+------------------------------------------------------------------+
#property strict

#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
   ArraySetAsSeries(low,true);

   if(rates_total<Candles)
      return(rates_total);

   int limit=rates_total-prev_calculated;     //Diest Terme sind auf ArraySetAsSeries==true zugeschnitten, sonst würde das nicht funktionieren.
   if(limit==0)                               //Hast Du diese aus einem Beispiel?
      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; //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);
  }
 
pennyhunter:

Die Version funzt jetzt. Ich verstehe nur nicht warum Ihr das als Series macht... jedenfalls wenn man low auch als Series setzt, die Candles weg und die Klammer in die Formel sieht es schonmal ganz gut aus. Ich probier jetzt noch rum mit limit um das auch ohne Series hinzubekommen. Das Thema hatte ich bisher eher gemieden, daher möchte ich das jetzt auch mal auf die Kette kriegen...

 Jedenfalls der hier geht:

Jup, zeichnet exakt nach, so solls sein...  Der blau markierte Code ist tatsächlich Teil der Übung gewesen, so wird es auch im DonchainChannel verwendet wie es in Übung1 der Fall war. Auf der Basis dieses Grundgerüst kann man ja eigentlich jeden Indikator "bauen".


Nur um das ganze zu verstehen..... meine Fehler waren also:

1. Klammersetzung,

2. Hätte die arrays high und low als mittels ArraySetAsSeries sortieren müssen uns zu guter letzt

3. bei der Mittelwertberechnung das Candles weglassen müssen.

 
Aleksi-Trader:

Jup, zeichnet exakt nach, so solls sein...  Der blau markierte Code ist tatsächlich Teil der Übung gewesen, so wird es auch im DonchainChannel verwendet wie es in Übung1 der Fall war. Auf der Basis dieses Grundgerüst kann man ja eigentlich jeden Indikator "bauen".

Okay. Das hat mal jemand im Forum geschrieben (oder in einem Artikel?) Hatte bis jetzt noch Nichts Anderes gesehen, darum frag ich...


Aleksi-Trader:

Nur um das ganze zu verstehen..... meine Fehler waren also:

1. Klammersetzung,

2. Hätte die arrays high und low als mittels ArraySetAsSeries sortieren müssen uns zu guter letzt

3. bei der Mittelwertberechnung das Candles weglassen müssen.

Ja, das war Alles.

Grund der Beschwerde: