Zum Inhalt springen
View in the app

A better way to browse. Learn more.

#T/N/X/T

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Indikator - DailyRange

Geschrieben

Hallo zusammen,

 

anbei mein erster Indikator. Nun ja, er hat mal funktioniert. Dann habe ich die neue Daily-Berechnungen eingebaut und nun...

 

Sicher ein einfacher Code. Er berechnet Intraday die Tageshöchst- Tagestiefstspanne des letzten Tages. Diese Werte

werden vom aktuell laufenden Hoch, und Tief abgezogen, bzw, draufgerechnet. So entsteht ein Tradingchannel. Leider ist der Channel

bei mir statisch, das heißt er wird nicht mehr am neuen Tag angepasst. Ich dachte bereits mien MT spinnt und habe alle Cache-Files...

gelöscht, aber das Ergebniss ist dasselbe. Gestern hat es noch wunderbar funktioniert und der Kanal wurde jeden Bar (und auch Tag) angepasst.

 

Könntet ihr bitte mal drüber sehen? Bei der Gelegenheit bin ich auch gerne offen für alle Fehler, Codestücke wo Vorsicht geboten ist oder weitere Best-PRactices. Wie schon erwähnt, bin ich mit MT noch am Anfang meiner Bemühungen.

 

//+------------------------------------------------------------------+
//|                                                   DT_IN_DailyRange.mq4 |
//|                                   Copyright © 2009, DarthTrader. |
//|                                   [url="http://dt-trading.blogspot.com"]http://dt-trading.blogspot.com[/url] |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, DarthTrader"
#property link      "http://dt-trading.blogspot.com"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Green
#property indicator_style1 2
#property show_inputs

// Inputs 

// Buffers
double upperRangeBuffer[];
double lowerRangeBuffer[];

// Globale Strategie-Variablen
double upperRange;
double lowerRange;
double dailyRange;
double dailyHigh;
double dailyLow;   
double lokalesHoch = 0; 
double lokalesTief = 10000;
double eroeffnungskurs;


// -----
// Initialization 
// -----
int init()
{
  // Anzahl der verwendeten Indikatoren
  IndicatorBuffers (2);
  
  // Line-Style und Zuweisung der Buffer
  SetIndexStyle (0, DRAW_LINE, STYLE_DASH);
  SetIndexStyle (1, DRAW_LINE, STYLE_DASH);
  SetIndexBuffer (0, upperRangeBuffer);
  SetIndexBuffer (1, lowerRangeBuffer);
  
  // Name des Indikators
  IndicatorShortName ("DailyRange");
  SetIndexLabel (0, "UpperRange");
  SetIndexLabel (1, "LowerRange");
  
  // Ab welchem Bar sollen die Linien des Indikators gezeichnet werden
  //SetIndexDrawBegin (0, 50);
  //SetIndexDrawBegin (1, 50);
  
  // Kommentare erscheinen oben links
  //double free=AccountFreeMargin();   
  //Comment ("Account free margin is ",DoubleToStr(free,2),"\n","Current time is ",TimeToStr(TimeCurrent()));
  //Print ("Ausgabe in Expert-Log. Freie Margin:", DoubleToStr(free,2) );
  //Alert ("Ausgabe als Alarm-Popup. Freie Margin:", DoubleToStr(free,2) );

  return (0);
}

// -----
// DeInitialization 
// -----
int deinit() 
{
  clear();
}

// -----
// Alle Objekte wieder löschen
// -----
void clear() 
{
  string name;
  int obj_total = ObjectsTotal();

  for (int i = obj_total-1; i>=0; i--)
  {
     ObjectDelete (ObjectName(i));
  }
}
 
// -----
// DailyRange                           
// -----
int start()
{   
  // Anzahl der schon durchlaufenen Bars, beim ersten Mal 0
  int countedBars = IndicatorCounted(); 
  //Print ("CountedBars  ", countedBars, "   Bars  ", Bars);
  
  // weniger als 0 Bars gezählt => ERROR
  if (countedBars < 0) return (-1);
  
  // damit letzte Bar auf jeden Fall immer neu berechnet wird
  if (countedBars > 0) countedBars--;   
  
  int i = Bars - countedBars;
     
  // Hauptschleife. 
  // i wird am letzten Bar immer nur den Wert 0 haben.
  // Komischerweise ist der Wert allerdings immer 2,1,0 ...
  while (i>=0)
  { 
     computeDailyRange (i);
     upperRangeBuffer[i] = upperRange;
     lowerRangeBuffer[i] = lowerRange; 
     i--;
  }  

  return (0);
}


