Moving Average - Tägliches "Reset"

 

Hallo,

Ich habe schon etwas recherchiert und die folgende Frage schon im Englischen Forum gestellt. Leider konnte ich noch keine Lösung finden, ich hoffe ihr habt ein Paar Tipps für mich.


Und zwar würde ich gerne eine Moving Average erstellen, welche sich jeden Tag zur Markteröffnung zurücksetzt. Anschliessend wird dann die MA über die "vorhandenen" Bars errechnet bis die gewünschte Periode erreicht ist, von da an geht es dann normal weiter.

Hier mal anhand einer HMA dargestellt wie das ganze etwa aussehen soll:


Ich denke mit einem bestehenden Indikator lässt sich das nicht erreichen, sondern ich müsste einen neuen schreiben? Wie würde ich das zurücksetzen am besten im onCalculate umsetzen?


Gruß

 
dodo3441:

Hallo,

Ich habe schon etwas recherchiert und die folgende Frage schon im Englischen Forum gestellt. Leider konnte ich noch keine Lösung finden, ich hoffe ihr habt ein Paar Tipps für mich.


Und zwar würde ich gerne eine Moving Average erstellen, welche sich jeden Tag zur Markteröffnung zurücksetzt. Anschliessend wird dann die MA über die "vorhandenen" Bars errechnet bis die gewünschte Periode erreicht ist, von da an geht es dann normal weiter.

Hier mal anhand einer HMA dargestellt wie das ganze etwa aussehen soll:


Ich denke mit einem bestehenden Indikator lässt sich das nicht erreichen, sondern ich müsste einen neuen schreiben? Wie würde ich das zurücksetzen am besten im onCalculate umsetzen?


Gruß

Die frage ist die der markteröffnung, die heit hängt ja von der broker zeit ab

 
amando:

Die frage ist die der markteröffnung, die heit hängt ja von der broker zeit ab


Ich dachte das könnte man bestimmen indem man für jeden Bar/Durchgang den Tag speichert und mit dem vorherigen vergleicht.

Wenn  Tag != TagAktuell -> reset

 
dodo3441:


Ich dachte das könnte man bestimmen indem man für jeden Bar/Durchgang den Tag speichert und mit dem vorherigen vergleicht.

Wenn  Tag != TagAktuell -> reset

  MEinte eher, wann ist für dich  tageseröffnung

 
wahrscheinlich zur Marktöffnung des DAX 9:00Uhr?
 
Oh das hätte ich wohl dazuschreiben sollen. In meinem Fall die US Börsen um 15:30.
 
dodo3441:
Oh das hätte ich wohl dazuschreiben sollen. In meinem Fall die US Börsen um 15:30.

finde die Idee ja Grundsätzlich gar nicht so schlecht.


Du kannst dir ja einen Indicator mit einer variablen Periode programmieren (lassen)

Alle Parameter sind vorhanden


Startzeit des Indikator

Aktuelle Zeit

Timeframe


Anhand des Timeframe kannst Du die Bars für die Periode kalkulieren


als Beispiel 30 Minuten Timeframe


15:30 = Periode 1, ist quasi der Durchschnitt des aktuellen Bars

16:00 = Periode 2, Bar von 15:30 + 16 : 30 auf SMA Basis = (1+2)/2

16:30 = Periode 3                                            SMA Basis = (1+2+3)/3

.....

Das ganze kannst Du natürlich über die datetime und Bars gestalten und hier eine schöne logik bauen, wobei halt auch zu hinterfragen ist ob ein Tagesdurchschnitt auf dem 1m Chart noch sinn macht

um 15:29 hättest Du dann den Durchschnitt von 1439 und dann springt er auf den neuen

 

Ich denke es könnte halt oft nützlich in EA's sein da die Gap am Anfang des Tages oft eine  "falsche" Richtung anzeigt.


Ich konnte mir bisher zwei Möglichkeiten vorstellen. ( hier mal ganz grob aus dem Kopf, ich bin recht neu bei MT also bitte habt Nachsicht)


