Hallo Trader-Kollegen!
Wie erkennt man eine neue Kerze?
Es ist einfacher als man denkt, vor allem wenn du neue Kerzen im aktuellen Zeitrahmen erkennen möchtest.
void start(){ static datetime tmp; if (tmp != Time[0]) { tmp = Time[0]; // Hier deinen Code einfügen } }
Aber wie sieht es mit neuen Kerzen in anderen Zeitrahmen aus? Das ist nicht zu schwer, hat jedoch einige Einschränkungen:
MetaTrader 4 unterstützt kein onBar-Ereignis. Du kannst jedoch die kommenden Zeitpunkte in ein Array speichern und dieses bei jedem Tick überprüfen. Wenn die richtige Zeit erreicht ist, führst du das neue Kerzenereignis aus.
Das bedeutet, wenn du beispielsweise einen Backtest im M5-Zeitrahmen machst, kannst du die M6-, M7- und sogar D1-Ereignisse erfassen.
Warum kannst du nur aufwärts gerichtete Trends erkennen? Die Antwort ist eine Frage: Wie generiert MetaTrader Tickdaten? A1, A2, A3,...
Bis zum D1-Zeitrahmen wird es schwieriger, denn die Woche beginnt beispielsweise am Sonntag um 20:45 (brokerabhängig), und der Monatsanfang kann mitten in der Woche starten... usw.
Ich denke, diese Informationen sind nicht zu relevant, also lasse ich sie weg...
Es gibt ein Thema zu dieser Frage, aber ich glaube, viele Leute lesen die Artikel und Foren nicht, also habe ich diesen Code veröffentlicht.
Einige Erklärungen:
Im init-Funktion füllst du das Zeit-Array mit den Startzeiten:
curIndex = utils.periodToPeriodIndex(Period()); times[curIndex] = Time[0]; for(int i=curIndex+1; i<MAX; i++) times[i] = times[curIndex] - MathMod(times[curIndex], utils.periodIndexToPeriod(i) * 60);
In der start-Funktion überprüfst du, ob genügend Zeit vergangen ist, und führst dann das Ereignis aus:
if (times[curIndex] != Time[0]) { times[curIndex] = Time[0]; onBar(Period()); for(int i=curIndex+1; i<MAX; i++) { int period = utils.periodIndexToPeriod(i), seconds = period * 60, time0 = times[curIndex] - MathMod(times[curIndex], seconds); if (times[i] != time0) { times[i] = time0; onBar(period); } } }
Schreibe deinen Code in:
void onTick() {
}
und
void onBar(int period) { }
Das war's, Leute!
Update 1.1: Danke an WHRoeder für den klaren Code.
Kommentar 0