// -----
// Berechnungen
// -----
int computeDailyRange (int i)
{       
  static datetime lastDay = -1; 
  datetime currentDay = TimeCurrent();
  

  // Jeden Bar die bisherigen aktuellen lokalen Extrema finden
  if (High[0] > lokalesHoch) lokalesHoch = High[0];
  if (Low[0] < lokalesTief)  lokalesTief = Low[0];

  // Jeden Tag die Daily Range neu berechnen   
  if (lastDay != currentDay)
  {
     Alert (TimeDay(currentDay),".",TimeMonth(currentDay),".  ", "Neuer Tag");
  
     dailyHigh         = iHigh (Symbol(), PERIOD_D1, 1);
     dailyLow          = iLow (Symbol(), PERIOD_D1, 1);
     eroeffnungskurs   = iOpen (Symbol(), PERIOD_D1, 1);
     dailyRange        = dailyHigh - dailyLow;
  
     // Re-Initialisierung
     lokalesHoch  = 0;
     lokalesTief  = iLow (Symbol(), PERIOD_D1, 1) + 1000;  
  
     lastDay = currentDay; 
     return;
  }

  // Jeden Bar die Rangewerte eintragen
  upperRange = lokalesTief + dailyRange;
  lowerRange = lokalesHoch - dailyRange; 
}

 

DT_IN_DailyRange.mq4

 

Besten Dank

DT

Featured Replies

Geschrieben
Könntet ihr bitte mal drüber sehen? Bei der Gelegenheit bin ich auch gerne offen für alle Fehler, Codestücke wo Vorsicht geboten ist oder weitere Best-PRactices. Wie schon erwähnt, bin ich mit MT noch am Anfang meiner Bemühungen.

 

Als erstes: mir gefällt der Stil, für den ersten Indi sieht das richtig schön aus ;)

 

Zum Code:

Lass mich raten, du kriegst tausend Alarme? ;)

Als Anfänger ist es vermutlich besser für dich, wenn ich dir nicht gleich sage was falsch ist, sondern nur einen Hinweis gebe (was ich vermute das falsch ist...). (wenn du lieber die Lösung willst, sag einfach, aber jörg freut sich sicher über ein Rätsel ;)

 

Also schaut euch nochmal genau diesen Codeteil an:

  static datetime lastDay = -1; 
  datetime currentDay = TimeCurrent();
  [...]
  // Jeden Tag die Daily Range neu berechnen   
  if (lastDay != currentDay)
  {
     [...]
     lastDay = currentDay; 
     return;
  }

Dazu kurz in die Doku: was liefert TimeCurrent() ? Was fragt diese if-Bedingung wirklich ab?

Und da der Wert des Indikators nach dem if geschrieben wird: wird es je vorkommen, dass die if-Bedingung nicht erfüllt ist?

 

Noch eine Anmerkung zu der "reinitialisierung" der lokalen High und Low: (wenn die if das tun würde was du denkst:) du reinitialisierst am ersten Bar des Tages auf "übertriebene" Werte damit im Update diese sicher überschrieben werden oder? Aber du weißt ja welche werte lokales High und Low haben sollten (am ersten Bar des Tages ist das lokale Low ja genau bei Low[0] etc).

 

Sobald ich wieder Zugang zu MT hab kommen vielleicht noch andere Anmerkungen ;)

Geschrieben
  • Autor
Als erstes: mir gefällt der Stil, für den ersten Indi sieht das richtig schön aus ;)

 

Zum Code:

Lass mich raten, du kriegst tausend Alarme? ;)

 

Danke für die Antwort. Klar, da habe ich die schlechteste meiner getesten Versionen hochgeladen :-)

TimCurrent () hat natürlich immer einen anderen Wert, da in Sekunden gerechnet wird. Ich habe allerdings

auch schon iTime (Symbol(), PERIOD_D1, 0) verwendet und keinen unterschied festgestellt.

Leider erhalte ich bei beiden Versionen nur eine Alarmausgabe, was mir zu denken gibt. Ich hätte erwartete,

dass ich zumindest bei der hier reingestellten, ganz viele Alarmausgaben erhalte, wie Du sagtest.

 

Die Überlegung mit Low[0] und High[0] zu arbeiten ist eine sehr gute Idee, so spart man sich die ungenaue Re-Initialiserung und ich kann die Indi-Buffers an jedem Bar füllen, spare mir das return aus der Funktion.

Vorher hatte ich auch schon mal mir EMPTY_VALUE gearbeitet, da ich glaubt MT arbeitet sonst nicht korrekt,

wenn Wertlücken im Indi-Buffer auftauchen, aber so ist es natürlich angenehmer.

 

Der geänderte Code sieht so aus, funktioniert allerdings genauso wie der erste Versuch ... nicht korrekt.

 

static datetime lastDay = -1; 
datetime currentDay = iTime (Symbol(), PERIOD_D1, 0);
  

// Jeden Bar die bisherigen aktuellen lokalen Extrema finden
if (High[0] > lokalesHoch) lokalesHoch = High[0];
if (Low[0] < lokalesTief)  lokalesTief = Low[0];

