Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools

Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools (http://www.expert-advisor.com/forum/index.php)
-   Tools (http://www.expert-advisor.com/forum/forumdisplay.php?f=109)
-   -   Stundenvolatilität (http://www.expert-advisor.com/forum/showthread.php?t=5640)

ping 30.04.17 13:44

Stundenvolatilität
 
Liste der Anhänge anzeigen (Anzahl: 3)
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:

#property version "1.00"
#property copyright "copyright © 2017  tggits"
#property description "e-mail: tggits@web.de           homepage: tggits.weebly.com"
#property description "\n\n---  Freeware  ---\n"
#property description "Zeigt die Durchschnittsvolatilität (der gesamten Charthistorie) für den"
#property description "ausgewählten Zeitraum (M1 bis MN) aufgeschlüsselt auf die Tagesstunden an."
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_minimum 0
#property strict
extern int   Bz=0;            // Brokerzeitoffset [Stunden] [z.B -1 oder 2]
extern color Fa=C'50,90,200'// Farbe des Indikator
string       Tx="Std ";
double       P1[],Std[24][2];
int          i;
void init()
ChartSetInteger(0,CHART_HEIGHT_IN_PIXELS,ChartWindowFind(),310);
  
ChartSetInteger(0,CHART_HEIGHT_IN_PIXELS,ChartWindowFind(),0);
  
SetIndexBuffer(0,P1);
  
SetIndexEmptyValue(0,0.0);
  
SetIndexStyle(0,DRAW_HISTOGRAM,0,0,Fa);
  
SetIndexLabel(0,NULL); 
  for(
i=0;i<Bars;i++)
  { 
Std[TimeHour(Time[i]-Bz*3600)][0]+=High[i]-Low[i];
    
Std[TimeHour(Time[i]-Bz*3600)][1]++;
  }
  
i=0;
}
void start()
{ if(
i==0)
    for(
i=0;i<24;i++)
    { if(
Std[i][1]<1)
        
Std[i][1]=1;
      
P1[23-i]=Std[i][0]/Std[i][1];
      
ObjectCreate(0,Tx+(string)i,OBJ_LABEL,ChartWindowFind(),0,0);
      
ObjectSet(Tx+(string)i,OBJPROP_CORNER,4);
      
ObjectSet(Tx+(string)i,OBJPROP_XDISTANCE,5);
      
ObjectSet(Tx+(string)i,OBJPROP_YDISTANCE,16+i*12);
      
ObjectSet(Tx+(string)i,OBJPROP_HIDDEN,true);
      
ObjectSet(Tx+(string)i,OBJPROP_SELECTABLE,false);
      
ObjectSetString(0,Tx+(string)i,OBJPROP_TOOLTIP,"\n");
      if(
i<10)
        
ObjectSetText(Tx+(string)i,"Stunde 0"+(string)i+":   "+DoubleToStr(Std[i][0]/Std[i][1],Digits),8,"Tahoma",Fa);
      else
        
ObjectSetText(Tx+(string)i,"Stunde "+(string)i+":   "+DoubleToStr(Std[i][0]/Std[i][1],Digits),8,"Tahoma",Fa);
    }


Die Software wurde mit der Version 4.00 Build 1065 erstellt. Eine Abwärtskompatibilität ist bis Version 4.00 Build 970 gegeben.
Stundenvolatilität ist als Indikator programmiert und somit in den Ordner ...MQL4\Indicators zu verschieben.

ciao ping - tggits

Kronenchakra 01.05.17 21:15

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

Kronenchakra 02.05.17 19:09

Liste der Anhänge anzeigen (Anzahl: 2)
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


Alle Zeitangaben in WEZ +2. Es ist jetzt 01:33 Uhr.

Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.1
Powered by vBCMS® 2.7.0 ©2002 - 2024 vbdesigns.de
Copyright ©2009 - 2023 by Expert-Advisor.com - Das Metatrader Forum