Orrery Cycle Toolkit
- Kütüphaneler
- Sürüm: 1.0
- Etkinleştirmeler: 5
Her sembol ve zaman diliminde baskın piyasa döngüsünü ölçen bir MQL5 kütüphanesi: bar cinsinden periyot, faz, kesişimleri döngü dönüşlerini işaretleyen bir sinüs / öncü sinüs çifti, döngü veya trend modu, genlik, trend çizgisi, spektrum, uyarlanabilir gösterge uzunlukları ve mevcut döngünün projeksiyonu. Yalnızca fiyat geçmişini okur: asla işlem açmaz, çizim yapmaz ve dosya yazmaz. Derlenmiş Orrery_Cycle_Toolkit.ex5 dosyasını alırsınız; bu sayfa eksiksiz API başvurusudur.
Hızlı başlangıç
- Orrery_Cycle_Toolkit.ex5 dosyasını MQL5/Libraries klasörüne kopyalayın (Dosya > Veri klasörünü aç).
- Aşağıdaki #import bloğunu EA, gösterge veya script dosyanıza yapıştırın.
- OnInit: h = OCT_Create(_Symbol, PERIOD_CURRENT, OCT_HOMODYNE, 8, 48, 2000).
- OnTick veya OnTimer: OCT_Update(h) true dönerse OCT_Value(h, alan, 1) okuyun. Kararı son kapanan bar olan shift 1 üzerinde verin.
- OnDeinit: OCT_Release(h).
- Doğrulama: aşağıdaki örneği Strateji Test Cihazında EURUSD H1 üzerinde çalıştırın; ısınmadan (3 x max_period bar) sonra günlük her barda değerleri yazar.
İçe aktarma bildirimi (kopyalamaya hazır)
#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 }; Nasıl çalışır
- Roofing filtresi: max_period üzerinde 2 kutuplu yüksek geçiren ve min_period üzerinde super smoother, yalnızca iki uzunluk arasındaki döngüleri bırakır (FILTER alanı).
- Yönteme göre periyot: 0 Homodyne discriminator (Hilbert dönüşümü, en hızlı), 1 Autocorrelation periodogram (en kararlı), 2 DFT spectrum. Yöntem 1 ve 2, gücü en az yarı olan bantların frekanstaki ağırlık merkezini kullanır. Ardından periyot = s x ham + (1 - s) x önceki (s = yumuşatma, 0.33).
- Faz: filtrenin bir döngülük sinüs ve kosinüsle korelasyonu, ölçülen periyotta filtrenin tam faz yanıtına göre düzeltilir. 0-360 derece: 90 = döngü tepesi, 270 = dip. SINE = sin(faz), LEADSINE = sin(faz + 45).
- Dönüş: LEADSINE, SINE'ı yukarı keser (+1, döngü dibi yakın) veya aşağı keser (-1, tepe yakın).
- Mod: son yarım döngüde bir dönüş olduysa veya faz barda 0.67-1.5 x 360/periyot ilerlediyse döngü (0); aksi halde trend: fiyatın TRENDLINE karşısındaki konumuna göre +1 yukarı veya -1 aşağı. Fiyat TRENDLINE'dan en az trend bandı x AMPLITUDE uzaktaysa her zaman trend.
- Isınma: ilk 3 x max_period bar EMPTY_VALUE döndürür.
Alanlar
0 PERIOD: bar cinsinden yumuşatılmış baskın döngü (min_period ile max_period arası). 1 RAW_PERIOD: yumuşatılmamış ölçüm. 2 PHASE: derece, 0-360. 3 SINE ve 4 LEADSINE: -1 ile +1 arası. 5 FILTER: roofing filtresi, fiyat biriminde. 6 TRENDLINE: bir döngü boyunca ortalama fiyat, 4-3-2-1 yumuşatılmış. 7 AMPLITUDE: bir döngüde filtrenin RMS değeri x 1.414, fiyat biriminde. 8 STRENGTH: AMPLITUDE / bir döngüdeki ortalama bar aralığı. 9 MODE: 0 döngü, 1 yukarı trend, -1 aşağı trend. 10 PHASE_STEP: barda faz ilerlemesi, -180 ile 180 derece arası (temiz bir döngüde 360/periyot).
API başvurusu
Shift 0 = oluşan bar (kapanana kadar değişir), 1 = son kapanan bar; kapanmış barlar asla değişmez. Her çağrı OCT_LastError değerini günceller.
OCT_Create
Bir izleyici açar. symbol: "" veya NULL = grafik sembolü. timeframe: PERIOD_CURRENT kabul edilir. method: 0-2. min_period: 4-50 (0 = 8). max_period: min_period + 4 ile 120 arası (0 = 48). lookback: tutulan bar sayısı, 0 = 2000, 4 x max_period değerine yükseltilir (en az 200), en fazla 50000. 0-31 arası bir handle döndürür, ya da -1 ile birlikte -1 (hatalı parametre, bilinmeyen sembol) veya -2 (32 handle dolu). Henüz veri yüklemez.
int h = OCT_Create("XAUUSD", PERIOD_M15, OCT_AUTOCORR, 10, 40, 3000); OCT_SetParam
param 0 fiyat: 0 kapanış, 1 medyan, 2 tipik, 3 ağırlıklı (varsayılan 0). 1 trend bandı, x AMPLITUDE: 0.1-10 (1.5). 2 yumuşatma: 0.05-1 (0.33; 1 = yok). 3 otokorelasyon ortalama uzunluğu: 0-50 (3; 0 = gecikme uzunluğu). Diğer değerler: false ve -1. Değişen bir değer izleyiciyi bir sonraki OCT_Update çağrısında yeniden kurar; o zamana kadar OCT_Bars 0 döndürür.
OCT_Update
İlk çağrıda geçmişi yükler, sonra yeni barları ekler ve oluşan barı yeniden hesaplar; her tikte veya zamanlayıcıda çağırın. Değer varsa true; yoksa false ile -3 (hatalı handle), -4 NO DATA (geçmiş hâlâ yükleniyor: tekrar çağırın) veya -5 NOT ENOUGH BARS (3 x max_period + 1 bardan az). Boşluklar veya düzenlenmiş geçmiş yeniden kurulum başlatır. lookback + 500 barın üzerinde en eski barlar atılır; hiçbir değer değişmez.
OCT_Release
Bir handle serbest bırakır; -1 hepsini bırakır. OnDeinit içinde çağırın.
OCT_Bars
Değeri olan bar sayısı (shift 0 ile OCT_Bars - 1 arası); ilk başarılı güncellemeden önce 0; hatalı handle için -1.
OCT_Value
shift konumundaki alan değeri. EMPTY_VALUE ile -1 (alan 0-10 dışında), -3 veya -6 (negatif shift, OCT_Bars - 1 değerinden büyük shift, henüz güncelleme yok).
if(OCT_Value(h, OCT_MODE, 1) == 0 && OCT_TurnSignal(h, 1) == 1) Print("cycle low turn"); OCT_TurnSignal
O barda LEADSINE, SINE'ı yukarı kestiyse +1, aşağı kestiyse -1, dönüş yoksa veya shift geçersizse 0. Dönüşler döngü modu içindir: MODE değerini kontrol edin. shift 0 üzerinde bir dönüş bar içinde görünüp kaybolabilir.
OCT_Spectrum
power[] dizisini max_period - min_period + 1 değerle doldurur (power[0] = min_period bar), 0-1 ölçeğinde. Yöntem 0 ve 2: filtrenin max_period bar üzerindeki DFT'si, en güçlü bant = 1. Yöntem 1: yavaşça sönen maksimumuna göre yumuşatılmış otokorelasyon periyodogramı. Değer sayısını veya -1 döndürür.
OCT_Project
Mevcut döngüyü shift 0'dan bars bar boyunca (1-500) sürdürür: path[k] = TRENDLINE + eğim x (k + 1) + AMPLITUDE x sin(PHASE + 360 x (k + 1) / PERIOD); eğim = son çeyrek döngüde bar başına TRENDLINE değişimi; path[0] = sonraki bar. bars ya da -1 ile birlikte -1 (bars aralık dışı) veya -5 (hazır değil) döndürür. Bir tahmin değil, geometrik bir devamdır.
OCT_AdaptiveLength
round(PERIOD x fraction), min_len..max_len ile sınırlanır; fraction 0'dan büyük ve en fazla 10, 1 <= min_len <= max_len. Hatada -1. Yarım döngülük RSI:
int len = OCT_AdaptiveLength(h, 0.5, 2, 100, 1);
Dizi fonksiyonları
Handle yok, çağrılar arasında hiçbir şey saklanmaz. src[] kronolojik veya seri olarak indekslenmiş olabilir; dst[i], src[i] ile eşleşir ve dst kendi indekslemesini korur. Dinamik bir dst yeniden boyutlanır; bir gösterge tamponunun boyutu src ile aynı olmalıdır. Değer sayısını ya da -1 ile birlikte -1 (hatalı parametre, dst çok küçük) veya -5 (boş ya da çok kısa) döndürür. Sabit ayarlar: yumuşatma 0.33, ortalama 3, trend bandı 1.5; STRENGTH, src'nin ortalama mutlak değişimini kullanır.
- OCT_SuperSmoother: 2 kutuplu super smoother, periyot 2-1000; ilk 2 değer src'yi kopyalar.
- OCT_HighPass: 2 kutuplu yüksek geçiren, periyot 2-1000; ilk 2 değer 0'dır.
- OCT_Roofing: max_period üzerinde yüksek geçiren, ardından min_period üzerinde super smoother (FILTER ile aynı).
- OCT_CycleSeries: src üzerinde motorun tamamı; dst = her bar için 0-10 alanı, ısınmada EMPTY_VALUE. 3 x max_period + 1 değer gerekir.
- OCT_DFTSpectrum: src[index] konumundaki güç (src'nin kendi indekslemesi), OCT_Spectrum gibi ölçeklenir; max_period - 1 eski değer gerekir. max_period - min_period + 1 ya da -1 ile birlikte -6 (indeks aralık dışı) veya -5 döndürür.
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 ve OCT_ErrorText
Son çağrının kodu ve büyük harfli metni: 0 OK, -1 INVALID PARAMETER, -2 NO FREE HANDLE, -3 INVALID HANDLE, -4 NO DATA, -5 NOT ENOUGH BARS, -6 SHIFT OUT OF RANGE, aksi halde UNKNOWN.
Çalışan entegrasyon örneği
Bir Expert Advisor: önce yukarıdaki içe aktarma bloğunu ve üç enum satırını yapıştırın.
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));
} Mimari ve notlar
- Her handle kendi geçmişini ve sonuçlarını tutar; kütüphaneyi içe aktaran her programın kendi 32 handle'ı vardır.
- Bir tik yalnızca oluşan barı yeniden hesaplar (testlerde 1 ms'nin çok altında); 2,000 barlık ilk güncelleme yönteme ve max_period değerine göre birkaç ms ile yaklaşık 100 ms sürer.
- MetaTrader 5, her sembol ve zaman dilimi; EA'lar, göstergeler, scriptler. Strateji Test Cihazında, optimizasyonda ve MQL5 Cloud Network'te güvenlidir: DLL, dosya, web isteği, grafik nesnesi, zamanlayıcı veya global değişken yok. OCT_Create, geçmişini yüklemek için sembolü Piyasa Gözlemi'ne ekler.
- Sınırlar: program başına 32 handle, 4-120 bar periyot, en fazla 500 bar projeksiyon, en fazla 50000 bar lookback.
- Tipik kurulumlar. Uyarlanabilir uzunluklar: yöntem 0, periyot 8-48, RSI uzunluğu OCT_AdaptiveLength(h, 0.5, 2, 100, 1). Döngü salınımları: yöntem 1, periyot 10-40, OCT_TurnSignal(h, 1) sinyaline yalnızca shift 1'de MODE 0 iken uyun. Trend filtresi: MODE 0 değilse trend; daha az trend barı için trend bandı 2.5. Göstergeler: OnCalculate içinde OCT_CycleSeries.
- Ekran görüntüleri ve video bu kütüphane üzerine kurulmuş bir tanıtım EA'sını gösterir; satın alıma dahil değildir.
Risk uyarısı
Döngü değerleri geçmiş fiyatları tanımlar. Piyasalar rejim değiştirir, projeksiyon bir tahmin değildir ve hiçbir değer kâr garantisi vermez. Önce bir demo hesapta test edin.