// Jeden Tag die Daily Range neu berechnen   
if (lastDay != currentDay)
{
  Alert (TimeDay(currentDay),".",TimeMonth(currentDay),".  ", "Neuer Tag");
  
  dailyHigh         = iHigh (Symbol(), PERIOD_D1, 1);
  dailyLow          = iLow (Symbol(), PERIOD_D1, 1);
  eroeffnungskurs   = iOpen (Symbol(), PERIOD_D1, 1);
  dailyRange        = dailyHigh - dailyLow;
  
  // Re-Initialisierung
  lokalesHoch  = High[0];
  lokalesTief  = Low[0];  
  
  lastDay = currentDay; 
}

// Jeden Bar die Rangewerte eintragen 
upperRange = lokalesTief + dailyRange;
lowerRange = lokalesHoch - dailyRange; 

 

Genau den Codeteil, hatte ich nach meiner Frage der Berechnung eines neuen Tages geändert.

Vorher hatte er funktioniert. Ich habe damals mit Time gearbeitet. ... Hm ....

Da die Alert-Ausgabe so merkwürdig scheint, sieht es für mich so aus, als ob der Indikator gar nicht

bei jedem Bar angewendet wird, also nur am letzten. Auch wenn ich alle Charts schließe, MT schließe,

wieder öffne und den Indi neu anwende, kommt nur der letzte Bar als Alert. Kann es sein, dass MT manchmal

etwas im Cache speichert?

 

Danke

DT

 

PS: Anbei ein Bild, wie es aussehen sollte ... aus TradeSignal:

 

DailyRang_FDAX.jpg

Bearbeitet von whipsaw
Zitat eingekürzt wg. Lesbarkeit, Ladezeiten

Geschrieben
  • Autor

Ok, vergesst alles gesagte oder gefragte. Habe jetzt eine gute Referenz gefunden,

womit es scheinbar auch funktioniert. Ich muss immer mit folgender Codezeile abfragen,

ob ein neuer Tag enstanden ist:

 

  if (TimeDayOfWeek(Time[i]) != TimeDayOfWeek(Time[i+1]))

 

Scheinbar greifen alle anderen Abfragen nur auf die letzte Serverzeit zurück.

Siehe Hilfe ...

 

Note: At the testing, the last known server time is modelled.

 

... komisch, is wohl aber so. Auf jeden Fall, scheint es so zu funktionieren.

 

fdax_dailyrange.gif

Geschrieben

Ich muss mich ja fast bei dir für den "Fehler" bedanken, der gehört fast in die Lehrbuchsammlung zum schreiben eines Indikators ;) Vor allem weil ich beim Umstieg von TradeSignal auf MT auch diese Probleme hatte:

 

In TradeSignal wird der gesamte geöffnete Chart durchlaufen, und für jeden Bar der Wert berechnet (also so, als würde man step by step die History erst einfügen).

In MT dagegen wird beim ersten Aufruf des Indikators gleich der gesamte Chart hingeknallt. (Dafür braucht man dann IndicatorCounted um zu sehen was man eigentlich noch alles "aufholen" muss). D.h. aber auch, dass bei der ersten Berechnung (und jeder weiteren) der 0te Bar immer der "aktuellste" bleibt. Du verwendest oben richtig das "i" (kein sprechender Name für eine Variable ;) für den gerade zu setzenden Bar.

Aber in computeDailyRange (int i) ignorierst du das i vollkommen ;)

Im laufenden Betrieb wird der Indi tun was er soll, nur wenn du ihn auf die History anwendest nicht.

Zur Lösung des Problems: du musst dir überlegen wie du auf den "damaligen" Tagesbar kommst. Tipp: iBarShift

 

Weitere Anmerkungen:

// damit letzte Bar auf jeden Fall immer neu berechnet wird
  if (countedBars > 0) countedBars--;   
  
  int i = Bars - countedBars;
  // Hauptschleife. 
  // i wird am letzten Bar immer nur den Wert 0 haben.
  // Komischerweise ist der Wert allerdings immer 2,1,0 ...

AFAIK macht IndicatorCounted das decrement von alleine. Du kannst also direkt countedBars verwenden, i wird meist 1 sein (0 eher selten, da es ja bei einem Tick aufgerufen wird und damit der aktuelle Bar immer "neu" ist).

 

Was anderes: kann es sein, das du das LRD-System aus dem Traders Magazin implementieren willst? Der Indi würd dazu passen ;)

Geschrieben
  • Autor
Du verwendest oben richtig das "i" (kein sprechender Name für eine Variable ;) für den gerade zu setzenden Bar.

Aber in computeDailyRange (int i) ignorierst du das i vollkommen ;)

Im laufenden Betrieb wird der Indi tun was er soll, nur wenn du ihn auf die History anwendest nicht.

Zur Lösung des Problems: du musst dir überlegen wie du auf den "damaligen" Tagesbar kommst. Tipp: iBarShift

 

Das sollte doch mit der neuen Version behoben sein. Wie gesagt sind die Ergebnisse nun identisch mit denen

aus TradeSignal. iBarShift brauche ich da m.E. gar nicht. Oh ... hatte den Code nicht aktualisiert ...

 

