Jump to content
Tom Next - Daytrading Community

Zugriff auf höhere Zeitebene (Intrady -> Daily)


DarthTrader

Recommended Posts

Hallo,

 

ich habe ein paar Fragen zur Programmierung in MT. Wußte jetzt aber nicht, in welches Forum ich diese

spezifischen Dinge schreiben soll. @whipsaw: Bitte verschieben.

 

Ich versuche Intraday auf Bars in anderen Zeitebenen zuzugreifen, da ich die Daily Range von gestern bspw. gern hätte.

Mein Ansatz ist folgender. lastDay ist eine statische Variable.

 

if (Day() != lastDay)
{
  eroeffnungskurs   = iOpen (NULL, PERIOD_D1, 1);
  highestValue	  = iHigh (NULL, PERIOD_D1, 1);
  lowestValue	   = iLow (NULL, PERIOD_D1, 1);
  lastDay = Day();
}

 

Ist das so korrekt, bin mir bei dem Ablauf meines EAs gerade nicht ganz sicher, oder gibt

es eine andere elegantere Möglichkeit?

 

Ich kenne es aus TradeSignal so, das ich immer mit [x] auf die vergangenen Bars zugreifen kann,

bei MT scheint das anders zu sein. Zuminest benötige ich dafür die richtige Funktion.

 

Ach ja, noch eins. Wie bekomme ich raus, ob eine neue Bar (egal welcher Timeframe) generiert wurde?

Ich habe es jetzt so gelöst:

 

static int nrOfBars = -1;   
  
if (Bars != nrOfBars) {
  printDebug (upperRange, lowerRange, dailyRange);
  nrOfBars = Bars;
}

 

Danke und beste Grüße

DT

Edited by DarthTrader
Link to comment
Share on other sites

Diese Funktion generiert eine boolische Variable new_day, die nur im aktuellen Programmzyklus aktiv ist

 

static bool new_day = false; // globale Variablen in Header
static datetime last_day;
bool new_day;

// any function
datetime current_day = iTime(Symbol(),PERIOD_D1,0);

new_day = false;
if(current_day != last_day)
{
 new_day = true; // neuer Tag - Variable nur für diesen Programmzyklus TRUE!!!
 current_day == last_day;
}

 

 

Dasselbe für den neuen Bar

 

static bool new_bar = false; // globale Variablen in Header
static datetime last_bar;
bool new_bar;

// any function
datetime current_bar = iTime(Symbol(),0,0);

new_bar = false;
if(current_bar != last_bar)
{
 new_bar = true; // neuer Bar - Variable nur für diesen Programmzyklus TRUE!!!
 current_bar == last_bar;
}

Link to comment
Share on other sites

if (Day() != lastDay)
{
  eroeffnungskurs   = iOpen (NULL, PERIOD_D1, 1);
  highestValue	  = iHigh (NULL, PERIOD_D1, 1);
  lowestValue	   = iLow (NULL, PERIOD_D1, 1);
  lastDay = Day();
}

 

Ist das so korrekt, bin mir bei dem Ablauf meines EAs gerade nicht ganz sicher, oder gibt

es eine andere elegantere Möglichkeit?

 

Damit ist hast du immer den Open, High und Low vom Vortag in den Variablen, falls du das willst ist das korrekt ja ;)

Du musst da eigentlich gar nicht auf Day() != lastDay überprüfen, denn iOpen(NULL,PERIOD_D1,1) liefert dir immer den Open vom letzen vollständigen Bar im Tageschart, also immer das Open des Vortages, egal wann du das am Tag aufrufst und ob du es öfter machst.

 

Ich kenne es aus TradeSignal so, das ich immer mit [x] auf die vergangenen Bars zugreifen kann,

bei MT scheint das anders zu sein. Zuminest benötige ich dafür die richtige Funktion.

Es ist in gewisser Weise gleich. Mit Open[x] kommst du genauso zurück, nur gibt es kein Open[x] of data2 etc. Hier musst du die Funktionen verwenden (iOpen etc)

 

