Einzelnen Beitrag anzeigen
  #3 (permalink)  
Alt 02.05.17
Kronenchakra Kronenchakra ist offline
Gesperrter Benutzer
 
Registriert seit: Feb 2016
Ort: 2100 Österreich
Beiträge: 313
Kronenchakra befindet sich auf einem aufstrebenden Ast
Standard

Die Migration von MQL4 zu MQL5 gibt oft Rätsel auf.
Vorab es ist gelungen, hat aber länger gedauert als angenommen.
Je tiefer ich in diese Materie eindringe, desto mehr denke ich mir: "Was hat sich Metaquotes denn da dabei wieder gedacht" (mal ganz vorsichtig ausgedrückt, vermutlich NICHTS)

Es beginnt ja schon mit false(False) und true(True), DoubleToStr(..) usw.
Was wäre denn schon dabei gewesen das doppelt zu definieren (alles muss man selber machen)
Code:
#define False false
#define True true
#define DoubleToStr DoubleToString
Das sind die leichtesten Übungen (könnte man natürlich auch mit Textersetzen machen).
-----------------------------------------
Folgende Unterschiede sind leider nicht so einfach auszugleichen:

1. Den Text im Indikatorfenster in MQL5 verschwinden zu lassen.
In MQL4:
Code:
SetIndexLabel  (0,NULL);
2. Die Höhe des Indikatorfensters in MQL5 voreinzustellen und diese kann vom Anwender immer noch verändert werden
Code:
ChartSetInteger(0,CHART_HEIGHT_IN_PIXELS,ChartWindowFind(),315);
ChartSetInteger(0,CHART_HEIGHT_IN_PIXELS,ChartWindowFind(),0);
Geht in MQL5 nicht, das Fenster schrumpft auf 0 zusammen und ist dort fix.
Nach der ersten Zeile ist es zwar 315 hoch, aber dort angenagelt (softwaremäßig kann man es ändern, aber nicht durch ziehen)

3. Die Präkompilerdirektive '#property strict' hat einen Einfluss darauf ob die Kommentare bei input bzw extern angezeigt werden.
Lässt man es weg, werden die Variablennamen angezeigt.
Das hat mit 'strict' imho aber absolut nix zu tun.

So, jetzt hab ich mir wieder meinen Frust von der Seele geschrieben.
Falls jemand Abhilfe für Punkt 1 oder 2 hat, bitte posten!!!

Hier die etwas gepimpte Stundenvolatilität für MQL4+MQL5. Ich hoffe ich hab keine Bugs eingebaut.
Code:
#property version "1.00"
#property copyright "copyright © 2017 tggits"
#property description "e-mail: tggits@web.de           homepage: tggits.weebly.com"
#property description "\n---  Freeware  ---\n"
#property description "Zeigt die Durchschnittsvolatilität (der gesamten Charthistorie) für den"
#property description "ausgewählten Timeframe (M1 bis H1) aufgeschlüsselt auf die Tagesstunden an.\n"
#property description "Für MQL4/MQL5 adaptiert von Otto Pauser alias Kronenchakra"
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots 1         // gibt sonst Warnung in MQL5
#property strict                    // MQL4 benötigt das wegen den Inputkommentaren egal ob mit input oder extern

input int   inpDelta=0;             // Brokerzeitoffset [Stunden] [z.B -1 oder 2]
input color inpColor=clrSilver;     // Farbe des Indikators
input int   inpWidth=2;             // Linienbreite Histogramm

double      PlotBuf[],              // der Plotbuffer
            Vola [24];              // die aufsummiert Volatilität
int         Count[24];              // Zähler der Anzahl an Volawerten

#define DoubleToStr DoubleToString  // Kompatibilität