int computeDailyRange (int i)
{            
  // Jeden Bar die bisherigen aktuellen lokalen Extrema finden
  if (High[i] > lokalesHoch) lokalesHoch = High[i];
  if (Low[i] < lokalesTief)  lokalesTief = Low[i];

  // Jeden Tag die Daily Range neu berechnen   
  if (TimeDayOfWeek(Time[i]) != TimeDayOfWeek(Time[i+1]))
  {
     dailyHigh         = iHigh (Symbol(), PERIOD_D1, 1);
     dailyLow          = iLow (Symbol(), PERIOD_D1, 1);
     eroeffnungskurs   = iOpen (Symbol(), PERIOD_D1, 0);
     dailyRange        = dailyHigh - dailyLow;
  
     // Re-Initialisierung
     lokalesHoch  = High[i];
     lokalesTief  = Low[i];  
  }

  // Jeden Bar die Rangewerte eintragen
  upperRange = lokalesTief + dailyRange;
  lowerRange = lokalesHoch - dailyRange; 
}

 

 

AFAIK macht IndicatorCounted das decrement von alleine. Du kannst also direkt countedBars verwenden, i wird meist 1 sein (0 eher selten, da es ja bei einem Tick aufgerufen wird und damit der aktuelle Bar immer "neu" ist).

 

Das wäre schön, dann spare ich eine Codezeile :-)

 

Was anderes: kann es sein, das du das LRD-System aus dem Traders Magazin implementieren willst? Der Indi würd dazu passen ;)

 

Das kann durchaus sein ... :pfue:

Geschrieben
Das sollte doch mit der neuen Version behoben sein. Wie gesagt sind die Ergebnisse nun identisch mit denen

aus TradeSignal. iBarShift brauche ich da m.E. gar nicht. Oh ... hatte den Code nicht aktualisiert ...

 

Hast du auch die vergangen Tagen (wo deutlich andere Dayranges waren) verglichen?

 

Für den aktuellen Tag passt es, aber die DailyRange ist bei dir immer noch nur die aktuellste. Für den EA dann egal, weil er den Indi eh immer am letzten Bars auswertet und damit stimmts, aber der Korrektheithalber solltest es noch allgemeingültig machen;)

 

      dailyHigh         = iHigh (Symbol(), PERIOD_D1, 1);
     dailyLow          = iLow (Symbol(), PERIOD_D1, 1);
     eroeffnungskurs   = iOpen (Symbol(), PERIOD_D1, 0);
     dailyRange        = dailyHigh - dailyLow;

Hier greifst du auch am i-ten Bar auf den gestrigen Tag zu, um das zu korrigieren brauchst du iBarShift ;)

 

Ich hoff ich schreib jetzt keinen Mist, aber ich glaub damit müsst es passen:

 datetime dayOpenTime= Time[i]- TimeSeconds(Time[i]) - 60*(TimeMinute(Time[i] - 60*(TimeHour(Time[i]))));
 int currentDayBar= iBarShift(NULL,PERIOD_D1,dayOpenTime);
[...]
   dailyHigh         = iHigh (Symbol(), PERIOD_D1, currentDayBar+1);
   dailyLow          = iLow (Symbol(), PERIOD_D1, currentDayBar+1);
   eroeffnungskurs   = iOpen (Symbol(), PERIOD_D1, currentDayBar);

Das kann durchaus sein ... :pfue:

 

*G* habs selber mal in der TradeSignal implementiert, hat garnicht so schlecht funktioniert. Wenn du hilfe brauchst meld dich einfach, ich kenn zumindest die Idee vom System ;)

 

btw: das mit TimeDayOfWeek funkt nur wenn du nicht genau 1 Woche Loch in den Daten hast. Was spricht gegen TimeDay(Time) oder iTime(NULL,PERIOD_D1,currentDayBar) ?

Geschrieben
  • Autor
Hast du auch die vergangen Tagen (wo deutlich andere Dayranges waren) verglichen?

 

Du hast recht, auf den ersten Blick sah alles gut aus, aber bspw. am 17.Februar 2009 ist die Range des Vortages nur 95 Punkte,

aber die Bänder noch 140 Punkte, also den Wert von gestern, dem 25.Februar 2009, weit entfernt.

 

DailyRang_FDAX_1702.jpg

 

Hm ... Ok, wenn ich es richtig verstanden habe, geht MT nicht jede Bar einzeln durch, sonder nur das Array mit allen Werten,

so dass ich mir über die Positionsvariable im Prinzip immer alle Werte aus den diversen Array (iTime, iHigh, ...) auslesen muss.

 

  datetime dayOpenTime= Time[i]- TimeSeconds(Time[i]) - 60*(TimeMinute(Time[i] - 60*(TimeHour(Time[i]))));

 

Den Code verstehe ich nicht ganz. Das Ergebniss sieht besser aus, aber ich weiß nicht was der Code genau macht, da dayOpenTime am selben Bar unterschiedliche Werte hat. Es könnte ja auch 24*(TimeHour(Time)) sein. Kannst Du das Codestück noch ausführlicher erklären ... danke.

 

 