Ach ja, noch eins. Wie bekomme ich raus, ob eine neue Bar (egal welcher Timeframe) generiert wurde?

Ich habe es jetzt so gelöst:

 

Im Prinzip, so wie es schon erwähnt wurde.

Aber ich glaub du willst zB in einem 15Minuten Chart den EA laufen haben und herausfinden ob im Tageschart ein neuer Bar erzeugt wurde oder?

Ich würds mit iTime(...,PERIOD_D1,0) machen:

static datetime last_time=0;
bool new_bar= false;

if(last_time != iTime(NULL,PERIOD_D1,0))
{
 new_bar= true;
 last_time= iTime(NULL,PERIOD_D1,0);
}
else
 new_bar= false;

 

Mit Bars greifst du ja nur auf die Anzahl Bars des aktuellen Charts zu, hilft dir also nix wennst was über einen anderen Timeframe wissen willst.

 

HTH

 

Ich hoff das beantwortet deine Fragen

Link to comment
Share on other sites

  • 3 years later...

Print("Slow_MA=",Slow_MA, " TimeFrame=",TimeFrame," Start um ",TimeToStr(iTime(Markt,TimeFrame,1003),TIME_DATE|TIME_MINUTES));

 

Geht Ihr mit mir einig, dass dieser Befehl einen Fehler liefert , da ich die Zeit vor 1003 Bars aufgerufen habe ? Ich erhalte jedenfalls das Datum 1.1.1970 solange

bis ich 1003 durch >1001 ersetze .

Die Frage stelle ich, weil ich im Handbuch nichts zu einer Limitierung des Barshift auf 1000 gefunden habe und alle anderen Fehlermöglichkeiten

wie insbesondere Charteinstellungen (Anzahl Bars im Chart oder Historie) oder Fehler durch fehlende Bars in der Historie selber ausgeschlossen habe .

Verunsichert bin ich auch, weil dann später - im späteren Verlauf des Backtest - irgendwann der Befehl doch beginnt zu funktionieren . Das verstehe ich

dann garnicht mehr .

 

Danke

 

KB

 

PS.: Der Hintergrund ist eigentlich der, dass im im H4 die 200´er MA des D1 abfragen will . Die Slow_MA steht auf 1200 , TimeFrame == 240 , >> 1200 Bar im 240 sind 200 Tage

PPS.:

Print("Slow_MA=",Slow_MA, " TimeFrame=",TimeFrame," Start um ",TimeToStr(iTime(Markt,TF5,Slow_MA),TIME_DATE|TIME_MINUTES));

mit TF5 == 1440 und Slow_MA==200 führt natürlich auch zum Ziel ...das ist schon klar :-)

Link to comment
Share on other sites

Die Frage stelle ich, weil ich im Handbuch nichts zu einer Limitierung des Barshift auf 1000 gefunden habe und alle anderen Fehlermöglichkeiten

wie insbesondere Charteinstellungen (Anzahl Bars im Chart oder Historie) oder Fehler durch fehlende Bars in der Historie selber ausgeschlossen habe .

Verunsichert bin ich auch, weil dann später - im späteren Verlauf des Backtest - irgendwann der Befehl doch beginnt zu funktionieren . Das verstehe ich

dann garnicht mehr .

Hast du den Fehler nur im Backtest? Da gibt es zu Beginn ja nicht unbedingt mehr als 1000 Bars Historie. Kann es nicht daran liegen?

Eine Limitierung von Barshift auf 1000 gibt es ziemlich sicher nicht.

Link to comment
Share on other sites

Da gibt es zu Beginn ja nicht unbedingt mehr als 1000 Bars Historie

 

Das verstehe ich nicht so richtig . Jedenfalls habe ich aber meine Historie im Ordner "History" bzw mit F2 aufgerufen und die genau die Bar´s gesucht und gefunden die angeblich nicht vorhanden sind .

Der Print-Befehl ist nur Hilfe zum Debuggen des Fehlers . Anlass ist, dass ich den Trend der 200ér MA im Tageschart aus dem H4 heraus bestimmen wollte .

