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