Single Arrow Scanner
- 지표
-
Ahmed Hamed Hamed Eadwan
KOREAN TRANSLATION — 한국어
==============================
TITLE:
MQL5 개발자 & 트레이더 | R protocols 창립자
ABOUT:
안녕하세요, 저는 Ahmed입니다. 아랍에미리트에 기반을 둔
트레이더이자 MQL5 개발자이며, R protocols의 창립자입니다.
1984년부터 코드를 작성해 왔고, 2006년부터 시장에서 거래를
해왔습니다. 수년 동안 실제 시장 경험을 통해 개선하며 - 버전: 1.0
- 활성화: 5
파일 하나. 화살표 하나. 의사결정 하나.
SingleArrow MTF는 MetaTrader 5용 전문가급 자체 완결형 다이버전스 신호 지표입니다. 전용 선형 시간 ZigZag 엔진, 레그 분리를 갖춘 Williams %R 다이버전스 필터, 선택적 피벗 보호 레이어, 멀티 타임프레임 합의 대시보드, 자동 지지/저지를 하나로 결합——모두 단일 파일로 컴파일되며 외부 지표, 라이브러리, DLL이 필요 없습니다.
이런 분께
- 날것의 오실레이터 대신 깔끔하고 규칙 기반인 다이버전스 화살표를 원하는 재량 트레이더.
- 기계 판독 가능하고 리페인트에 투명한 신호 소스(버퍼 + GlobalVariable 채널)가 필요한 EA 개발자.
- 확인되고 히스토리에서 안정적인 신호 스트림(Confirm 모드)이 필요한 백테스터·전략가.
아키텍처 한눈에
- 구조 레이어: 내장 ZigZag 엔진이 가격에서 피벗을 추출.
- 분석 레이어: Williams %R 다이버전스 필터가 레그 분리 상태로 각 피벗 쌍을 검증.
- 표현 레이어: 화살표, MTF 대시보드, S/R 레벨, 알림, 투명성 카운터.
1) 내장 ZigZag 엔진(왜 플랫폼 기본이 아닌가?)
- 선형 시간 O(n): 로드된 히스토리 전체를 단일 패스로 처리. 새 tick마다 O(1) 작업만 소요되어 빠른 tick과 깊은 히스토리에서도 가볍습니다.
- 고전의 3파라미터, 현대적 코어: Deviation / Depth / Backstep은 익숙한 의미를 유지하고, 내부 피벗 관리(유한 Backstep 억제, 피벗 앞쪽 삽입 안전화)는 처음부터 구현되어 엣지 케이스에 대해 강화되었습니다.
- iCustom 없음, 누락 버퍼 없음: 엔진이 내장되어 신호 파이프라인은 차트나 터미널 폴더의 다른 지표 존재에 절대 의존하지 않습니다. 컴파일된 EX5는 Market 대여를 포함해 어디서나 동작합니다.
- 결정론적: 동일한 파라미터는 모든 차트, 종목, 터미널 빌드에서 동일한 피벗을 생성합니다.
2) 레그 분리를 갖춘 Williams %R 다이버전스
오실레이터의 수준 교차만으로는 여기서 신호가 아닙니다. 지표는 같은 구간에서 가격 레그(피벗 간 이동)와 오실레이터 레그를 비교합니다:
- 베어리시 다이버전스: 가격이 더 높은 고점을 만들 때 Williams %R 레그가 더 낮은 고점을 만들면 → 확인된 고점에 매도 화살표.
- 불리시 다이버전스: 가격이 더 낮은 저점을 만들 때 Williams %R 레그가 더 높은 저점을 만들면 → 확인된 저점에 매수 화살표.
- 레그 분리: 레그 내부의 스윙은 비교에서 제외되므로, 레그 중간 노이즈 스파이크가 다이버전스를 위조하거나 숨길 수 없습니다 — 그리고 같은 방향의 연속된 두 피벗은 절대 비교되지 않습니다(저가형 ZigZag/다이버전스 조합의 전형적인 거짓 신호 원인).
- ZigZag 구조 규칙과 WPR 다이버전스 테스트를 모두 통과한 피벗만 화살표를 생성합니다. 모든 화살표는 완성된 의사결정이며 날것의 힌트가 아닙니다.
3) 신호 모드: Confirm vs Live(꼭 읽어 주세요)
Confirm(기본, InpConfirmBars > 0) — 히스토리 안정 스트림. 지표는 화살표를 그리기 전에 N개의 바(InpConfirmBars)를 기다립니다: 후보 다이버전스는 원인 피벗이 이후 가격 행동으로 확인될 때까지 보류됩니다. 커밋된 화살표는 동결됩니다: 움직이지 않고, 사라지지 않고, 방향이 바뀌지 않습니다*. InpConfirmBars = 0이면 Live 모드로 전환됩니다.
Live — 가능한 가장 빠른 판독. 화살표는 형성 중인 바 안에 표시됩니다. 설계상 바가 미완성인 동안 이동하거나 사라질 수 있으며, 내장 투명성 카운터가 그러한 모든 이벤트를 보고합니다(7절).
*비리페인트 보증 매트릭스(Confirm 모드):
- Deviation/Depth/Backstep = 수동 → 무조건 보증.
- ATR 적응형 Depth/Backstep + 피벗 잠금 ON → 보증.
- 적응형 + 피벗 잠금 OFF → 지표가 잠금을 자동 활성화하고 사용자에게 알립니다. 바로 그 보증을 지키기 위해서입니다.
이 조건부 보증은 제품 메타데이터에 정직하게 명시되며 시작 시 입력 검증으로 강제됩니다.
4) 피벗 잠금
확인된 피벗은 내부 레지스트리에서 동결됩니다. 이후 재계산, 변동성 스파이크, 파라미터 편집으로도 이동시킬 수 없습니다. 적응형 모드 보증을 가능하게 하는 메커니즘이며, Live 실행 시 항상 권장됩니다.
5) ATR 적응형 ZigZag 파라미터
변동성은 세션과 종목에 따라 달라집니다. Deviation/Depth/Backstep을 손으로 재조정하는 대신, 적응형 모드는 현재 ATR에 따라 설정 가능한 범위 안에서 이를 스케일링합니다(예: DepthMax는 적응형 Depth 상한). 금, 코인, 지수, FX 전반에서 종목별 수동 관리 없이 구조가 유효하게 유지됩니다.
6) 멀티 타임프레임 대시보드
동일 엔진이 백그라운드에서 최대 23개의 추가 타임프레임에서 실행됩니다(기본 M5/M15/H1/H4/D1, InpMTFTimeframes로 완전히 설정 가능, 분석 창은 InpMTFLookback). 차트 위 대시보드는 각 타임프레임의 라이브/확인 신호, 다이버전스 상태, 피벗 상태를 표시해, 내 타임프레임이 큰 그림과 일치할 때만 트레이딩할 수 있게 합니다 — 예: H1/H4가 불리시 맥락을 보일 때 M15 매수 화살표 채택.
7) 투명성 도구(EA 개발자용)
- SA_RepaintBars(버퍼 5): Live 리페인트 이벤트의 누적 카운터 — Confirm 모드에서는 설계상 0.
- SA_PostCommitBars(버퍼 6): 커밋 후 조정의 누적 카운터 — Confirm 모드 자체를 감사합니다.
- 이 둘은 역사 시계가 아닌 살아있는 단조 카운터입니다: 의미 있는 값은 현재값(최근 2–3개 바)뿐. 0번 바를 읽거나 미러된 Global Variables SA_REP_ / SA_POST_ + 종목 + TF를 사용하세요; 히스토리는 절대 스캔하지 마세요.
- SA_PivotState(버퍼 3)는 이 바의 피벗이 확인됨(1)인지 아직 형성 중(0)인지도 알립니다.
8) 자동 지지/저지
지표는 피벗을(차트 타임프레임에서, 또는 InpSRUseAllTF로 모니터링 중인 모든 TF에서) 터치 횟수 라벨이 있는 순위형 지지/저지 레벨로 클러스터링하여 수평선·레이·음영 존으로 그립니다(InpSRMode 0/1/2). 레벨은 즉각적인 맥락을 제공합니다: 순위형 지지대에서 형성되는 불리시 다이버전스 화살표는 허공의 화살표보다 더 많은 정보를 담습니다.
9) 알림
새로 확인된 신호에 대해 플랫폼의 alert/push/mail 훅으로 선택적 알림이 발생합니다. 알림 문구는 설계상 영어 전용이며 Market 규정과 정합합니다.
10) 전체 설정 레퍼런스(그룹별)
- 신호 엔진: InpConfirmBars(0 = Live, N = Confirm), InpLiveMargin, InpLockPivots + InpLockAfterBars, InpShowDiag.
- ZigZag: InpDepth / InpBackstep / InpDeviation; InpDevMode / InpDepthMode / InpBackstepMode로 파라미터별 Manual 또는 ATR 적응형, 추가로 InpATRPeriod, InpATRMult, InpDepthATRMult, InpDepthMin/InpDepthMax, InpBackstepATRMult, InpBackstepMin/InpBackstepMax.
- 다이버전스: InpWPRPeriod, InpUseDivergence, InpLookback — 엔진 내부 하한에 대해 검증; 유효하지 않은 값은 시작 시 명확한 영어 메시지로 거부됩니다.
- MTF 대시보드: InpMTFEnabled, InpMTFTimeframes(예 "M5,M15,H1,H4,D1", 최대 23), InpMTFLookback, InpDashEnabled, InpDashCorner, InpDashX/Y, InpDashFontSize.
- S/R: InpSREnabled, InpSRLevelsCount, InpSRTolPts, InpSRMinTouches, InpSRSupportClr/InpSRResistClr, InpSRShowLabel, InpSRMode(0=수평선, 1=레이, 2=존), InpSRUseAllTF.
11) 설치 및 첫 실행
- 터미널의 Market 탭에서 설치(대여 및 평생 라이선스는 MetaTrader 5가 관리).
- 아무 차트, 아무 타임프레임에 부착.
- Confirm 모드 기본값으로 시작해 대시보드를 관찰한 뒤, ZigZag 3파라미터를 조정하거나 ATR 적응형 모드를 켜세요.
12) 실전 플레이북
- 단타: H1 대시보드 합의로 필터한 M15 화살표. 투영된 S/R로의 되돌림에서 Confirm 진입.
- 스윙: H4 피벗을 맥락으로, H1 화살표를 트리거로.
- EA: 커밋된 화살표는 1번 바의 신호 버퍼에서. Live 활동은 0번 바의 투명성 카운터로 모니터링.
13) 성능 및 요구사항
- MetaTrader 5, 모든 종목, 모든 타임프레임. DLL 없음, 외부 파일 없음, 추가 지표 없음.
- 증분 tick 처리를 갖춘 선형 시간 코어 — 빠른 tick 흐름에도 차트가 굳지 않습니다.
- 깨끗한 초기화 해제: 분리/TF 변경 시 차트 객체 제거.
14) 이 제품은 무엇이 아닌가
매매를 집행하지 않고, 자금을 관리하지 않으며, 수익을 보장하지 않습니다. 다이버전스는 확률적·맥락적 판독입니다. Live 모드에서 리페인트는 설계상 의도된 것이며 항상 카운터가 보고합니다.
15) 변경 이력
- v1.03: Lookback 검증을 엔진 내부 하한과 통일(묵묵한 무신호 엣지 케이스 제거). 피벗 앞쪽 삽입 강화. S/R 재구축 강화.
- v1.01: 최초 Market 공개판.
16) FAQ
- 리페인트하나요? 보증 조건(3절) 하의 Confirm 모드에서는 아닙니다. Live 모드의 변화는 설계상 의도된 것이며 투명하게 계수됩니다.
- 모든 종목에서 되나요? 네. ATR 적응형 모드는 바로 종목 간 구조 유효성을 위해 설계되었습니다.
- 제 EA가 사용할 수 있나요? 네 — 신호 버퍼, GlobalVariable 채널, 리페인트 카운터 덕분에 EA 친화적입니다.
- 왜 수많은 힌트가 아니라 화살표 하나인가요? 모든 화살표는 구조 + 다이버전스 검증을 통과했습니다. 의도적으로 적지만 고품질입니다.
- 차트에 플랫폼 ZigZag이 필요한가요? 아니오. 엔진은 내장입니다.
17) iCustom 통합 및 EA 연동(버퍼, 코드, Global Variables)
SingleArrow MTF는 모든 EA가 iCustom() + CopyBuffer()로 읽을 수 있는 7개의 버퍼를 공개합니다 — MetaTrader는 첫 iCustom 호출 시 지표를 자동 로드하며, 수동 부착이 필요 없습니다.
// BUFFER MAP (index -> content) // 0 SA_Buy BUY arrow price (0.0 = none) // 1 SA_Sell SELL arrow price (0.0 = none) // 2 SA_Signal +1 buy / -1 sell / 0 none // 3 SA_PivotState 1 = confirmed pivot, 0 = still forming // 4 SA_WPR Williams %R value // 5 SA_RepaintBars live-repaint counter (0 by design in Confirm) // 6 SA_PostCommitBars post-commit counter (audits Confirm mode) int h = iCustom(_Symbol, PERIOD_CURRENT, "SingleArrow_MTF", 34, // InpDepth 8, // InpBackstep 13, // InpDeviation 14, // InpWPRPeriod 5000, // InpLookback false, // InpUseDivergence 1); // InpConfirmBars (0 = Live, 1+ = Confirm) double sig[]; ArraySetAsSeries(sig, true); CopyBuffer(h, 2, 0, 3, sig); // buffer 2 = SA_Signal if(sig[1] == 1) { /* confirmed buy on last closed bar */ } if(sig[1] == -1) { /* confirmed sell on last closed bar */ } // Repaint counters via Global Variables (no CopyBuffer needed): double rep = GlobalVariableGet("SA_REP_" + _Symbol + "_" + IntegerToString((int)PERIOD_CURRENT)); double post = GlobalVariableGet("SA_POST_" + _Symbol + "_" + IntegerToString((int)PERIOD_CURRENT));
// FULL iCustom SIGNATURE (positional order - every declared input) iCustom(symbol, timeframe, "SingleArrow_MTF", 34, // InpDepth int default 34 8, // InpBackstep int default 8 13, // InpDeviation int default 13 14, // InpWPRPeriod int default 14 5000, // InpLookback int default 5000 false, // InpUseDivergence bool default false 1, // InpConfirmBars int default 1 (0 = Live) 12, // InpLiveMargin int default 12 true, // InpShowDiag bool default true 0, // InpDevMode enum 0=Manual 1=ATR-Adaptive 14, // InpATRPeriod int default 14 0.15, // InpATRMult double default 0.15 0, // InpDepthMode enum 0=Manual 1=ATR-Adaptive 1.0, // InpDepthATRMult double default 1.0 15, // InpDepthMin int default 15 80, // InpDepthMax int default 80 0, // InpBackstepMode enum 0=Manual 1=ATR-Adaptive 1.0, // InpBackstepATRMult double default 1.0 3, // InpBackstepMin int default 3 30, // InpBackstepMax int default 30 false, // InpLockPivots bool default false 3, // InpLockAfterBars int default 3 true, // InpMTFEnabled bool default true "M5,M15,H1,H4,D1", // InpMTFTimeframes string 1200, // InpMTFLookback int default 1200 true, // InpSREnabled bool default true 5, // InpSRLevelsCount int default 5 15, // InpSRTolPts int default 15 2, // InpSRMinTouches int default 2 clrDodgerBlue, // InpSRSupportClr clrOrangeRed, // InpSRResistClr true, // InpSRShowLabel bool default true 0, // InpSRMode int 0=HLine 1=Ray 2=Zone false, // InpSRUseAllTF bool default false true, // InpDashEnabled bool default true CORNER_LEFT_UPPER, // InpDashCorner 10, // InpDashX int default 10 30, // InpDashY int default 30 7); // InpDashFontSize int default 7
- 핸들 수명주기: OnInit에서 한 번 생성하고 OnDeinit에서 IndicatorRelease()로 해제; tick마다 iCustom 호출 금지.
- 1번 바의 커밋된 피드: SA_Signal / SA_Buy / SA_Sell을 마지막 마감 바에서 읽어 백테스트와 일관된 안정 스트림을 확보; SA_PivotState는 확인된 피벗(1)과 형성 중인 끝(0)을 분리합니다.
- 카운터는 살아있는 단조 값: 버퍼 5/6(및 SA_REP_/SA_POST_ Global Variables)은 최근 2–3개 바에서만 의미 — 0번 바를 읽고 히스토리는 절대 스캔하지 마세요.
- EA 전용 성능 팁: InpDashEnabled=false와 InpSREnabled=false를 넘기면 모든 차트 객체 그리기를 건너뛰어 핸들이 순수 계산 상태로 유지됩니다.
- 동일 종목+TF의 두 인스턴스는 하나의 Global Variable 채널을 공유; 이는 편의 판독에만 영향 주고 신호 계산에는 결코 영향 주지 않습니다.