*G* habs selber mal in der TradeSignal implementiert, hat garnicht so schlecht funktioniert. Wenn du hilfe brauchst meld dich einfach, ich kenn zumindest die Idee vom System ;)

 

Gerne, soll für mich ja zum Lernen sein. Wenn wir das Problem mit dem Shiften gelöst haben, dann sollte auch der EA funktionieren.

Den stelle ich dann hierrein und wir können ihn gerne anpassen, Programmierfehler aufdecken und Best-Practices besprechen.

Bisher liefert er ganz andere Ergebnisse als die Strategie aus TS, aber das kann an den Ranges liegen.

 

Was spricht gegen TimeDay(Time) oder iTime(NULL,PERIOD_D1,currentDayBar) ?

 

Gute Idee, wird gemacht ...

 

Ok, dann schaue ich mal wa sich über OpenTime herausfinden kann .... :pfue:

Bearbeitet von DarthTrader

Geschrieben
  • Autor
Für den aktuellen Tag passt es, aber die DailyRange ist bei dir immer noch nur die aktuellste. Für den EA dann egal, weil er den Indi eh immer am letzten Bars auswertet und damit stimmts, aber der Korrektheithalber solltest es noch allgemeingültig machen;)

 

Noch eine Frage, wie wird denn der Chart vom EA durchlaufen, wenn ich einen Backtest mache? Wenn ich den EA nur auf den

Chart lege, läuft er ja nur vom letzten Bar aus gesehen, aber muss ich ihn bei der oben angesprochenen Probelmatik anders programmieren,

wenn ich ihn backtesten möchte?

 

Ich greife momentan auf meinen Indikator, der jetzt zu funktionieren scheint, folgendermaßen zu:

 

void computeDailyRange ()
{   
  // Werte des eigenen Indikators berechnen
  upperRange = iCustom (Symbol(), 0, "DT_IND_DailyRange", 0, 0);
  lowerRange = iCustom (Symbol(), 0, "DT_IND_DailyRange", 1, 0);
  eroeffnungskurs  = iOpen (Symbol(), PERIOD_D1, 0);
  
  //if (TimeDayOfWeek(Time[0]) != TimeDayOfWeek(Time[1]))
 //    printDebug (upperRange, lowerRange);
 
}

 

Oder brauche ich hier auch den Shift beim Eröffnungskurs? Kann also so etwas nicht machen ...

 

