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
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
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
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
- Freie Handelsapplikationen
- Über 8.000 Signale zum Kopieren
- Wirtschaftsnachrichten für die Lage an den Finanzmärkte
Sie stimmen der Website-Richtlinie und den Nutzungsbedingungen zu.
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ß