|
Tools Tools für Metatrader 4. |
|
Themen-Optionen | Thema durchsuchen | Ansicht |
|
|||
Stundenvolatilität
Hi,
Wer wissen möchte, bei welchem Instrument, zu welcher Tageszeit, in welchem Timeframe, welche Durchschnittsvolatilität sich aus der Charthistorie ergibt, der findet diese in diesem Indikator. --- Freeware --- Zeigt die Durchschnittsvolatilität (der gesamten Charthistorie) für den ausgewählten Zeitraum (M1 bis MN) aufgeschlüsselt auf die Tagesstunden an. PHP-Code:
Stundenvolatilität ist als Indikator programmiert und somit in den Ordner ...MQL4\Indicators zu verschieben. ciao ping - tggits |
|
|||
Super Idee!
Und endlich jemand der auch freizügig Code postet. Danke Ping Ich greife die Idee auf und versuche das in MQL5 zu übersetzen. Was ähnliches schwebt mit auch für den Spread vor. Auf die Minute genau, sind es nicht so viele Daten, 60min * 24std = 1440 Arraygröße. Auf eine gewisse Zeit rückblickend, ließe sich das dynamisch anpassen. Ist sicher auch eine Entscheidungshilfe sowohl für EAs als auch traditionär, ob traden oder nicht. Falls was sinnvolles rauskommt, poste ich es unter den Codeschnipseln. Grüße Otto |
|
|||
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 ----------------------------------------- Folgende Unterschiede sind leider nicht so einfach auszugleichen: 1. Den Text im Indikatorfenster in MQL5 verschwinden zu lassen. In MQL4: Code:
SetIndexLabel (0,NULL); Code:
ChartSetInteger(0,CHART_HEIGHT_IN_PIXELS,ChartWindowFind(),315); ChartSetInteger(0,CHART_HEIGHT_IN_PIXELS,ChartWindowFind(),0); 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); } 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 |
Lesezeichen |
Stichworte |
durchschnittsvolatilität, indikator, metatrader tools, programmierung, programmierung metatrader, tool |
|
|