if ((Close[0] > upperRange) &&
  (Close[1] > upperRange) ...

Bearbeitet von DarthTrader

Geschrieben
Hm ... Ok, wenn ich es richtig verstanden habe, geht MT nicht jede Bar einzeln durch, sonder nur das Array mit allen Werten,

so dass ich mir über die Positionsvariable im Prinzip immer alle Werte aus den diversen Array (iTime, iHigh, ...) auslesen muss.

Genau, wenn man etwas auf den Chart zieht (EA oder Indi) wird erst ab diesem Tick bei jedem Tick die Start-Funktion ausgeführt. Deswegen muss man bei Indis die auch auf der History angezeigt werden sollen, die History selber durchgehen (Damit man das nit immer tut hat man dann IndicatorCounted)

 

void computeDailyRange ()
{   
  // Werte des eigenen Indikators berechnen
  upperRange = iCustom (Symbol(), 0, "DT_IND_DailyRange", 0, 0);
  lowerRange = iCustom (Symbol(), 0, "DT_IND_DailyRange", 1, 0);
  eroeffnungskurs  = iOpen (Symbol(), PERIOD_D1, 0);
  
  //if (TimeDayOfWeek(Time[0]) != TimeDayOfWeek(Time[1]))
 //    printDebug (upperRange, lowerRange);
 
}

 

Oder brauche ich hier auch den Shift beim Eröffnungskurs?

Das müsste so passen. Shift brauchst du hier keinen, weil du ja den DailyRange vom aktuellen Bar willst, der EA arbeitet ja immer nur am aktuellen bar. (ich weiß, is beim umstieg von TradeSignal eine total andere denkweise ;)

Geschrieben

Wieso verwendest du eigentlich "High-Low" für die daily Range und nicht die ATR auf Tagesbasis?

 

Ich meine die Range des letzten Bars ist zwar ein unverfälschter Schätzer für die Range, aber die ATR hat sicher eine geringere Varianz.

So hast du nach wirklich großten Tagen sicher wenig bzw späte Signale, und nach kleinen Tagen, vermehr Fehlsignale oder?

Man könnte ja die ATR Periode als Parameter nehmen. ATR(1) wär dann defakto das gleiche wie High-Low oder?

 

nur so als Idee zur Verbesserung/Ausbau

Geschrieben
  • Autor
Wieso verwendest du eigentlich "High-Low" für die daily Range und nicht die ATR auf Tagesbasis?

 

Ich meine die Range des letzten Bars ist zwar ein unverfälschter Schätzer für die Range, aber die ATR hat sicher eine geringere Varianz.

So hast du nach wirklich großten Tagen sicher wenig bzw späte Signale, und nach kleinen Tagen, vermehr Fehlsignale oder?

Man könnte ja die ATR Periode als Parameter nehmen. ATR(1) wär dann defakto das gleiche wie High-Low oder?

 

nur so als Idee zur Verbesserung/Ausbau

 

Hatte ich auch schon überlegt, aber ist dann wieder in Vergessenheit geraten.

Werde es einbauen und mal testen ... Danke für die Erinnerung ...

Geschrieben
  • Autor

Die neue Version ermöglicht die Angabe, ob die Range auf ATR-Basis erfolgen soll.

Die Periode darf nur kurz gewählt werden 1-3 Tage vielleicht, sonst wird nur noch sehr wenig gehandelt.

Die langfristigen Ergebnisse bei TS ergeben nur ein geringes Verbesserungspotential, glätten

die Equity allerdings etwas ... seht selbst ...

 

DT_IND_DailyRange.mq4

Geschrieben
Die neue Version ermöglicht die Angabe, ob die Range auf ATR-Basis erfolgen soll.

Die Periode darf nur kurz gewählt werden 1-3 Tage vielleicht, sonst wird nur noch sehr wenig gehandelt.

Die langfristigen Ergebnisse bei TS ergeben nur ein geringes Verbesserungspotential, glätten

die Equity allerdings etwas ... seht selbst ...

 

Danke fürs Update, zwischen der alten Version und ATR(1) ist ja nur ein Unterschied, wenn der Markt übernacht gapt, und sich damit die TrueRange von der echten Range unterscheidet oder?

Geschrieben
  • Autor
Danke fürs Update, zwischen der alten Version und ATR(1) ist ja nur ein Unterschied, wenn der Markt übernacht gapt, und sich damit die TrueRange von der echten Range unterscheidet oder?

 

Genau, da dann das Close vom Vortag zieht. Die meisten Werte sind identisch. Man kann

es in der Datenansicht sehen, ich habe dort jetzt die RangeBreite mit aufgenommen.

Ich glaube am 3.3. waren es 90 Punkte beim Dax ohne ATR, mit 140 ....

Geschrieben
  • Autor

Ich muss nochmal nachhaken und zwar wegen folgendem Code:

 

datetime dayOpenTime= Time[i]- TimeSeconds(Time[i]) - 60*(TimeMinute(Time[i]) - 60*TimeHour(Time[i]));

 

Der iBarShift liefert den BarShift für den Bar, dessen Open am nähesten bei der angegeben datetime ist. Der Open eines Tagesbars ist um 00:00.

 

Kann das auch funktionieren, wenn der Tag um 8.00 oder um 8.15 anfängt?

Folgendes seltsame Phänomen habe ich, seitdem auch die ATR mit einbezogen wird.

 

Die Daten der ATR-Berechnung sind in TS und MT verschieden, ohne ATR sind sie fast identisch. Also habe ich die ATR selbst, mit eigenem Code berechnet und in beiden Systemen implementiert ... trotzdem verschieden ...

 

Dann habe ich die Daten aus TS vom FDAX exportiert und in MT importiert, funktioniert, nach einigen Konvertierungsproblemen :-) Leider öffnet der Markt bei TS erst um 8:15 und schließt dafür um 22:15, bei MT ist es 8:00 und 21:45. Nur bei diesen Daten, wird die ATR nicht jeden Tag neu berechnet, weshalb ich wieder auf den obigen Codeausschnitt zurückkomme. Funktioniert diese nur bei Bars ab 0:00 oder 8:00 oder sollte er auch bei 8:15 funktionieren?

 

Weiterhin habe ich doch, nochmal für mich zur Wissensprüfung die Barvariable, in diesem Fall "i", die beim ersten Durchlauf des Charts in einem Indikator jede Bar durchläuft. Als die Werte 300 bis 0 annimmt, wenn ich 300 Bars im Chart habe. Danach kann ich mit IndicatorCounted() nur noch die letzten Bars durchlaufen.

 

Wenn ich doch einen neuen Tag Abfrage mit

 

