DarthTrader Posted February 27, 2009 Report Share Posted February 27, 2009 (edited) Hallo, ich habe ein paar Fragen zur Programmierung in MT. Wußte jetzt aber nicht, in welches Forum ich diesespezifischen 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 gibtes 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üßeDT Edited February 27, 2009 by DarthTrader Quote Link to comment Share on other sites More sharing options...
titanfx Posted February 27, 2009 Report Share Posted February 27, 2009 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; } Quote Link to comment Share on other sites More sharing options...
titanfx Posted February 27, 2009 Report Share Posted February 27, 2009 Für deinen Aufruf von Dayrange letzten Tages würde es so aussehen if(new_day) { eroeffnungskurs = iOpen (NULL, PERIOD_D1, 1); highestValue = iHigh (NULL, PERIOD_D1, 1); lowestValue = iLow (NULL, PERIOD_D1, 1); } Quote Link to comment Share on other sites More sharing options...
Mythos Posted February 27, 2009 Report Share Posted February 27, 2009 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 gibtes 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 Quote Link to comment Share on other sites More sharing options...
DarthTrader Posted February 28, 2009 Author Report Share Posted February 28, 2009 Danke für die Antworten. Wie ich sehe, habe ich es auf jeden Fall gelöst, es könnteaber durch Eure Vorschläge noch optimiert werden Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted August 5, 2012 Report Share Posted August 5, 2012 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 solangebis 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öglichkeitenwie 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 ichdann 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 TagePPS.: 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 :-) Quote Link to comment Share on other sites More sharing options...
conglom-o Posted August 5, 2012 Report Share Posted August 5, 2012 Tritt der Fehler in jedem Timeframe auf? Was genau soll bei dem Print-Befehl passieren? Quote Link to comment Share on other sites More sharing options...
WOGO Posted August 5, 2012 Report Share Posted August 5, 2012 Die Frage stelle ich, weil ich im Handbuch nichts zu einer Limitierung des Barshift auf 1000 gefunden habe und alle anderen Fehlermöglichkeitenwie 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 ichdann 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. Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted August 5, 2012 Report Share Posted August 5, 2012 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.: Bitte , der Issue ist kein "Notruf" , eher der Ärger, dass ich keine Ahnung habe, was da passiert aber mehrere Stunden damit heute verballert habe Quote Link to comment Share on other sites More sharing options...
WOGO Posted August 5, 2012 Report Share Posted August 5, 2012 Also nochmal: Fehler im Backtest? Wenn ja, zähl doch einfach mal die Bars im Chart wenn dein Backtest startet. Mehr Bars werden von deinem EA auch nicht berechnet. Quote Link to comment Share on other sites More sharing options...
conglom-o Posted August 5, 2012 Report Share Posted August 5, 2012 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 . 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. Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted August 6, 2012 Report Share Posted August 6, 2012 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 der200 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 derdie 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 Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted August 7, 2012 Report Share Posted August 7, 2012 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 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 ) . 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 . Quote Link to comment Share on other sites More sharing options...
conglom-o Posted August 7, 2012 Report Share Posted August 7, 2012 Was sagt denn die "vollständige Historie" an? Ansonsten wirf mal Teamviewer an und nehme per Skype Kontakt mit mir auf. Dann schaue ich mir das mal an. 1 Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted August 7, 2012 Report Share Posted August 7, 2012 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 ? KB Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted August 7, 2012 Report Share Posted August 7, 2012 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 wirdder Indi visualisiert . Und ich habe keine Ahnung, wie ich die Bars im Backtest-Chart hoch setzen kann . KB Quote Link to comment Share on other sites More sharing options...
WOGO Posted August 8, 2012 Report Share Posted August 8, 2012 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. 1 Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted August 8, 2012 Report Share Posted August 8, 2012 Hallo WOGO , Dein Hinweis hat mich einen großen Schritt nach vorne gebracht . Jedenfalls verstehe ich was passiert ist . 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 , dannbrauche 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 . 220 Tage * 288 5MinBars/Tag = 63360 Bars 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 PPS.: Ein hilfreicher Link zum Thema angewandt auf einen EA 1 Quote Link to comment Share on other sites More sharing options...
Kleinerbroker Posted August 8, 2012 Report Share Posted August 8, 2012 Nachtrag : In meinem EA habe ich eben im visuellen Modus das Chart durchlaufen lassen, bis es dann - ganz wie gewünscht - Anfang 2010 mit der eigentlichen Arbeit begonnen hat . Dieses "Durch Scrollen" hat 38 Minuten gedauert . Doch 3 Tassen Kaffee . KB Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.