Möglichkeit 1 - das verwenden eines fertigen Indikators  ( ich kannte nur iMA aus den  EA's , bei indikatoren gibts die MovingAverages.mqh habe ich gesehen) , der mit unterschiedlichen Perioden gespeist wird:

#include <MovingAverages.mqh>
input int maPeriode = 10;
double         maBuffer[];

onCalculate{

        int x = 0; //zähler
        MqlDateTime last;               
        
   for(int i=limit;i<rates_total && !IsStopped();i++)
    {    

        MqlDateTime current;
        datetime dtSer= TimeCurrent(current);
        
        if ( current.day != last.day)  // neuer tag -> zurücksetzen des zählers
                x = 0;


        if ( x < maPeriode ) 									
                maBuffer[i] = SimpleMA(const int position,const int x,const double &price[]);           // oder iMA ??   
        else 
                maBuffer[i] = SimpleMA(const int position,const int maPeriode,const double &price[]);  // genug bars vorhanden (seit tagesbeginn), ab hier mit der konstanten input periode
        
        x = x+1;                 // auf dem nächsten bar haben wir dann einen bar mehr in der Periode
        last = current.day ; 

    }

}


die zweite Möglichkeit wäre ein komplett neuer MA indikator, die Funktionsweise stelle ich mir ähnlich vor. Statt dass die veränderliche Periode ein input ist wäre diese dann innerhalb des Programms entsprechend definiert. (?)


Übrigens super dass hier so eifrig geantwortet wird! :)

 
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const int begin,
                const double &price[]){
                
   int limit;
   if(prev_calculated==0)
   limit=0;
   else limit=prev_calculated-1;

             
        
   for(int i=limit;i<rates_total && !IsStopped();i++){    

        MqlDateTime current;
        datetime dtSer= TimeCurrent(current);
        
        if ( current.day != last.day)  // neuer tag -> zurücksetzen des zählers
                x = 0;


        if ( x < maPeriode )                                                                    
                MABuffer[i] = SimpleMA(i,x,price);           // oder iMA ??   
        else 
                MABuffer[i] = SimpleMA(i,maPeriode,price);  // genug bars vorhanden (seit tagesbeginn), ab hier mit der konstanten input periode
        
        
        
        if ( i != lasti) x = x+1;   
                      // auf dem nächsten bar haben wir dann einen bar mehr in der Periode
        last = current ; 
        lasti = i;
        Comment ( "i" , i  ,"x" , x  );

    }


Der obige Code funktioniert im Strategietester, jedoch nicht bei Anwendung auf den Chart. Das tägliche zurücksetzen von x  scheint im chart nicht stattzufinden. Man sieht auch dass im Strategietester das zurücksetzen nicht auf den Chart in der Vergangenheit angewendet wird, sondern nur ab Testbeginn. Kann mir jemand sagen wie ich das korrigieren kann? timeCurrent scheint ja so nicht zu funktionieren.





 

Ist ein interessanter Ansatz. Mit dem iMA ist da allerdings nix anzufangen, da er ja immer auf die eingestellte Periode zurückgreift.

Da ist Handarbeit gefragt. Der Indi muss quasi bei Periode 1 beginnen und bis zur gewünschten Periode, diese verlängern.

Bei diesem Chart würde ich allerdings eher auf eine 'Breakout Strategie' zurückgreifen.
 

Wenn Du den Indi für die Vortage nicht brauchst, kannst Du theoretisch eine gleitende Berechnung durchführen.

Du kalkulierst dir in der OnInit die Bars welche in dem jeweiligen Timeframe heute schon angefallen sind und lässt bei jeder neuen Bar die OnInit durchlaufen. Dann fehlt dir nur die aktuelle Bar.

Die könntest Du mit dem aktuellen Close Price dazuzählen und in die Berechnung einfliessen lassen

bool isNewBar()
  {
   static datetime lastTime=0;
   datetime lastbarTime=(datetime)SeriesInfoInteger(Symbol(),0,SERIES_LASTBAR_DATE);
   if(lastTime==0)
     {
      lastTime=lastbarTime;
      return(false);
     }
   if(lastTime!=lastbarTime)
     {
      lastTime=lastbarTime;
      return(true);
     }
   return(false);
  }


dann in die OnCalculate

if(isNewBar()) 
        {
        OnDeinit(5);
        OnInit();
        }

und in der OnInit() nimmst Du für die Berechnung die Anzahl der Kerzen, welche Du berechnen willst

Grund der Beschwerde: