Expert Advisor erstellen, OnCalculate ohne funktion?

 

Servus Zusammen,


ich "wandel" gerade meinen Indikator in einen Expert Advisor um. Dabei musste ich feststellen, das die OnCalculate Funktion nicht so arbeitet wie bei einem Indikator. Leider konnte ich auf Google,etc. keinen Hinweis finden, weshalb.

#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

MqlRates PriceInformation[];

double High[], Low[], SHighest[],SLowest[],MHighest[],MLowest[],LHighest[],LLowest[];
int SHigh, SLow,MHigh,MLow,LHigh,LLow, AverageTreuRange;

int OnInit()
  {
   SetIndexBuffer(0,SHighest, INDICATOR_DATA);
   SetIndexBuffer(1,SLowest,INDICATOR_DATA);
   SetIndexBuffer(2,MHighest,INDICATOR_DATA);
   SetIndexBuffer(3,MLowest,INDICATOR_DATA);
   SetIndexBuffer(4,LHighest,INDICATOR_DATA);
   SetIndexBuffer(5,LLowest,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

   PlotIndexSetInteger(2,PLOT_DRAW_TYPE,DRAW_LINE); // der Typ der graphischen Konstruktion
   PlotIndexSetInteger(2,PLOT_LINE_STYLE,STYLE_SOLID); // der Stil der Linie auf die Zeichnung
   PlotIndexSetInteger(2,PLOT_LINE_WIDTH,2);           // die Dicke der Linie auf die Zeichnung

   PlotIndexSetInteger(3,PLOT_DRAW_TYPE,DRAW_LINE); // der Typ der graphischen Konstruktion
   PlotIndexSetInteger(3,PLOT_LINE_STYLE,STYLE_SOLID); // der Stil der Linie auf die Zeichnung
   PlotIndexSetInteger(3,PLOT_LINE_WIDTH,2);           // die Dicke der Linie auf die Zeichnung

   PlotIndexSetInteger(4,PLOT_DRAW_TYPE,DRAW_LINE); // der Typ der graphischen Konstruktion
   PlotIndexSetInteger(4,PLOT_LINE_STYLE,STYLE_SOLID); // der Stil der Linie auf die Zeichnung
   PlotIndexSetInteger(4,PLOT_LINE_WIDTH,2);           // die Dicke der Linie auf die Zeichnung

   PlotIndexSetInteger(5,PLOT_DRAW_TYPE,DRAW_LINE); // der Typ der graphischen Konstruktion
   PlotIndexSetInteger(5,PLOT_LINE_STYLE,STYLE_SOLID); // der Stil der Linie auf die Zeichnung
   PlotIndexSetInteger(5,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);
   ArraySetAsSeries(MHighest, true);
   ArraySetAsSeries(MLowest, true);
   ArraySetAsSeries(LHighest, true);
   ArraySetAsSeries(LLowest, true);

   CopyHigh(_Symbol,_Period,0,1000,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,1000,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,1000, 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[])
       {
       
        for(int i=0;i<ArraySize(High);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

      MHigh = ArrayMaximum(High,i,20);//Höchste Kerze von Position i aus dem Array High zur 10ten Position im Array ermitteln
      MLow = ArrayMinimum(Low,i,20);//Niedrigste Kerze von Position i aus dem Array High zur 10ten Position im Array ermitteln

      LHigh = ArrayMaximum(High,i,30);//Höchste Kerze von Position i aus dem Array High zur 10ten Position im Array ermitteln
      LLow = ArrayMinimum(Low,i,30);//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

      MHighest[i] = PriceInformation[MHigh].high; //Höchstpreis aus dem ermittelten Kerze auslesen und dem Array SHighest hinzufügen
      MLowest[i] = PriceInformation[MLow].low; //Höchstpreis aus dem ermittelten Kerze auslesen und dem Array SHighest hinzufügen

      LHighest[i] = PriceInformation[LHigh].high; //Höchstpreis aus dem ermittelten Kerze auslesen und dem Array SHighest hinzufügen
      LLowest[i] = PriceInformation[LLow].low; //Höchstpreis aus dem ermittelten Kerze auslesen und dem Array SHighest hinzufügen
}
Comment("Berechnet");
        return(rates_total);
       }

void OnTick()
      {
       
      }

Es wird auch der Comment nicht angezeigt. wenn ich jedoch die For-Schleife komplett raus nehme, dann erhalte ich den Comment. Ein Fehler wird dabei jedoch auch nicht gebracht, das die OnCalculate Funktion fehlerhaft ist.

 

Lies einmal diese Kurzeinführungen:

Quickstart for newbies: https://www.mql5.com/de/articles/496
und: https://www.mql5.com/de/articles/100
(Schrittweiser Leitfaden für Anfänger zum Schreiben eines Expert Advisors in MQL5)
Kochbücher: https://www.mql5.com/de/search#!keyword=kochbuch
https://www.mql5.com/en/forum/447439
https://www.mql5.com/en/forum/9950
Bedenke, es gibt fast nichts, was nicht schon für MT4/MT5 programmiert wurde => Suchen ist unsere AI: https://www.mql5.com/de/search

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.