if (TimeDay[Time[i] != TimeDay[Time[i])

 

... dann habe ich innerhalb der if-Anweisung immer den ersten Bar des neuen Tages, oder?

Folglich müsste ich doch kein iBarShift machen, da ich den OpenKurs und in "i" die Barnummer

habe .....

 

In Funktionen die dann aufgerufen werden, wie iHigh(Null, 0, PERIOD_D1, i) greife ich doch dann

schon auf den korrekten Bar zu, oder .... ?

 

Hab irgendwie gerade wieder ein Verständnisproblem .... :wink:

Geschrieben
Die Daten der ATR-Berechnung sind in TS und MT verschieden, ohne ATR sind sie fast identisch. Also habe ich die ATR selbst, mit eigenem Code berechnet und in beiden Systemen implementiert ... trotzdem verschieden ...

Vorsicht, du hast in MT sehr wahrscheinlich den CFD auf den DAX oder? der hat andere Werte als der FDAX!

 

Dann habe ich die Daten aus TS vom FDAX exportiert und in MT importiert, funktioniert, nach einigen Konvertierungsproblemen :-) Leider öffnet der Markt bei TS erst um 8:15 und schließt dafür um 22:15, bei MT ist es 8:00 und 21:45.

Beide öffnen um 800 und schließen um 2200, nur bei TS hat der Bar von 08:00 - 08:15 die Uhrzeit 08:15, in MT hat er die Uhrzeit 08:00.

 

 

Nur bei diesen Daten, wird die ATR nicht jeden Tag neu berechnet, weshalb ich wieder auf den obigen Codeausschnitt zurückkomme. Funktioniert diese nur bei Bars ab 0:00 oder 8:00 oder sollte er auch bei 8:15 funktionieren?

Mach einfach mal in MT einen 15 Minuten Chart, und einen D1 Chart nebeneinander auf, dann noch das Datenfenster und schau dir die einzelnen Einträge an, das hilft ungemein ;) In D1 gibt es keine Eröffnungszeite, sondern nur Tage. Und ein Tag beginnt immer um 00:00, egal wann der Markt öffnet ;)

 

if (TimeDay[Time[i] != TimeDay[Time[i])

 

... dann habe ich innerhalb der if-Anweisung immer den ersten Bar des neuen Tages, oder?

Folglich müsste ich doch kein iBarShift machen, da ich den OpenKurs und in "i" die Barnummer

habe .....

Du hast den ersten Bar des neuen Tages ja, aber der i-te Bar im M15 Chart, ist nicht der i-te Bar im D1 Chart! Du brauchst hier eben den Bar im D1 Chart mit der "gleichen" Zeit wie der i-te Bar im M15 Chart, und dafür brauchst du iBarShift.

 

hth

Geschrieben
  • Autor
Vorsicht, du hast in MT sehr wahrscheinlich den CFD auf den DAX oder? der hat andere Werte als der FDAX!

 

Hm ... ich dachte der CFD wird meist auf den FDAX nachgebildet. Ok, auf der Internetseite steht, dass es sich um den DAX30 handelt, aber ich kann trotzdem von 8.00 -22.00 handeln, das kann ich doch nur beim FDAX ... komsich ...

 

Beide öffnen um 800 und schließen um 2200, nur bei TS hat der Bar von 08:00 - 08:15 die Uhrzeit 08:15, in MT hat er die Uhrzeit 08:00.

 

Ok, dann muss ich beim wegschreiben der Exportdaten noch die Zeit anpassen ...

 

Mach einfach mal in MT einen 15 Minuten Chart, und einen D1 Chart nebeneinander auf, dann noch das Datenfenster und schau dir die einzelnen Einträge an, das hilft ungemein;) In D1 gibt es keine Eröffnungszeite, sondern nur Tage. Und ein Tag beginnt immer um 00:00, egal wann der Markt öffnet;)

 

Mach ich ... Danke

 

Du hast den ersten Bar des neuen Tages ja, aber der i-te Bar im M15 Chart, ist nicht der i-te Bar im D1 Chart! Du brauchst hier eben den Bar im D1 Chart mit der "gleichen" Zeit wie der i-te Bar im M15 Chart, und dafür brauchst du iBarShift.

 

Klingt einleuchtend, jetzt bin ich wieder im Bilde. Ich hole mir den BarShift also nur für die D1-Periode, nicht für M15 ... also müsste der Code so funktionieren .... allerdings könnte ich doch auch mit

 

datetime some_time=D'2004.03.21 00:00';

 

die Funktion iBarShift aufrufen, oder? Dann konkateniere ich den String so wie ich es benötige und hole mir in M15 das Jahr + Monat + Tag. Das sollte doch auch gehen ... (nur für mein Verständnis) . ... ?

 

Sind nur noch die komischen Berechnungen für dei ATR-Werte bei MT-Daten und noch merkwürdigere Ergebnisse, bei den importierten Daten.

 

Beste Grüße

DT

 

BTW: Netter Link zum Verständnis MQL - Indikatoren

Bearbeitet von DarthTrader

Geschrieben
Klingt einleuchtend, jetzt bin ich wieder im Bilde. Ich hole mir den BarShift also nur für die D1-Periode, nicht für M15 ... also müsste der Code so funktionieren .... allerdings könnte ich doch auch mit

 

datetime some_time=D'2004.03.21 00:00';

 

die Funktion iBarShift aufrufen, oder? Dann konkateniere ich den String so wie ich es benötige und hole mir in M15 das Jahr + Monat + Tag. Das sollte doch auch gehen ... (nur für mein Verständnis) . ... ?

 

