Tectonic Structure Engine
- 라이브러리
- 버전: 1.0
- 활성화: 5
EA, 지표 또는 스크립트를 위해 시장 구조를 그려 주는 MQL4 라이브러리입니다. HH, HL, LH, LL, EQH, EQL 라벨이 붙은 확정 스윙, 구조 돌파 (BOS), 성격 전환 (CHoCH), 유동성 스윕, 채움 추적이 있는 오더 블록과 페어 밸류 갭, 그리고 거래 범위 안에서의 가격 위치를 제공합니다. 마감된 봉만 읽으며 절대 리페인트하지 않습니다. 매매, 그리기, 알림은 하지 않습니다. 컴파일된 Tectonic_Structure_Engine.ex4 를 받게 되며, 이 페이지가 API 전체 레퍼런스입니다.
빠른 시작
- Tectonic_Structure_Engine.ex4 를 MQL4/Libraries 에 복사합니다 (파일 > 데이터 폴더 열기).
- 아래 #import 블록을 프로그램에 붙여 넣습니다.
- OnInit 에서: h = TSE_Create("", 0, 3, 1000); 필요하면 TSE_Configure.
- OnTick 또는 OnCalculate 에서 TSE_Update(h) 를 호출합니다. 새 봉이 없으면 약 1마이크로초 만에 0 을 반환합니다.
- TSE_Trend, TSE_GetEvent, TSE_NearestZone 등을 읽고, OnDeinit 에서 TSE_Release(h) 를 호출합니다.
- 확인: 아래 예제를 전략 테스터에서 실행합니다 (아무 종목, M15). 저널에 각 이벤트가 출력되며, 첫 업데이트는 전체 히스토리를 출력합니다.
임포트 선언 (바로 복사 가능)
#import "Tectonic_Structure_Engine.ex4" int TSE_Create(string symbol, int timeframe, int strength, int history_bars); bool TSE_Configure(int handle, int break_mode, double min_swing_atr, double equal_tol_atr, double fvg_min_atr, int atr_period); void TSE_Release(int handle); int TSE_Update(int handle); int TSE_Trend(int handle); int TSE_SwingCount(int handle); bool TSE_GetSwing(int handle, int index, int &side, double &price, datetime &time, int &label); int TSE_EventCount(int handle); bool TSE_GetEvent(int handle, int index, int &type, double &level, datetime &swing_time, datetime &break_time); bool TSE_GetLevels(int handle, double &swing_high, double &swing_low, bool &high_broken, bool &low_broken); double TSE_RangePosition(int handle, double price); int TSE_ZoneCount(int handle); bool TSE_GetZone(int handle, int index, int &kind, int &dir, double &top, double &bottom, datetime &time, int &state, double &fill); int TSE_NearestZone(int handle, int kind, int dir, double price, double &top, double &bottom); int TSE_GetStats(int handle, int &stats[]); int TSE_LastError(); string TSE_ErrorText(int code); string TSE_LabelText(int label); string TSE_EventText(int type); string TSE_ZoneText(int kind, int dir); string TSE_StateText(int state); #import
코드
- 스윙 라벨: 1 HH, 2 LH, 3 EQH (고점); -1 LL, -2 HL, -3 EQL (저점); 0 FIRST (해당 쪽에 이전 스윙 없음).
- 이벤트 유형: 1 BOS UP, -1 BOS DOWN, 2 CHOCH UP, -2 CHOCH DOWN, 3 SWEEP HIGH, -3 SWEEP LOW.
- 존 종류 (kind): 1 페어 밸류 갭, 2 오더 블록. dir: 1 상승 (지지), -1 하락 (저항). 텍스트: BULL FVG, BEAR FVG, BULL OB, BEAR OB.
- 존 상태: 0 FRESH (미접촉), 1 TESTED (가격 진입), 2 FILLED (FVG 통과), 3 BROKEN (OB 종가 돌파).
- 오류: 0 OK, -1 BAD HANDLE, -2 BAD PARAMETERS, -3 NO HISTORY, -4 NO FREE SLOT, -5 BAD INDEX. 다른 코드에 대해 텍스트 함수는 UNKNOWN 을 반환합니다.
마감된 봉마다 읽는 방식
- 존: 상승 존 안의 저가 (하락 존 안의 고가) 는 TESTED 로 바꾸고 fill, 즉 존 높이 대비 가장 깊은 진입 비율(%)을 올립니다. 가격이 먼 쪽 경계에 닿으면 FVG 는 FILLED, 먼 쪽 경계 너머로 종가가 나면 OB 는 BROKEN 이 됩니다 (OB 가 유효한 동안 fill 이 100% 가 될 수 있습니다).
- 스윙: strength 봉 전의 봉은 고가가 앞의 strength 봉보다 높고 뒤의 strength 봉보다 낮지 않으면 스윙 고점입니다 (저점은 대칭). 스윙은 strength 봉 늦게 보고되며 절대 움직이지 않습니다. min_swing_atr 가 0 보다 크면, 고가에서 2 x strength + 1 봉의 최저가를 뺀 값이 min_swing_atr x ATR 이상이어야 합니다. 같은 쪽 이전 스윙과 비교한 라벨: equal_tol_atr x ATR 이내면 EQH 또는 EQL, 아니면 HH 또는 LH, LL 또는 HL. 가장 최근의 스윙 고점과 스윙 저점이 돌파 레벨입니다.
- 돌파: break_mode 0 은 레벨 너머의 종가, 1 은 꼬리로 판정합니다. 스윙 고점 돌파는 추세가 -1 이었으면 CHOCH UP, 아니면 BOS UP 이며, 추세는 1 이 되고 레벨은 소진됩니다. 저점은 대칭. 종가 모드에서 꼬리로 넘었다가 안쪽에서 마감하면 SWEEP 이며 레벨당 한 번입니다.
- 오더 블록: BOS 또는 CHoCH 때마다, 스윙과 돌파 사이 구간의 극점 또는 그 이전 최대 10봉 안의 마지막 반대 방향 캔들 (상승 돌파면 음봉); 존은 그 캔들의 고가-저가 범위입니다.
- 페어 밸류 갭: 세 번째 캔들의 저가가 첫 번째 캔들의 고가보다 위 (상승), 또는 세 번째의 고가가 첫 번째의 저가보다 아래 (하락), 높이는 최소 fvg_min_atr x ATR.
ATR 은 atr_period 봉 동안의 실제 범위의 단순 평균입니다.
API 레퍼런스
TSE_Create
symbol: "" 또는 NULL = 차트 종목; 종목이 존재해야 합니다. timeframe: 0 = 차트 주기, 그 외 PERIOD_M1 부터 PERIOD_MN1. strength: 1-50. history_bars: 100-20000, 첫 업데이트 때 구축. 핸들 0-31 을 반환하며, 실패 시 BAD PARAMETERS 또는 NO FREE SLOT 과 함께 -1. 기본값: break_mode 0, min_swing_atr 0, equal_tol_atr 0.10, fvg_min_atr 0.25, atr_period 14.
TSE_Configure
break_mode 0-1, min_swing_atr 0-10 (0 = 끔), equal_tol_atr 0-5, fvg_min_atr 0-10, atr_period 1-500. 핸들을 비우며 다음 TSE_Update 가 다시 구축합니다. 범위를 벗어난 값이 있으면 false, BAD PARAMETERS, 아무것도 바뀌지 않습니다.
TSE_Release
핸들을 해제하여 재사용할 수 있게 합니다. OnDeinit 에서 호출하세요.
TSE_Update
아직 읽지 않은 마감 봉을 읽습니다. 첫 호출은 history_bars 를 구축합니다. 새 이벤트 수 (TSE_GetEvent 의 인덱스 0 부터 n-1), 새 봉이 없으면 0, 또는 -1 을 반환합니다: BAD HANDLE, 또는 로드된 봉이 2 x strength + 4 개 미만인 동안 NO HISTORY (다음 틱에서 다시 호출). 마지막으로 읽은 봉이 사라지면 (히스토리 재로드) 핸들이 스스로 재구축됩니다.
int n = TSE_Update(h); if(n > 0) Print(n, " new events");
TSE_Trend
상승 돌파 후 1, 하락 돌파 후 -1, 첫 돌파 전이나 잘못된 핸들이면 0.
TSE_SwingCount 와 TSE_GetSwing
저장된 스윙, 최신이 인덱스 0: side (1 고점, -1 저점), price, 스윙 봉의 시간, label. 잘못된 핸들이면 개수는 -1; 0 부터 개수-1 범위를 벗어나면 TSE_GetSwing 은 BAD INDEX 와 함께 false 를 반환합니다.
TSE_EventCount 와 TSE_GetEvent
저장된 이벤트, 최신이 인덱스 0: type, level (스윙 가격), swing_time, break_time (레벨을 돌파하거나 스윕한 봉).
TSE_GetLevels
가장 최근의 스윙 고점과 스윙 저점 (아직 없으면 0.0) 과 각각 이미 돌파되었는지 여부. 돌파되지 않은 레벨이 다음 BOS 또는 CHoCH 의 트리거입니다.
TSE_RangePosition
두 레벨 사이에서 가격의 위치: 0 = 스윙 저점, 50 = 균형, 100 = 스윙 고점, 범위 밖이면 0 미만 또는 100 초과. price 0 = 핸들 종목의 Bid. 레벨이 없거나 고점이 저점보다 위가 아니면 EMPTY_VALUE. 데모는 45 미만에서 DISCOUNT, 55 초과에서 PREMIUM 을 표시합니다.
TSE_ZoneCount 와 TSE_GetZone
모든 상태의 저장된 존, 최신이 인덱스 0: kind, dir, top, bottom, time (FVG: 가운데 캔들; OB: 그 캔들 자체), state, fill 0-100.
TSE_NearestZone
가격에 가장 가까운 FRESH 또는 TESTED 존 (0 = Bid); 존 안에서는 거리 0, 거리가 같으면 더 최근 존. kind: 0 전체, 1 FVG, 2 OB. dir: 0 전체, 1, -1. TSE_GetZone 용 인덱스를 반환하고 top 과 bottom 을 채웁니다. 없으면 -1 (오류 OK) 또는 BAD PARAMETERS.
double top, bottom; int z = TSE_NearestZone(h, 2, 1, 0, top, bottom); // nearest bullish order block
TSE_GetStats
동적 int 배열을 전달하면 크기가 12 로 바뀌고 12 를 반환합니다: 0 읽은 봉, 1 스윙 고점, 2 스윙 저점, 3 BOS UP, 4 BOS DOWN, 5 CHOCH UP, 6 CHOCH DOWN, 7 SWEEP HIGH, 8 SWEEP LOW, 9 FVG, 10 OB, 11 현재 유효한 존. 마지막 구축 이후의 개수입니다.
TSE_LastError 와 텍스트 함수
TSE_LastError: 마지막 호출의 코드. TSE_ErrorText, TSE_LabelText, TSE_EventText, TSE_ZoneText(kind, dir), TSE_StateText 는 "코드" 절에 나온 문자열을 반환합니다.
동작하는 통합 예제
#import "Tectonic_Structure_Engine.ex4"
int TSE_Create(string symbol, int timeframe, int strength, int history_bars);
void TSE_Release(int handle);
int TSE_Update(int handle);
int TSE_Trend(int handle);
bool TSE_GetEvent(int handle, int index, int &type, double &level, datetime &swing_time, datetime &break_time);
int TSE_NearestZone(int handle, int kind, int dir, double price, double &top, double &bottom);
string TSE_EventText(int type);
#import
int h = -1, htf = -1;
int OnInit()
{
h = TSE_Create("", 0, 3, 1000); // chart timeframe
htf = TSE_Create("", PERIOD_H4, 3, 1000); // higher-timeframe bias
return (h >= 0 && htf >= 0) ? INIT_SUCCEEDED : INIT_FAILED;
}
void OnDeinit(const int reason) { TSE_Release(h); TSE_Release(htf); }
void OnTick()
{
TSE_Update(htf);
int n = TSE_Update(h);
for(int i = n - 1; i >= 0; i--)
{
int type; double level; datetime st, bt;
if(TSE_GetEvent(h, i, type, level, st, bt))
Print(TSE_EventText(type), " at ", level, ", H4 trend ", TSE_Trend(htf));
}
double top, bottom;
if(n > 0 && TSE_NearestZone(h, 2, 1, 0, top, bottom) >= 0)
Print("nearest bullish OB ", bottom, " - ", top);
} 대표적인 설정
- 내부 구조와 외부 구조: 한 차트에 두 핸들, strength 2 와 8.
- 멀티 타임프레임 방향성: 진입용 차트 핸들, TSE_Trend 필터용 H4 또는 D1 핸들.
- 꼬리 돌파: TSE_Configure(h, 1, 0, 0.10, 0.25, 14); 이 모드에서는 스윕이 없습니다.
- 더 적고 큰 존과 스윙: fvg_min_atr 0.5-1.0, min_swing_atr 1.0.
구조와 참고 사항
- 핸들당 엔진 하나, 프로그램당 최대 32 핸들; 임포트하는 각 프로그램이 자신의 핸들을 가집니다. 데이터는 메모리에 있으며 재시작 후 히스토리에서 다시 구축됩니다.
- 마감 봉만, 각 봉을 한 번씩 오래된 순서로 읽습니다: 리페인트가 없고 0번 봉은 사용하지 않습니다.
- MT4 전략 테스터에서 20,000 봉 구축에 약 80 ms 가 걸렸습니다.
- 다른 종목이나 타임프레임은 iHigh, iLow, iOpen, iClose, iTime 으로 읽습니다. 터미널이 다운로드하는 동안 NO HISTORY 는 정상입니다. 전략 테스터에서는 테스트 중인 종목 (모든 타임프레임) 을 사용하세요.
- 핸들당 최대 2000 스윙, 2000 이벤트, 500 존; 가득 차면 가장 오래된 10% 를 버립니다.
- MetaTrader 4 build 600 이상. 전략 테스터와 최적화에서 안전합니다. DLL, 파일, 전역 변수, 차트 객체, 타이머, 알림, 매매가 없습니다.
위험 고지
이 라이브러리는 가격 구조를 설명합니다. 가격을 예측하지 않으며 수익을 보장하지 않습니다. 이를 기반으로 한 전략은 먼저 데모 계좌에서 테스트하세요.