Den Issue selber habe ich nun gelöst, indem ich einfach direkt aus dem Timeframe "1440" aufgerufen habe . Aber dennoch würde ich gerne verstehen wollen, warum mir eine "iMA" mit 1200 Barshift im 240 TF nicht dasselbe ergeben wie 200 Barshift im 1440 TF . Den Fehler selber habe ich nur im 240 TF gesehen , aber auch in keinem anderen TF gesucht .

 

KB

 

PS.: Bittenictation.gif , der Issue ist kein "Notruf" , eher der Ärger, dass ich keine Ahnung habe, was da passiert aber mehrere Stunden damit heute verballert habeschimpf.gif

Link to comment
Share on other sites

Aber dennoch würde ich gerne verstehen wollen, warum mir eine "iMA" mit 1200 Barshift im 240 TF nicht dasselbe ergeben wie 200 Barshift im 1440 TF . Den Fehler selber habe ich nur im 240 TF gesehen , aber auch in keinem anderen TF gesucht .

Da stellt sich zunächst die Frage, wie Du auf Deine Datenbasis in den verschiedenen Zeitebenen kommst. Wenn Du alles sauber von M1 auf die anderen Ebenen hochgerechnet hast, dann dürfte die Berechnung problemlos möglich sein. Wenn Du das nicht hast und Du auf die vom Broker gelieferten Daten vertraust, dann verwundert mich so ein Fehler nicht wink.png.

 

So nebenbei: Was meinst Du denn nun genau? Erst redest Du von einem 1200er (bzw. 200er) iMA und nun von einem iMA mit 1.200er (bzw. 200er) Barshift. Das ist ein gewaltiger Unterschied.

Link to comment
Share on other sites

Guten Morgen

 

@Wogo : Ja, im Backtest . Guter Hinweis, die Bars zu zählen, wenn der BT startet, ich gehe dem heute Abend mal nach .

 

@conglom-o : ich habe den Begriff "Barshift" vielleicht falsch verwendet . Die Funktion iMA habe ich genutzt , um den Wert der

200 MA des Tageschart an einem Datum, das 200 Tage von "Jetzt" (im Backtest) zurück liegt aus einem 240 Min-Chart heraus zu bestimmen .

Dazu nutzt ich eine Historie die ich hier geholt habe und dann auf die bei TN beschriebenen Methode konvertiert habe . Die Stelle an der

die Ausgabe stockt, habe ich in der Historie identifiziert => es sind alle Bars vorhanden (OHLC sind auch "OK") .

Daraufhin habe ich dann iTime eingesetzt , weil ich komplett lost war . Auch iTime liefert dann nichts mehr , und so habe ich #6 geschrieben .

Es liegt ja scheinbar nicht an der "iMA"

 

Ich gehe mal dem Hinweis von WOGO nach und gucke , was ich zu Beginn des BT im Chart habe .

 

KB

Link to comment
Share on other sites

Guten Morgen

 

@Wogo : Ja, im Backtest . Guter Hinweis, die Bars zu zählen, wenn der BT startet, ich gehe dem heute Abend mal nach .

.............

 

 

KB

 

Ja , @Wogo , dass scheint eine erfolgsversprechende Fährte zu sein nictation.gif Das Chart des Backtest beginnt ca 7,5 Monate vor dem Beginn des BT , dem virtuellen "Heute" . Einer meiner Indi´s (bzw die Funktion im EA) , der auf die die 200 MA im Tageschart / 1200 MA im 4 Std Chart zurückgreift , wird also solange nicht richtig ausgeführt werden , bis genügend Bars im Backtest-Chart vorhanden sind .

 

Dabei ist für mich die Erkenntnis neu, dass ich trotz ausreichender History im MT4-Ordner , diese Daten ganz offensichtlich nicht vollständig in das Backtest-Chart geladen werden (ganz Ok, wenn man 10 Jahre 1Min-Daten lagert zwinker.gif ) . Also muss ich nun herausfinden, wie ich die Historie des Backtest erweitern kann ...hoffe aber auf auch Hilfe hier, denn *große Ausnahme* Google konnte mir diesesmal bislang nicht helfen .

 