Theoretisch ja, aber ich glaube das datetime Konstanten (also zB D'2004....') nur hardcoded funktionieren. Du kannst glaub ich einen normalen string nicht zur laufzeit als datetime konstante verwenden. (glaub ich)

Geschrieben
  • Autor
Theoretisch ja, aber ich glaube das datetime Konstanten (also zB D'2004....') nur hardcoded funktionieren. Du kannst glaub ich einen normalen string nicht zur laufzeit als datetime konstante verwenden. (glaub ich)

 

Ich teste es mal, denn dann verstehe ich den Code wenigstens 100%ig ... :pfue:

 

Hast Du Dir denn die ATR-Variante mal angeschaut. Also bei TS sieht das richtig gut aus.

PF über 2, 250 Trades seit 03/2006 und ein CRV von mind. 2:1, dabei noch wenig DrawDown.

Leider sehen die Daten eben im MT anders aus, deswegen wollte ich die Daten von TS exportieren

und bei MT einspielen, dann müssten die Ergebnisse zumindest ähnlich sein ...

Geschrieben
Ich teste es mal, denn dann verstehe ich den Code wenigstens 100%ig ... :pfue:

 

Hast Du Dir denn die ATR-Variante mal angeschaut. Also bei TS sieht das richtig gut aus.

PF über 2, 250 Trades seit 03/2006 und ein CRV von mind. 2:1, dabei noch wenig DrawDown.

Leider sehen die Daten eben im MT anders aus, deswegen wollte ich die Daten von TS exportieren

und bei MT einspielen, dann müssten die Ergebnisse zumindest ähnlich sein ...

 

Ich hab inzwischen keine TS mehr, und in MT derzeit keine DAX Daten. Wär interessant wo die Unterschiede in der ATR-Berechnung von TS und MT sind. In der TS ist es soweit ich mich erinner einfach ein Average über die TrueRange oder? (also was es sein sollte...)

 

Man könnte sich in MT eine "eigene" ATR bauen... dann weiß man was passiert ;)

Wäre nicht schwer und eine schöne Übung zum Indikatorprogrammieren ;) Freiwillige?

Geschrieben
  • Autor
Man könnte sich in MT eine "eigene" ATR bauen... dann weiß man was passiert ;)

Wäre nicht schwer und eine schöne Übung zum Indikatorprogrammieren ;) Freiwillige?

 

Hab ich doch schon ... siehe vorheriges Post .... :-)

Leider keine Verbesserung. Ohne ATR kommt aber dieselbe Range raus ... deswegen das Daten-Experiment ...

Geschrieben
Hab ich doch schon ... siehe vorheriges Post .... :-)

Leider keine Verbesserung. Ohne ATR kommt aber dieselbe Range raus ... deswegen das Daten-Experiment ...

Hoppla :pfue:

Ok, dann schritt 2: ist die MT-ATR gleich wie die in MT geschriebene eigene ATR?

Geschrieben
  • Autor
Theoretisch ja, aber ich glaube das datetime Konstanten (also zB D'2004....') nur hardcoded funktionieren. Du kannst glaub ich einen normalen string nicht zur laufzeit als datetime konstante verwenden. (glaub ich)

 

Es geht, indem Du Dir einen String mit Uhrzeit 00:00 zusammenbaust und dann in ein TimeFormat konverteirst mit

 

StrToTime (dateAktuellerTag)

 

Ist für mich einfacher nachvollziehbar und ein Fehlergrund weniger

Geschrieben
  • Autor
Hoppla :pfue:

Ok, dann schritt 2: ist die MT-ATR gleich wie die in MT geschriebene eigene ATR?

 

Yo, das stimmt auffallend ...*stolz_guck* :pfue:

 

Folgendes, die Werte werden bei größerer ATR verschiedener. Das bedeutet, nehme ich eine ATR von 1 sind die RangeWerte bei TS und MT fast identisch,

nehme ich eine ATR von 20 sind die Werte relativ gesehen Ok, aber manchmal sind halt Unterschiede von bis zu 20-30 Punkten drinn.

 

Die Werte bei ActiveTrades beziehen sich auf den FDAX, bei TS ebenso. Komisch, dass die Daten unterschiedliche sind, aber da

kann man wohl nichts machen. Zumindest die ATR und die Shift-Berechnung funktionieren (sogar beide auf mehrere Arten). Es kann also nur an den Daten liegen.

 

Hier der neue Code, inkl. eigener ATR und Rangeausgabe im Chart. Leider wird die Textausgabe nicht immer, nicht an jedem

Tag aktualisiert, woran kann das liegen?

 

DT_IND_DailyRange.mq4

Bearbeitet von DarthTrader

Geschrieben

Ich hab gemeint, das du einen eigenen Indikator iMyATR schreibst, und dessen Werte mit iATR vergleichst... aber kommt eigentlich aufs selbe.

 

Bzgl der Daten: Hast du schon mal die Daten selber verglichen? Also einfach die letzten x Tagesbars zwischen TS und MT verglichen?

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

Account

Navigation

Suche

Suche

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.