Orrery Cycle Toolkit
- Bibliotheken
-
Syarief Azman Bin Rosli
Hallo und herzlich willkommen auf meinem offiziellen MQL5-Profil!
Ich bin Syarief Azman Bin Rosli, Entwickler algorithmischer Handelssysteme und Software-Ingenieur mit über zehn Jahren Erfahrung in der Entwicklung robuster automatisierter Handelslösungen für MetaTrader 5 und MetaTrader 4. - Version: 1.0
- Aktivierungen: 5
MQL5-Bibliothek, die den dominanten Marktzyklus jedes Symbols und Zeitrahmens misst: Periode in Bars, Phase, ein Sinus / Vorlauf-Sinus-Paar, dessen Kreuzungen Zykluswenden markieren, Zyklus- oder Trendmodus, Amplitude, Trendlinie, Spektrum, adaptive Indikatorlängen und eine Projektion des laufenden Zyklus. Sie liest nur die Kurshistorie: Sie handelt nie, zeichnet nichts und schreibt keine Dateien. Sie erhalten die kompilierte Orrery_Cycle_Toolkit.ex5; diese Seite ist die vollständige API-Referenz.
Schnellstart
- Kopieren Sie Orrery_Cycle_Toolkit.ex5 nach MQL5/Libraries (Datei > Dateiordner öffnen).
- Fügen Sie den #import-Block unten in Ihren EA, Indikator oder Ihr Skript ein.
- OnInit: h = OCT_Create(_Symbol, PERIOD_CURRENT, OCT_HOMODYNE, 8, 48, 2000).
- OnTick oder OnTimer: Liefert OCT_Update(h) true, lesen Sie OCT_Value(h, Feld, 1). Entscheiden Sie auf Shift 1, dem letzten geschlossenen Bar.
- OnDeinit: OCT_Release(h).
- Prüfung: Starten Sie das Beispiel unten auf EURUSD H1 im Strategietester; nach der Aufwärmphase (3 x max_period Bars) zeigt das Log die Werte zu jedem Bar.
Import-Deklaration (kopierfertig)
#import "Orrery_Cycle_Toolkit.ex5"
int OCT_Create(string symbol, ENUM_TIMEFRAMES timeframe, int method, int min_period, int max_period, int lookback);
bool OCT_SetParam(int handle, int param, double value);
bool OCT_Update(int handle);
void OCT_Release(int handle);
int OCT_Bars(int handle);
double OCT_Value(int handle, int field, int shift);
int OCT_TurnSignal(int handle, int shift);
int OCT_Spectrum(int handle, int shift, double &power[]);
int OCT_Project(int handle, int bars, double &path[]);
int OCT_AdaptiveLength(int handle, double fraction, int min_len, int max_len, int shift);
int OCT_SuperSmoother(const double &src[], double &dst[], double period);
int OCT_HighPass(const double &src[], double &dst[], double period);
int OCT_Roofing(const double &src[], double &dst[], int min_period, int max_period);
int OCT_CycleSeries(const double &src[], int method, int min_period, int max_period, int field, double &dst[]);
int OCT_DFTSpectrum(const double &src[], int index, int min_period, int max_period, double &power[]);
int OCT_LastError();
string OCT_ErrorText(int code);
#import
enum OCT_METHOD { OCT_HOMODYNE, OCT_AUTOCORR, OCT_DFT };
enum OCT_FIELD { OCT_PERIOD, OCT_RAW_PERIOD, OCT_PHASE, OCT_SINE, OCT_LEADSINE, OCT_FILTER, OCT_TRENDLINE,
OCT_AMPLITUDE, OCT_STRENGTH, OCT_MODE, OCT_PHASE_STEP };
enum OCT_PARAM { OCT_PARAM_PRICE, OCT_PARAM_TREND_BAND, OCT_PARAM_SMOOTHING, OCT_PARAM_AVGLEN }; Funktionsweise
- Roofing-Filter: Ein 2-poliger Hochpass bei max_period und ein Super Smoother bei min_period lassen nur Zyklen zwischen beiden Längen durch (Feld FILTER).
- Periode je Methode: 0 Homodyne discriminator (Hilbert-Transformation, am schnellsten), 1 Autocorrelation periodogram (am ruhigsten), 2 DFT spectrum. Methoden 1 und 2 nehmen den Schwerpunkt, in Frequenz, der Bänder mit mindestens halber Leistung. Dann Periode = s x Rohwert + (1 - s) x vorherige (s = Glättung, 0.33).
- Phase: der Filter korreliert mit einem Zyklus aus Sinus und Kosinus, korrigiert um den exakten Phasengang des Filters bei der gemessenen Periode. 0-360 Grad: 90 = Zyklushoch, 270 = Zyklustief. SINE = sin(Phase), LEADSINE = sin(Phase + 45).
- Wende: LEADSINE kreuzt SINE nach oben (+1, Zyklustief nahe) oder nach unten (-1, Zyklushoch nahe).
- Modus: Zyklus (0), wenn im letzten halben Zyklus eine Wende lag oder die Phase im Bar um 0.67-1.5 x 360/Periode vorrückte; sonst Trend: +1 auf oder -1 ab, je nach Kurs gegenüber TRENDLINE. Immer Trend, wenn der Kurs mindestens Trendband x AMPLITUDE von TRENDLINE entfernt ist.
- Aufwärmphase: die ersten 3 x max_period Bars liefern EMPTY_VALUE.
Felder
0 PERIOD: geglätteter dominanter Zyklus in Bars (min_period bis max_period). 1 RAW_PERIOD: ungeglättete Messung. 2 PHASE: Grad, 0-360. 3 SINE und 4 LEADSINE: -1 bis +1. 5 FILTER: Roofing-Filter, in Preiseinheiten. 6 TRENDLINE: Durchschnittskurs über einen Zyklus, 4-3-2-1 geglättet. 7 AMPLITUDE: RMS des Filters über einen Zyklus x 1.414, in Preiseinheiten. 8 STRENGTH: AMPLITUDE / mittlere Bar-Spanne über einen Zyklus. 9 MODE: 0 Zyklus, 1 Aufwärtstrend, -1 Abwärtstrend. 10 PHASE_STEP: Phasenvorlauf im Bar, -180 bis 180 Grad (360/Periode in einem sauberen Zyklus).
API-Referenz
Shift 0 = laufender Bar (ändert sich bis zum Schluss), 1 = letzter geschlossener Bar; geschlossene Bars ändern sich nie. Jeder Aufruf setzt OCT_LastError.
OCT_Create
Öffnet einen Tracker. symbol: "" oder NULL = Chartsymbol. timeframe: PERIOD_CURRENT erlaubt. method: 0-2. min_period: 4-50 (0 = 8). max_period: min_period + 4 bis 120 (0 = 48). lookback: gehaltene Bars, 0 = 2000, angehoben auf 4 x max_period (mindestens 200), höchstens 50000. Liefert Handle 0-31, oder -1 mit -1 (falscher Parameter, unbekanntes Symbol) bzw. -2 (32 Handles belegt). Lädt noch keine Daten.
int h = OCT_Create("XAUUSD", PERIOD_M15, OCT_AUTOCORR, 10, 40, 3000); OCT_SetParam
param 0 Preis: 0 Close, 1 Median, 2 Typisch, 3 Gewichtet (Standard 0). 1 Trendband, x AMPLITUDE: 0.1-10 (1.5). 2 Glättung: 0.05-1 (0.33; 1 = keine). 3 Mittelungslänge der Autokorrelation: 0-50 (3; 0 = Lag-Länge). Andere Werte: false und -1. Ein geänderter Wert baut den Tracker beim nächsten OCT_Update neu auf; bis dahin liefert OCT_Bars 0.
OCT_Update
Lädt beim ersten Aufruf die Historie, hängt danach neue Bars an und berechnet den laufenden Bar neu; bei jedem Tick oder Timer aufrufen. true, wenn Werte vorliegen; false mit -3 (falsches Handle), -4 NO DATA (Historie lädt noch: erneut aufrufen) oder -5 NOT ENOUGH BARS (unter 3 x max_period + 1 Bars). Lücken oder geänderte Historie lösen einen Neuaufbau aus. Über lookback + 500 Bars fallen die ältesten weg; kein Wert ändert sich.
OCT_Release
Gibt ein Handle frei; -1 gibt alle frei. In OnDeinit aufrufen.
OCT_Bars
Bars mit Werten (Shift 0 bis OCT_Bars - 1); 0 vor dem ersten erfolgreichen Update; -1 bei falschem Handle.
OCT_Value
Feldwert bei Shift. EMPTY_VALUE mit -1 (Feld außerhalb 0-10), -3 oder -6 (negativer Shift, Shift über OCT_Bars - 1, noch kein Update).
if(OCT_Value(h, OCT_MODE, 1) == 0 && OCT_TurnSignal(h, 1) == 1) Print("cycle low turn"); OCT_TurnSignal
+1, wenn LEADSINE in diesem Bar SINE nach oben kreuzte, -1 nach unten, 0 keine Wende oder ungültiger Shift. Wenden gelten für den Zyklusmodus: MODE prüfen. Bei Shift 0 kann eine Wende im Bar erscheinen und wieder verschwinden.
OCT_Spectrum
Füllt power[] mit max_period - min_period + 1 Werten (power[0] = min_period Bars), skaliert 0-1. Methoden 0 und 2: DFT des Filters über max_period Bars, stärkstes Band = 1. Methode 1: das geglättete Autokorrelations-Periodogramm relativ zu seinem langsam abklingenden Maximum. Liefert die Anzahl oder -1.
OCT_Project
Setzt den laufenden Zyklus ab Shift 0 für bars (1-500) fort: path[k] = TRENDLINE + Steigung x (k + 1) + AMPLITUDE x sin(PHASE + 360 x (k + 1) / PERIOD), mit Steigung = TRENDLINE-Änderung je Bar über das letzte Viertel des Zyklus; path[0] = nächster Bar. Liefert bars, oder -1 mit -1 (bars außerhalb) bzw. -5 (nicht bereit). Eine geometrische Fortsetzung, keine Prognose.
OCT_AdaptiveLength
round(PERIOD x fraction), begrenzt auf min_len..max_len; fraction über 0 bis 10, 1 <= min_len <= max_len. -1 bei Fehler. RSI über einen halben Zyklus:
int len = OCT_AdaptiveLength(h, 0.5, 2, 100, 1);
Array-Funktionen
Kein Handle, nichts bleibt zwischen Aufrufen gespeichert. src[] darf chronologisch oder als Serie indiziert sein; dst[i] gehört zu src[i] und dst behält seine eigene Indizierung. Ein dynamisches dst wird angepasst; ein Indikatorpuffer braucht die Größe von src. Liefern die Anzahl der Werte, oder -1 mit -1 (falscher Parameter, dst zu klein) bzw. -5 (leer oder zu kurz). Feste Einstellungen: Glättung 0.33, Mittelung 3, Trendband 1.5; STRENGTH nutzt die mittlere absolute Änderung von src.
- OCT_SuperSmoother: 2-poliger Super Smoother, Periode 2-1000; die ersten 2 Werte kopieren src.
- OCT_HighPass: 2-poliger Hochpass, Periode 2-1000; die ersten 2 Werte sind 0.
- OCT_Roofing: Hochpass bei max_period, dann Super Smoother bei min_period (gleich FILTER).
- OCT_CycleSeries: die ganze Engine auf src; dst = Feld 0-10 je Bar, EMPTY_VALUE in der Aufwärmphase. Benötigt 3 x max_period + 1 Werte.
- OCT_DFTSpectrum: Leistung bei src[index] (Indizierung von src), skaliert wie OCT_Spectrum; benötigt max_period - 1 ältere Werte. Liefert max_period - min_period + 1, oder -1 mit -6 (Index außerhalb) bzw. -5.
double c[], per[]; ArraySetAsSeries(c, true); CopyClose(_Symbol, _Period, 0, 500, c); OCT_CycleSeries(c, OCT_HOMODYNE, 8, 48, OCT_PERIOD, per); // per[0] = forming bar
OCT_LastError und OCT_ErrorText
Code des letzten Aufrufs und sein Text in Großbuchstaben: 0 OK, -1 INVALID PARAMETER, -2 NO FREE HANDLE, -3 INVALID HANDLE, -4 NO DATA, -5 NOT ENOUGH BARS, -6 SHIFT OUT OF RANGE, sonst UNKNOWN.
Lauffähiges Integrationsbeispiel
Ein Expert Advisor: Fügen Sie zuerst den Import-Block und die drei enum-Zeilen von oben ein.
int h = -1;
datetime last = 0;
int OnInit()
{
h = OCT_Create(_Symbol, PERIOD_CURRENT, OCT_HOMODYNE, 8, 48, 2000);
return(h < 0 ? INIT_FAILED : INIT_SUCCEEDED);
}
void OnDeinit(const int reason) { OCT_Release(h); }
void OnTick()
{
datetime bar = iTime(_Symbol, _Period, 0);
if(bar == last)
return;
if(!OCT_Update(h)) { Print("orrery: ", OCT_ErrorText(OCT_LastError())); return; }
last = bar;
PrintFormat("period %.1f phase %.0f mode %.0f turn %d rsi length %d", OCT_Value(h, OCT_PERIOD, 1),
OCT_Value(h, OCT_PHASE, 1), OCT_Value(h, OCT_MODE, 1), OCT_TurnSignal(h, 1), OCT_AdaptiveLength(h, 0.5, 2, 100, 1));
} Architektur und Hinweise
- Jedes Handle hält eigene Historie und Ergebnisse; jedes importierende Programm hat eigene 32 Handles.
- Ein Tick berechnet nur den laufenden Bar neu (in Tests weit unter 1 ms); das erste Update von 2,000 Bars dauert je nach Methode und max_period wenige bis etwa 100 ms.
- MetaTrader 5, jedes Symbol und jeder Zeitrahmen; EAs, Indikatoren, Skripte. Sicher im Strategietester, bei der Optimierung und im MQL5 Cloud Network: keine DLLs, Dateien, Webanfragen, Chartobjekte, Timer oder globalen Variablen. OCT_Create fügt das Symbol der Marktübersicht hinzu, damit seine Historie lädt.
- Grenzen: 32 Handles je Programm, Perioden 4-120 Bars, Projektion bis 500 Bars, lookback bis 50000 Bars.
- Typische Setups. Adaptive Längen: Methode 0, Perioden 8-48, RSI-Länge OCT_AdaptiveLength(h, 0.5, 2, 100, 1). Zyklusschwünge: Methode 1, Perioden 10-40, auf OCT_TurnSignal(h, 1) nur reagieren, wenn MODE bei Shift 1 gleich 0 ist. Trendfilter: MODE ungleich 0 = Trend; Trendband 2.5 für weniger Trendbars. Indikatoren: OCT_CycleSeries in OnCalculate.
- Screenshots und Video zeigen einen Demo-EA auf Basis dieser Bibliothek; er ist nicht Teil des Kaufs.
Risikohinweis
Zykluswerte beschreiben vergangene Kurse. Märkte wechseln ihr Regime, eine Projektion ist keine Prognose und kein Wert garantiert Gewinn. Testen Sie zuerst auf einem Demokonto.
