Höchste Kerze berechnen

 

Servus Zusammen,


ich möchte mir ein Indikator bauen, der mir die höchste Kerze (einmal höchste Kerze 10 Tage, 20 Tage, 30 Tage) anzeigen, und dieses nach hinten in der Zeitlinie weiterführen. Jedoch zeigen mir die Linien nur auf den höchsten und niedrigsten Wert jedes einzelnes Bar an.


//+------------------------------------------------------------------+
//|                                                         Test.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+

#property indicator_chart_window 
#property indicator_buffers 6
#property indicator_plots   6

#property indicator_label1  "10 Tage Hoch"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed   

#property indicator_label2  "10 Tage Tief"
#property indicator_type2   DRAW_LINE
#property indicator_color2  clrRed  
 
#property indicator_label3  "20 Tage Hoch"
#property indicator_type3   DRAW_LINE
#property indicator_color3  clrBlue   

#property indicator_label4  "20 Tage Tief"
#property indicator_type4   DRAW_LINE
#property indicator_color4  clrBlue   

#property indicator_label5  "30 Tage Hoch"
#property indicator_type5   DRAW_LINE
#property indicator_color5  clrBlack

#property indicator_label6  "30 Tage Tief"
#property indicator_type6   DRAW_LINE
#property indicator_color6  clrBlack  
 
input ENUM_TIMEFRAMES InpPeriod=PERIOD_D1; 

double SHigh[],MHigh[],LHigh[];
double SLow[],MLow[],LLow[];