KB

 

PS.: Unter "Extras >> Optionen >> Diagramme >> ´Balken max in Historie`/`Balken max im Chart´ " habe ich die bekannten 2147483647 natürlich eingestellt . Die scheinen also beim Backtest nicht zur Anwendung zu kommen .

Link to comment
Share on other sites

Was sagt denn die "vollständige Historie" an?

 

conglom-o hat dann auf meiner Maschine festgestellt, dass ich meine vollständige Historie zurück bis 2001 wieder gelöscht hatte, indem ich mit dieser Instanz des Metatrader nach dem erfolgreichen Import erneut Online gegangen bin .

Somit wurden dann die von mir importierten Dateien gelöscht und aktuelle aber kurze Historieen - von mir unbemerkt - darüber geschrieben . Das muss gestern Abend oder heute Morgen geschehen sein .

 

Nach Korrektur dieses Fehlers (vielen Dank nochmal an Conglom-O ) existiert der Fehler allerdings leider weiter .

 

Gibt es weitere Ideen woran es liegen mag ? blush.png

 

KB

Link to comment
Share on other sites

Ok, also ich bin nun mit meinem Latein am Ende . Hier ist der Code für einen Indi, der die 1. und 2.Ableitung einer 1200-MA im H4 ( == 200 MA im Tages-TF) darstellen soll :

 

//--------------------------------------------------------------------
//
//
//--------------------------------------------------------------- 1 --
#property copyright "Copyright © SK, 2007" // Das ist der Ursprung
#property link	 "http://AutoGraf.dp.ua" // Das ist der Ursprung aber KB was here :-)
//--------------------------------------------------------------------
#property indicator_separate_window //
#property indicator_buffers 2	 //
#property indicator_color1 Blue	 //
#property indicator_color2 Blue	 //
#property indicator_level1		 0//
#property indicator_levelstyle	 1//
#property indicator_levelcolor Black//
#property indicator_levelwidth	 1//
//--------------------------------------------------------------- 2 --
extern int Barsback = 5000;	 // Barsback
extern int Period_MA_1= 1200;	 // 200 Tage-MA im 4 Std TF
extern int Fast_Shift = 120;	 // 4 Wochen im 4 Std TF
extern int Ampli	 = 20;	 // Verstärkung für bessere Visualisierung
//--------------------------------------------------------------- 3 --
double
Line_1[], Line_2[];			 // Indis
//--------------------------------------------------------------- 4 --
int init()						 //
{
int limit = Bars - Barsback;
string short_name;
short_name=("SLV_Fast_1. & 2. Diff im H4-TF= "+(Period_MA_1/6)+" Tage");
IndicatorShortName(short_name);
IndicatorDigits(2)				 ;//
// 1. Differential
SetIndexLabel	 (0, "1 Diff") ;//
SetIndexStyle	 (0, DRAW_LINE,STYLE_SOLID,1,Blue);// 1. Ableitung
SetIndexBuffer (0, Line_1) ;//
SetIndexDrawBegin (0, limit) ;//
// 2. Differential
SetIndexLabel	 (1, "2 Diff") ;//
SetIndexStyle	 (1, DRAW_LINE,STYLE_DASH,1,Blue) ;// 2. Ableitung
SetIndexBuffer (1, Line_2) ;//
SetIndexDrawBegin (1, limit) ;//
//--------------------------------------------------------------- 5 --
return;						 //
}
//--------------------------------------------------------------- 6 --
int start()						 //
{
//--------------------------------------------------------------- 7 --
double						 //
	 MA_c, MA_p,Sum		 ;//
int							 //
	 i						 ,//
	 Counted_bars			 ;//
//--------------------------------------------------------------- 8 --
Counted_bars=IndicatorCounted() ;//
int limit = Bars - Counted_bars;//
if (limit > Barsback) limit = Barsback;//
if (Counted_bars > 0) limit++;
//--------------------------------------------------------------- 9 --
for ( i=0; i<limit; i++)
 {
 //-------------------------------------------------------- 10 --
 MA_c=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i);
 MA_p=iMA(NULL,0,Period_MA_1,0,MODE_LWMA,PRICE_TYPICAL,i+Fast_Shift);
 Line_1[i]= Ampli*(MA_c-MA_p); //
 }
 //-------------------------------------------------------- 11 --
