Orrery Cycle Toolkit
- 라이브러리
- 버전: 1.0
- 활성화: 5
모든 심볼과 타임프레임의 지배적 시장 사이클을 측정하는 MQL5 라이브러리입니다: 바 단위 주기, 위상, 교차가 사이클 전환을 표시하는 사인 / 선행 사인 쌍, 사이클 또는 추세 모드, 진폭, 추세선, 스펙트럼, 지표용 적응형 길이, 현재 사이클의 투영을 제공합니다. 가격 기록만 읽으며 거래, 그리기, 파일 쓰기를 절대 하지 않습니다. 컴파일된 Orrery_Cycle_Toolkit.ex5 를 받게 되며, 이 페이지가 API 전체 레퍼런스입니다.
빠른 시작
- Orrery_Cycle_Toolkit.ex5 를 MQL5/Libraries 에 복사합니다(파일 > 데이터 폴더 열기).
- 아래 #import 블록을 EA, 지표 또는 스크립트에 붙여 넣습니다.
- OnInit: h = OCT_Create(_Symbol, PERIOD_CURRENT, OCT_HOMODYNE, 8, 48, 2000).
- OnTick 또는 OnTimer: OCT_Update(h) 가 true 를 반환하면 OCT_Value(h, 필드, 1) 를 읽습니다. 판단은 마지막 마감 바인 shift 1 에서 하십시오.
- OnDeinit: OCT_Release(h).
- 확인: 아래 예제를 전략 테스터에서 EURUSD H1 로 실행합니다. 워밍업(3 x max_period 바) 후 로그가 매 바마다 값을 출력합니다.
가져오기 선언 (복사해서 바로 사용)
#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 }; 작동 방식
- 루핑 필터: max_period 의 2극 하이패스와 min_period 의 super smoother 가 두 길이 사이의 사이클만 남깁니다(필드 FILTER).
- 방법별 주기: 0 Homodyne discriminator(힐베르트 변환, 가장 빠름), 1 Autocorrelation periodogram(가장 안정적), 2 DFT spectrum. 방법 1 과 2 는 파워가 절반 이상인 대역의 주파수상 무게중심을 사용합니다. 이어서 주기 = s x 원시값 + (1 - s) x 이전값(s = 스무딩, 0.33).
- 위상: 필터를 한 사이클의 사인 및 코사인과 상관시키고, 측정된 주기에서 필터의 정확한 위상 응답으로 보정합니다. 0-360 도: 90 = 사이클 고점, 270 = 저점. SINE = sin(위상), LEADSINE = sin(위상 + 45).
- 전환: LEADSINE 이 SINE 을 상향 교차(+1, 사이클 저점 임박) 또는 하향 교차(-1, 고점 임박).
- 모드: 최근 반 사이클 안에 전환이 있었거나 해당 바에서 위상이 0.67-1.5 x 360/주기 진행했으면 사이클(0), 아니면 추세: TRENDLINE 대비 가격 위치에 따라 +1 상승 또는 -1 하락. 가격이 TRENDLINE 에서 추세 밴드 x AMPLITUDE 이상 떨어져 있으면 항상 추세.
- 워밍업: 처음 3 x max_period 바는 EMPTY_VALUE 를 반환합니다.
필드
0 PERIOD: 스무딩한 지배 사이클, 바 단위(min_period ~ max_period). 1 RAW_PERIOD: 스무딩 전 측정값. 2 PHASE: 도, 0-360. 3 SINE 과 4 LEADSINE: -1 ~ +1. 5 FILTER: 루핑 필터, 가격 단위. 6 TRENDLINE: 한 사이클의 평균 가격을 4-3-2-1 로 스무딩. 7 AMPLITUDE: 한 사이클 동안 필터의 RMS x 1.414, 가격 단위. 8 STRENGTH: AMPLITUDE / 한 사이클의 평균 바 범위. 9 MODE: 0 사이클, 1 상승 추세, -1 하락 추세. 10 PHASE_STEP: 해당 바의 위상 진행, -180 ~ 180 도(깨끗한 사이클에서는 360/주기).
API 레퍼런스
Shift 0 = 형성 중인 바(마감까지 변함), 1 = 마지막 마감 바. 마감된 바의 값은 절대 바뀌지 않습니다. 모든 호출은 OCT_LastError 를 설정합니다.
OCT_Create
트래커를 엽니다. symbol: "" 또는 NULL = 차트 심볼. timeframe: PERIOD_CURRENT 허용. method: 0-2. min_period: 4-50(0 = 8). max_period: min_period + 4 ~ 120(0 = 48). lookback: 보관할 바 수, 0 = 2000, 4 x max_period(최소 200)까지 올리며 최대 50000. 핸들 0-31 을 반환하거나, -1 을 반환하고 -1(잘못된 매개변수, 알 수 없는 심볼) 또는 -2(32 개 핸들 모두 사용 중)를 설정합니다. 아직 데이터를 불러오지 않습니다.
int h = OCT_Create("XAUUSD", PERIOD_M15, OCT_AUTOCORR, 10, 40, 3000); OCT_SetParam
param 0 가격: 0 종가, 1 중간가, 2 대표가, 3 가중가(기본 0). 1 추세 밴드, x AMPLITUDE: 0.1-10(1.5). 2 스무딩: 0.05-1(0.33, 1 = 없음). 3 자기상관 평균 길이: 0-50(3, 0 = 래그 길이). 다른 값: false 와 -1. 값이 바뀌면 다음 OCT_Update 에서 트래커를 재구성하며, 그때까지 OCT_Bars 는 0 을 반환합니다.
OCT_Update
첫 호출에서 기록을 불러오고, 이후 새 바를 추가하고 형성 중인 바를 다시 계산합니다. 매 틱 또는 타이머에서 호출하십시오. 값이 있으면 true, 없으면 false 와 함께 -3(잘못된 핸들), -4 NO DATA(기록 로딩 중: 다시 호출) 또는 -5 NOT ENOUGH BARS(3 x max_period + 1 바 미만). 기록의 공백이나 수정은 재구성을 일으킵니다. lookback + 500 바를 넘으면 가장 오래된 바를 삭제하며 값은 바뀌지 않습니다.
OCT_Release
핸들 하나를 해제합니다. -1 은 모두 해제합니다. OnDeinit 에서 호출하십시오.
OCT_Bars
값이 있는 바 수(shift 0 ~ OCT_Bars - 1). 첫 업데이트 성공 전에는 0, 잘못된 핸들이면 -1.
OCT_Value
shift 위치의 필드 값. EMPTY_VALUE 를 반환하고 -1(필드가 0-10 범위 밖), -3 또는 -6(음수 shift, OCT_Bars - 1 을 넘는 shift, 아직 업데이트 없음)을 설정합니다.
if(OCT_Value(h, OCT_MODE, 1) == 0 && OCT_TurnSignal(h, 1) == 1) Print("cycle low turn"); OCT_TurnSignal
해당 바에서 LEADSINE 이 SINE 을 상향 교차하면 +1, 하향 교차하면 -1, 전환이 없거나 shift 가 잘못되면 0. 전환은 사이클 모드용입니다: MODE 를 확인하십시오. shift 0 의 전환은 바 도중에 나타났다 사라질 수 있습니다.
OCT_Spectrum
power[] 에 max_period - min_period + 1 개의 값을 채웁니다(power[0] = min_period 바), 0-1 스케일. 방법 0 과 2: max_period 바에 걸친 필터의 DFT, 가장 강한 대역 = 1. 방법 1: 천천히 감쇠하는 최댓값에 대한 스무딩된 자기상관 피리어도그램. 개수 또는 -1 을 반환합니다.
OCT_Project
shift 0 부터 bars 바(1-500) 동안 현재 사이클을 연장합니다: path[k] = TRENDLINE + 기울기 x (k + 1) + AMPLITUDE x sin(PHASE + 360 x (k + 1) / PERIOD), 기울기 = 최근 4분의 1 사이클 동안 바당 TRENDLINE 변화, path[0] = 다음 바. bars 를 반환하거나, -1 을 반환하고 -1(bars 범위 밖) 또는 -5(준비 안 됨)를 설정합니다. 예측이 아닌 기하학적 연장입니다.
OCT_AdaptiveLength
round(PERIOD x fraction) 을 min_len..max_len 으로 제한합니다. fraction 은 0 초과 10 이하, 1 <= min_len <= max_len. 오류 시 -1. 반 사이클 RSI:
int len = OCT_AdaptiveLength(h, 0.5, 2, 100, 1);
배열 함수
핸들이 없고 호출 사이에 아무것도 보관하지 않습니다. src[] 는 시간순이든 시계열 인덱스든 됩니다. dst[i] 는 src[i] 에 대응하며 dst 는 자체 인덱싱을 유지합니다. 동적 dst 는 크기가 조정되고, 지표 버퍼는 src 와 크기가 같아야 합니다. 값의 개수를 반환하거나, -1 을 반환하고 -1(잘못된 매개변수, dst 가 너무 작음) 또는 -5(비었거나 너무 짧음)를 설정합니다. 고정 설정: 스무딩 0.33, 평균 3, 추세 밴드 1.5. STRENGTH 는 src 의 평균 절대 변화를 사용합니다.
- OCT_SuperSmoother: 2극 super smoother, 주기 2-1000. 처음 2 개 값은 src 를 복사.
- OCT_HighPass: 2극 하이패스, 주기 2-1000. 처음 2 개 값은 0.
- OCT_Roofing: max_period 하이패스 후 min_period super smoother(FILTER 와 동일).
- OCT_CycleSeries: src 에 엔진 전체를 실행. dst = 각 바의 필드 0-10, 워밍업 중에는 EMPTY_VALUE. 3 x max_period + 1 개의 값이 필요.
- OCT_DFTSpectrum: src[index] 의 파워(src 자체 인덱싱), OCT_Spectrum 과 같은 스케일. 그 이전 max_period - 1 개 값이 필요. max_period - min_period + 1 을 반환하거나, -1 을 반환하고 -6(인덱스 범위 밖) 또는 -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 와 OCT_ErrorText
마지막 호출의 코드와 대문자 텍스트: 0 OK, -1 INVALID PARAMETER, -2 NO FREE HANDLE, -3 INVALID HANDLE, -4 NO DATA, -5 NOT ENOUGH BARS, -6 SHIFT OUT OF RANGE, 그 외는 UNKNOWN.
동작하는 통합 예제
Expert Advisor 입니다. 먼저 위의 가져오기 블록과 enum 세 줄을 붙여 넣으십시오.
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));
} 아키텍처와 참고 사항
- 각 핸들은 자체 기록과 결과를 보관합니다. 라이브러리를 가져오는 각 프로그램은 자체 32 개 핸들을 가집니다.
- 한 틱은 형성 중인 바만 다시 계산합니다(테스트에서 1 밀리초를 크게 밑돎). 2,000 바의 첫 업데이트는 방법과 max_period 에 따라 수 밀리초에서 약 100 밀리초가 걸립니다.
- MetaTrader 5, 모든 심볼과 타임프레임. EA, 지표, 스크립트에서 사용. 전략 테스터, 최적화, MQL5 Cloud Network 에서 안전: DLL, 파일, 웹 요청, 차트 객체, 타이머, 전역 변수를 쓰지 않습니다. OCT_Create 는 기록을 불러오기 위해 심볼을 시장 감시 창에 추가합니다.
- 제한: 프로그램당 32 개 핸들, 주기 4-120 바, 투영 최대 500 바, lookback 최대 50000 바.
- 대표 설정. 적응형 길이: 방법 0, 주기 8-48, RSI 길이 OCT_AdaptiveLength(h, 0.5, 2, 100, 1). 사이클 스윙: 방법 1, 주기 10-40, shift 1 의 MODE 가 0 일 때만 OCT_TurnSignal(h, 1) 에 따라 행동. 추세 필터: MODE 가 0 이 아니면 추세. 추세 바를 줄이려면 추세 밴드 2.5. 지표: OnCalculate 에서 OCT_CycleSeries.
- 스크린샷과 동영상은 이 라이브러리로 만든 데모 EA 를 보여 줍니다. 구매 내용에는 포함되지 않습니다.
위험 고지
사이클 값은 과거 가격을 설명합니다. 시장은 국면이 바뀌고, 투영은 예측이 아니며, 어떤 값도 수익을 보장하지 않습니다. 먼저 데모 계좌에서 테스트하십시오.