int SSHigh;
    
    
int OnInit()
{
      SetIndexBuffer(0,SHigh, INDICATOR_DATA);
      SetIndexBuffer(1,SLow,INDICATOR_DATA);
      SetIndexBuffer(2,MHigh,INDICATOR_DATA);
      SetIndexBuffer(3,MLow,INDICATOR_DATA);
      SetIndexBuffer(4,LHigh,INDICATOR_DATA);
      SetIndexBuffer(5,LLow,INDICATOR_DATA);
    
//---
     
      for(int i=0;i<5;i++)
     {
      PlotIndexSetInteger(i,PLOT_DRAW_TYPE,DRAW_LINE); // der Typ der graphischen Konstruktion
      PlotIndexSetInteger(i,PLOT_LINE_STYLE,STYLE_SOLID); // der Stil der Linie auf die Zeichnung
      PlotIndexSetInteger(i,PLOT_LINE_WIDTH,2);           // die Dicke der Linie auf die Zeichnung
     }

return(INIT_SUCCEEDED);

}

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[])
  {
  //Array nach Größe sortieren
   ArraySetAsSeries(SHigh,true);
   ArraySetAsSeries(SLow,true);
   ArraySetAsSeries(MHigh,true);
   ArraySetAsSeries(MLow,true);
   ArraySetAsSeries(LHigh,true);
   ArraySetAsSeries(LLow,true);
   
   for(int i=0;i<1000;i++){
   int i = 0;
   //Auswerten der höchsten Kerze 10 Tage
   CopyHigh(_Symbol,PERIOD_D1,i,10,SHigh);
   ArrayMaximum(SHigh,i,10);
   CopyLow(_Symbol,PERIOD_D1,i,10,SLow);
   ArrayMinimum(SLow,i,10);
   //Auswerten der höchsten Kerze 20 Tage
   CopyHigh(_Symbol,PERIOD_D1,i,20,MHigh);
   ArrayMaximum(MHigh,i,20); 
   CopyLow(_Symbol,PERIOD_D1,i,20,MLow);
   ArrayMinimum(MLow,i,20);
   //Auswerten der höchsten Kerze 30 Tage
   CopyHigh(_Symbol,PERIOD_D1,i,30,LHigh);
   Comment(ArrayMaximum(LHigh,i,30));
   CopyLow(_Symbol,PERIOD_D1,i,30,LLow);
   ArrayMinimum(LLow,i,30);
   
   
   };
        
     
         
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Wie das Ergebniss aussieht (Bars Indikator) und wie es aussehen sollte(Bars Eigentlich, in Paint gezeichnet, und nur die 10 Tages Linie)

Dateien:
 
wenn du 30 Bars max willst brauchst du nicht 1000 Bars Dreinkopieren, lies die doku, da steht drin wie du die copy werte richtig verwendest
 

Ich hab mir mal einen Indikator DailyHiLo gebaut, vielleicht kannst Du damit anfangen und dann die Elemente hinzufügen wie Du sie brauchst?

Ohne Garantie!

Dateien:
DailyHiLo.mq5  4 kb
 
amando #:
wenn du 30 Bars max willst brauchst du nicht 1000 Bars Dreinkopieren, lies die doku, da steht drin wie du die copy werte richtig verwendest

nein ich will nicht maximal 30 Bars haben. Es soll nach hinten weiterlaufen in der Zeitspanne.

es soll immer überprüft werden, welche kerze die höchste ist aus den letzten 10 Kerzen z.B.:

Aus zum beispiel der 1 Kerze bis zur 10 ten kerze. dann soll überprüft werden welche die höchste Kerze von der 2ten bis zur 11 Kerze ist. Danach von der 3ten bis zur 12ten Kerze. usw.


_____EDIT_____

Okay jetzt hab ich kapiert was du gemeint hast. Ich kopiere nur die Daten nur rüber ohne die irgendwie zu analysieren und ArrayMaximum nimmt jedesmal den höchsten Wert. Da ich das aber bei jedem einzelnen Bar so mache, ist es immer logisch, das es der Maximalwert ist.

 
Carl Schreiber #:

Ich hab mir mal einen Indikator DailyHiLo gebaut, vielleicht kannst Du damit anfangen und dann die Elemente hinzufügen wie Du sie brauchst?

Ohne Garantie!

Ich hab mir mal das angeschaut von dir. Erstmal vielen Dank!


Ich habe meinen Code komplett überarbeitet.

 
#property indicator_chart_window 
#property indicator_buffers 6
#property indicator_plots   6

#property indicator_label1  "10 Tage Hoch"
#property indicator_type1  DRAW_LINE
#property indicator_color1  clrRed   
  
#property indicator_label2  "10 Tage Tief"
#property indicator_type2  DRAW_LINE
#property indicator_color2  clrRed   
 
 MqlRates PriceInformation[];
 
double High[], Low[], SHighest[200],SLowest[200];
int SHigh, SLow;

int OnInit()
{
    
return(INIT_SUCCEEDED);

}

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[])
  {
      SetIndexBuffer(0,SHighest, INDICATOR_DATA);
      SetIndexBuffer(1,SLowest,INDICATOR_DATA);
      /*SetIndexBuffer(2,MHigh,INDICATOR_DATA);
      SetIndexBuffer(3,MLow,INDICATOR_DATA);
      SetIndexBuffer(4,LHigh,INDICATOR_DATA);
      SetIndexBuffer(5,LLow,INDICATOR_DATA);
   
//---
     
    //
      PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE); // der Typ der graphischen Konstruktion
      PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // der Stil der Linie auf die Zeichnung
      PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);           // die Dicke der Linie auf die Zeichnung
      */

   
  ArraySetAsSeries(PriceInformation, true);
  
  int Data = CopyRates(_Symbol,_Period,0,200, PriceInformation);//Preisdaten der letzten 1000 Kerzen laden
  
   ArraySetAsSeries(High,true);//Array soll von aktuellen zu den ältesten Daten sortiert werden.
   ArraySetAsSeries(Low,true);//Array soll von aktuellen zu den ältesten Daten sortiert werden.

    CopyHigh(_Symbol,_Period,0,200,High); //Die Daten des maximalen Preises aus den Letzten 1000 Kerzen aus dem aktuellen Chart mit der aktuellen Periode in das Array High kopieren
    CopyLow(_Symbol,_Period,0,200,Low); //Die Daten des aus den Letzten 1000 Kerzen aus dem aktuellen Chart mit der aktuellen Periode in das Array High kopieren
   
    
    for(int i=0; i<180 ;i++)
      {
         SHigh = ArrayMaximum(High,i,10);//Höchste Kerze von Position i aus dem Array High zur 10ten Position im Array ermitteln
         SLow = ArrayMinimum(Low,i,10);//Niedrigste Kerze von Position i aus dem Array High zur 10ten Position im Array ermitteln
         
         SHighest[i] = PriceInformation[SHigh].high; //Höchstpreis aus dem ermittelten Kerze auslesen und dem Array SHighest hinzufügen
         SLowest[i] = PriceInformation[SLow].low; //Höchstpreis aus dem ermittelten Kerze auslesen und dem Array SHighest hinzufügen
      };
    
  
  
 
   return(rates_total);
  }


So wie ich die jeweilige Funktion verstehe sollte es ja so funktionieren. Jedoch wird mir keine Linie gezeichnet.

 

Schau Dir mein Beispiel genau an!

Was passiert in OnInit? Manches, was dort hin gehört, machst Du in OnCalculate()!

Lies mal:

Quickstart for newbies: https://www.mql5.com/de/articles/496
und: https://www.mql5.com/de/articles/100