for ( i=0; i<limit; i++)
 {
 Line_2[i]= 3*Ampli*(Line_1[i]-Line_1[i+2]);//
 //-------------------------------------------------------- 12 --	
 }
 //-------------------------------------------------------- 13 --
return;						 //
}
//-------------------------------------------------------------- 14 --

 

Die Settings im Backtest scheinen OK, die Historie auch . Dennoch zeigt das Chart erst lediglich 7,5 Monate - Bars an und erst wenn die 12xx erreicht sind, dann wird

der Indi visualisiert .

 

Und ich habe keine Ahnung, wie ich die Bars im Backtest-Chart hoch setzen kann .

 

KB

Link to comment
Share on other sites

Ich glaub, dass du die Anzahl der Balken im Backtest vor deinem Testzeitraum nicht beeinflussen kannst, zumindest wüsste ich nicht wie.

Du kannst zum Testen aber einen einfachen Trick anwenden.

Stell als Backtestzeitraum einfach ein paar Monate früher ein und frag im Code ab, ob du noch vor dem gewünschten Backtest-Start-Datum bist.

Wenn ja, dann spring mit return aus dem EA heraus, ohne irgendwas auszuführen.

Da musst du dann zuwar für jedes Ändern des Backtestzeitraumes auch den EA-Code ändern, aber zumindest funktioniert dein Test.

  • Upvote 1
Link to comment
Share on other sites

Hallo WOGO ,

 

Dein Hinweis hat mich einen großen Schritt nach vorne gebracht . Jedenfalls verstehe ich was passiert ist . door.gif

 

 

Für die nächsten Generationen KB´s :

 

Also, zuerst einmal muss man wissen, dass der Backtest im MT4 grundsätzlich "nur" die letzten 1.000 Bars öffnet und auch nur daraus alle verwendeten Indi´s bestimmt .

Wenn (!) ich , wie mit dem Indi oben vorgesehen, einen H4 Chart versorge und dann eine 200 -Tages-MA "jetzt" mit demselben Wert vor 4 Wochen (== 20 Tage == 120 Bars im H4) vergleichen will , dann

brauche ich 1.200 (200 Tage * 6 Bars/Tag) plus 120 Bars, insgesamt also 1.320 Bars im Backtest .

 

Beim Öffnen des Backtest fehlen mit also 320 Bars == ca 54 Tage bzw knappe 2 Monate . Also beginne ich einfach 2 Monate vor dem Zeitpunkt zu dem ich den Indi dann tatsächlich brauche .

Beispiel : Um ab dem 1.1.2010 Signale zu haben muss ich meinen Backtest ab dem 1.11.2009 starten, zwei Monate leer durchlaufen lassen ( if (Bars

 

Das war im 4 Std Chart .

 

Aber ich brauche genau dasselbe im 5 Min Chart .head.gif 220 Tage * 288 5MinBars/Tag = 63360 Bars kb-smile.gif

 

Also muss ich 62360 Bars * 5 Min vorher beginnen . Um beim Beispiel zu bleiben etwa 217 Tage (62360 * 5Min / 1440 Min) == ein knappes Jahr vorher

 

Und das 5 Min-Chart brauche ich, weil ich leider nachweisen konnte, das Backtest im H4 und im Min5 völlig unterschiedliche Ergebnisse haben .

 

Da kann ich "etwa zwei" Kaffee trinken , bevor ich anfangen kann, meinem visualisierten Backtest zu beobachten .

 

KB

 

PS.: Aber solche Übungen fördern das Verständnis dance.gif

PPS.: Ein hilfreicher Link zum Thema angewandt auf einen EA

  • Upvote 1
Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...