Multitimeframe Indicator

Einloggen oder registrieren, um einen Kommentar zu schreiben
amando
2873
amando  

Hallo


ich hab mir da mal einen Indicator geschriben, der Funktioniert auf Währungen problemlos.

Jedoch zeit er beim Dow interessanterweise nur in manchen Timerames was an.

Muss man für Indices was besonderes beachten?

Hier der Code



#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot MA
#property indicator_label1  "MA"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1



input ENUM_TIMEFRAMES      inpTimeframe=PERIOD_H1;
input ENUM_MA_METHOD       inpMA_Methode = MODE_SMA;
input ENUM_APPLIED_PRICE   inpAppliedPrice = PRICE_CLOSE;
input int                  inpPeriode = 14;

int            MAhandle;
double         MABuffer[];

double         ExtMaArray_TF2[]; 

int                        PeriodSeconds_TF1;            // TF1 period in seconds
int                        PeriodSeconds_TF2;            // TF2 period in seconds
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {

   SetIndexBuffer(0,MABuffer,INDICATOR_DATA);
   ArraySetAsSeries(MABuffer,true);               //--- set buffers as series, most recent entry at index [0]
   ArraySetAsSeries(ExtMaArray_TF2,true);                //--- set arrays as series, most recent entry at index [0]
   
   
   MAhandle=iMA(_Symbol,inpTimeframe,inpPeriode,0,inpMA_Methode,inpAppliedPrice);

   PeriodSeconds_TF1=PeriodSeconds();                    //--- calculate at which bar to start drawing indicators
   PeriodSeconds_TF2=PeriodSeconds(inpTimeframe);



   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
  {

   ArraySetAsSeries(time,true);                                          //--- set arrays as series, most recent entry at index [0]

   int bars_TF2=Bars(NULL,inpTimeframe);                                                   //--- check for data
   if(bars_TF2<14)
      return(0);


   int calculated_TF2;                                                                       //--- not all data may be calculated

   calculated_TF2=BarsCalculated(MAhandle);

   int limit;                                                                                //--- set limit for which bars need to be (re)calculated
   if(prev_calculated==0 || prev_calculated<0 || prev_calculated>rates_total)
      limit=rates_total-1;
   else
      limit=rates_total-prev_calculated;

   datetime convertedTime=0;
   
  for(int i=limit;i>=0;i--) //--- loop through TF1 bars to set buffer TF1 values
     {

      if(inpAppliedPrice!=PRICE_OPEN)                                                        //--- convert time TF1 to nearest earlier time TF2 for a bar opened on TF2 which is to close during the current TF1 bar
         convertedTime=time[i]+PeriodSeconds_TF1-PeriodSeconds_TF2;                          //--- use this for calculations with PRICE_CLOSE, PRICE_HIGH, PRICE_LOW, PRICE_MEDIAN, PRICE_TYPICAL, PRICE_WEIGHTED

      if(inpAppliedPrice==PRICE_OPEN)                                                        //--- convert time TF1 to nearest earlier time TF2 for a bar opened on TF2 at the same time or before the current TF1 bar
         convertedTime=time[i];                                                              //--- use this for calculations with PRICE_OPEN
      

      datetime tempTimeArray_TF2[];                                                          //--- check if TF2 data is available at convertedTime
      CopyTime(NULL,inpTimeframe,calculated_TF2-1,1,tempTimeArray_TF2);
      


      if(CopyBuffer(MAhandle,0,convertedTime,1,ExtMaArray_TF2)<=0) //--- get ma buffer values of TF2
         return(0);
      else
         MABuffer[i]=ExtMaArray_TF2[0];                                               //--- set ma TF2 buffer on TF1
     }

   return(rates_total);

  }
//+------------------------------------------------------------------+


Der Ansatz war, das hab ich auch auf MQL5 gefunden, das ich die aktuelle Zeit umrechne. auch logisch, da ich ja nur vom aktuellen Timeframe die Daten reinbekomme über die OnCalculate.


Hat wer eine Idee? Oder sollte man das Grundsätzlich anders gestalten mit dem Multi Time frame?


Danke

Otto Pauser
2165
Otto Pauser  

Hi amando,

ich glaub, du hast da einen falschen Ansatz gewählt. Du brauchst pro timeframe ein handle und einen buffer.

Ein Array von Indikatoren bietet sich an.

Sichtbar wird allerdings nur der Indikator sein, der mit dem aktuellen Timeframe zusammenpasst.

Falls es letztendlich um einen EA gehen soll ist der Ansatz wieder ganz anders.

Willst du wirklich einen Indikator machen? Keinen EA? schreib das bitte.

Ich grab dann mal auf meiner Platte, finde da sicher was und poste es anschließend hier.

Edit: Auch im Tester ist nur ein Indikator zu sehen der mit dem Timeframe ident ist.
amando
2873
amando  
Otto Pauser:

Hi amando,

ich glaub, du hast da einen falschen Ansatz gewählt. Du brauchst pro timeframe ein handle und einen buffer.

Ein Array von Indikatoren bietet sich an.

Sichtbar wird allerdings nur der Indikator sein, der mit dem aktuellen Timeframe zusammenpasst.

Falls es letztendlich um einen EA gehen soll ist der Ansatz wieder ganz anders.

Willst du wirklich einen Indikator machen? Keinen EA? schreib das bitte.

Ich grab dann mal auf meiner Platte, finde da sicher was und poste es anschließend hier.

Ja ich will das für einen indicator. Wies beim ea geht ist mir ja klar.

beim indi hadere ich da noch

Carl Schreiber
Moderator
9790
Carl Schreiber  
Amando, leide kenne ich dafür die Zaubertaste nicht, aber such mal hier (oben rechts) nach MTF und dann CodeBase. Du findest Dutzende MTF = Multi-Time-Frame Indiaktoren!
amando
2873
amando  
Carl Schreiber:
Amando, leide kenne ich dafür die Zaubertaste nicht, aber such mal hier (oben rechts) nach MTF und dann CodeBase. Du findest Dutzende MTF = Multi-Time-Frame Indiaktoren!

genauso bin ich zu meinem gekommen.

aber, ich will ja keinen kopieren, ich will es verstehen

Carl Schreiber
Moderator
9790
Carl Schreiber  
Dann studiere den Code dieser Indikatoren und änder mal etwas und schau was passiert - da sieht man meist gleich, warum etwas so ist und nicht anders!
amando
2873
amando  
Carl Schreiber:
Dann studiere den Code dieser Indikatoren und änder mal etwas und schau was passiert - da sieht man meist gleich, warum etwas so ist und nicht anders!

Das hilft beim grundansatz, da geb ich dir recht.

die frage ist, welcher von den grundansätzen ist bei modernen programmieren der bessere. Nachdem ich kein sw entwickler bin und das auch nie professionell gelernt habe, ist eine frage nah dem grundkonzept schon zu stellen

Carl Schreiber
Moderator
9790
Carl Schreiber  
amando:

Das hilft beim grundansatz, da geb ich dir recht.

die frage ist, welcher von den grundansätzen ist bei modernen programmieren der bessere. Nachdem ich kein sw entwickler bin und das auch nie professionell gelernt habe, ist eine frage nah dem grundkonzept schon zu stellen

Ein Freund von mir, der in seinen Kindertagen einen Atari-Wettbewerb gewann, hat erzählt, wie er vorgegangen ist: Bei einem Programm, das läuft mal dies mal jenes Bit geändert, so hat er herausgefunden, wie das Programm funzt.

Im Prinzip ist das immer noch ein sinnvoller Ansatz: Nimm was das geht und ändere etwas...

Einloggen oder registrieren, um einen Kommentar zu schreiben