Schnelleinstieg oder Kurzanleitung für Anfänger
Schnelleinstieg oder Kurzanleitung für Anfänger
  • www.mql5.com
Liebe Leser, in diesem Artikel möchte ich Ihnen vermitteln und zeigen, wie man sich möglichst schnell und einfach die Grundlagen der Erstellung automatischer Handelssysteme, wie die Arbeit mit Indikatoren u. a., erschließt. Der Beitrag richtet sich an Neueinsteiger, in ihm kommen weder komplizierte noch schwer zu verstehende Beispiele zur Anwendung.
 
Carl Schreiber #:

Schau Dir mein Beispiel genau an!

Was passiert in OnInit? Manches, was dort hin gehört, machst Du in OnCalculate()!

Lies mal:

Quickstart for newbies: https://www.mql5.com/de/articles/496
und: https://www.mql5.com/de/articles/100

Ich hab mal alles, was keine Berechnung ist, in die OnInit Funktion gepackt:

#property indicator_chart_window 
#property indicator_buffers 2
#property indicator_plots   2

#property indicator_label1  "10 Tage Hoch"
#property indicator_type1  DRAW_LINE
#property indicator_color1  clrRed   
  
#property indicator_label2  "10 Tage Tief"
#property indicator_type2  DRAW_LINE
#property indicator_color2  clrRed   

 MqlRates PriceInformation[];
 
double High[], Low[], SHighest[],SLowest[];
int SHigh, SLow;

int OnInit()
{
      SetIndexBuffer(0,SHighest, INDICATOR_DATA);
      SetIndexBuffer(1,SLowest,INDICATOR_DATA);
      /*SetIndexBuffer(2,MHigh,INDICATOR_DATA);
      SetIndexBuffer(3,MLow,INDICATOR_DATA);
      SetIndexBuffer(4,LHigh,INDICATOR_DATA);
      SetIndexBuffer(5,LLow,INDICATOR_DATA);
   
//---
     
    //*/
    PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE); // der Typ der graphischen Konstruktion
    PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // der Stil der Linie auf die Zeichnung
    PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);   
      
    PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE); // der Typ der graphischen Konstruktion
    PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID); // der Stil der Linie auf die Zeichnung
    PlotIndexSetInteger(1,PLOT_LINE_WIDTH,2);           // die Dicke der Linie auf die Zeichnung
      

     
   ArraySetAsSeries(High,true);//Array soll von aktuellen zu den ältesten Daten sortiert werden.
   ArraySetAsSeries(Low,true);//Array soll von aktuellen zu den ältesten Daten sortiert werden.
   ArraySetAsSeries(PriceInformation, true);
   ArraySetAsSeries(SHighest, true);
   ArraySetAsSeries(SLowest, true);
   
   CopyHigh(_Symbol,_Period,0,2000,High); //Die Daten des maximalen Preises aus den Letzten 1000 Kerzen aus dem aktuellen Chart mit der aktuellen Periode in das Array High kopieren
   CopyLow(_Symbol,_Period,0,2000,Low); //Die Daten des aus den Letzten 1000 Kerzen aus dem aktuellen Chart mit der aktuellen Periode in das Array High kopieren
   
      
      CopyRates(_Symbol,_Period,0,500, PriceInformation);//Preisdaten der letzten 1000 Kerzen laden
  
return(INIT_SUCCEEDED);

}

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[])
  {
  Comment("Vor der berechnung");
      
        for(int i=0;i<180;i++)
      {
         SHigh = ArrayMaximum(High,i,10);//Höchste Kerze von Position i aus dem Array High zur 10ten Position im Array ermitteln
         SLow = ArrayMinimum(Low,i,10);//Niedrigste Kerze von Position i aus dem Array High zur 10ten Position im Array ermitteln
         
         SHighest[i] = PriceInformation[SHigh].high; //Höchstpreis aus dem ermittelten Kerze auslesen und dem Array SHighest hinzufügen
         SLowest[i] = PriceInformation[SLow].low; //Höchstpreis aus dem ermittelten Kerze auslesen und dem Array SHighest hinzufügen
       
      };
  

  
 
   return(rates_total);
  }

jetzt wird auch etwas gezeichnet, aber nicht das was ich erwartet habe. Siehe Bild "Aktuell".


es sieht für mich so aus, als ob er es einfach versetzt zeichnet.

__________________________EDIT______________________________

Okay, ich habe mal den MT5 und den MQL5 neugestartet. Jetzt zeigt er es richtig an.

Dateien:
Aktuell.png  33 kb