int OnInit()
{ 
   SetIndexBuffer     (0,PlotBuf,INDICATOR_DATA);                    // Buffermapping
   IndicatorSetDouble (INDICATOR_MINIMUM,0.0);
   IndicatorSetString (INDICATOR_SHORTNAME,"Stundenvolatilität");
   PlotIndexSetDouble (0,PLOT_EMPTY_VALUE,NULL);                     // MQL4 - SetIndexEmptyValue(0,0.0);
   
   ChartSetInteger(0,CHART_HEIGHT_IN_PIXELS,ChartWindowFind(),315);
#ifdef __MQL4__
   ChartSetInteger(0,CHART_HEIGHT_IN_PIXELS,ChartWindowFind(),0);    // das funktioniert nur in MQL4
   SetIndexStyle  (0,DRAW_HISTOGRAM,0,inpWidth,inpColor);            // Histogramm Stil, Breite, Farbe
   SetIndexLabel  (0,NULL);                                          // unterdrückt unnötige Zahlen im Indikatorfenster
#else
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,  DRAW_HISTOGRAM);           // im MQL5 werden die Eigenschaften einzeln eingestellt
   PlotIndexSetInteger(0,PLOT_LINE_STYLE, STYLE_SOLID);
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH, inpWidth);
   PlotIndexSetInteger(0,PLOT_LINE_COLOR, inpColor);
#endif

   ArraySetAsSeries(PlotBuf, true);
   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[])
{
   int hour, i; string name; double vola;
   //int mult = pow(10,_Digits);
   
   if(prev_calculated==0)                          // nur einmal ausführen
      {
         ArrayInitialize(PlotBuf,NULL);
         for(i=0; i<rates_total; i++)              // Schleife über alle Kerzen
            {
               hour=CalcHour(time[i],inpDelta);    // Stunde berechnen
               Vola [hour]+=high[i]-low[i];        // Vola aufsummieren
               Count[hour]++;                      // Zähler incrementieren
            }

         for(i=0; i<24; i++)                       // Ergebnisse ausgeben
            {
               vola=(Vola[i]/Count[i]);            // vola berechnen
               //vola=(Vola[i]/Count[i])*mult;     // vola in points berechnen
               PlotBuf[23-i]=vola;                 // in Plotbuffer eintragen

               name="Stunde "+((i<10)?"0":"")+IntegerToString(i);          // Namen des Textobjects zusammenstellen

               ObjectCreate    (0,name,OBJ_LABEL,ChartWindowFind(),0,0);   // Textobjekt erzeugen und Werte setzen
               ObjectSetInteger(0,name,OBJPROP_CORNER,4);
               ObjectSetInteger(0,name,OBJPROP_XDISTANCE,5);
               ObjectSetInteger(0,name,OBJPROP_YDISTANCE,16+i*12);
               ObjectSetInteger(0,name,OBJPROP_COLOR,inpColor);
               ObjectSetInteger(0,name,OBJPROP_HIDDEN,true);
               ObjectSetInteger(0,name,OBJPROP_SELECTABLE,false);
               ObjectSetString (0,name,OBJPROP_TOOLTIP,"\n");
               ObjectSetString (0,name,OBJPROP_TEXT,name+":   "+DoubleToString(vola,_Digits));
            }
    }
   return(rates_total);
}

int CalcHour(datetime date, int delta)
{
   MqlDateTime tm;
   TimeToStruct(date,tm);
   if(tm.hour< 0) tm.hour+=23;
   if(tm.hour>23) tm.hour-=23;
   return(tm.hour);
}
Noch eine kleine Anmerkung zum Programm:
Dieses stellt die durchschnittliche Größe der einzelnen Kerzen dar, nicht die Kursschwankungen innerhalb der Stunde, das könnte man aber leicht adaptieren.
Nochmals Besten Dank an ping für die Idee und den Originalcode.

Ich progge mir jetzt ähnliches für den Spread auf Minutenbasis, bin schon gespannt auf die Durchschnittswerte.

Grüße Otto
Angehängte Dateien
Dateityp: mq5 Stundenvolatilität.mq5 (9,0 KB, 2x aufgerufen)
Dateityp: mq4 Stundenvolatilität.mq4 (9,0 KB, 5x aufgerufen)