오늘의 재료 — 500줄짜리 개념 사전
오늘 스터디의 재료는 트레이딩뷰에서 가장 유명한 지표 중 하나, LuxAlgo의 Smart Money Concepts다(CC BY-NC-SA 4.0, 원작자 © LuxAlgo). 지난 RSI 다이버전스 편은 열두 줄이었는데 이번엔 500줄이 넘는다. 라이선스를 존중해 코드 전문은 싣지 않고, 대신 그 500줄이 무엇을 계산하는지를 전부 분해한다. 봇 개발자에게 필요한 것은 코드의 복사가 아니라 판정식의 이해다.
SMC는 단일 지표가 아니라 개념의 묶음이다. 코드의 모듈 구성을 그대로 지도로 그리면 이렇다.
SMC
├─ 시장 구조 (Market Structure)
│ ├─ 스윙 구조 50봉 스윙 기준 BOS / CHoCH
│ ├─ 내부 구조 5봉 스윙 기준 BOS / CHoCH (단기)
│ └─ 강/약 고저 Strong·Weak High/Low (추세 편향 라벨)
├─ 오더블록 (Order Blocks) 구조 돌파 직전의 반대 극값 봉 영역
├─ EQH / EQL 같은 높이의 고점·저점 (유동성 풀 후보)
├─ FVG (Fair Value Gap) 3봉 사이의 미체결 가격 공백
├─ MTF 레벨 전일/전주/전월 고저 (D/W/M)
└─ 프리미엄/디스카운트 존 스윙 범위의 상단 5% / 중앙 / 하단 5%
핵심 파라미터: 스윙 50봉 · 내부 5봉 · EQ 확인 3봉 · EQ 임계 0.1×ATR(200)SMC의 서사는 이렇다 — “큰돈(스마트 머니)은 흔적을 남긴다. 구조의 파괴, 급히 떠난 자리(오더블록), 채우지 못한 공백(FVG), 유동성이 고인 곳(EQH/EQL)을 읽으면 그 흔적을 따라갈 수 있다.” 서사는 매혹적이다. 하지만 이 스터디의 관심은 서사가 아니라 판정식이다. 코드로 내려가면 SMC의 모든 개념은 고점·저점·종가의 비교문으로 환원된다. 그리고 비교문이 된 순간, 검증 가능한 대상이 된다.
뼈대 1: 시장 구조 — BOS와 CHoCH의 실제 정의
차트 교과서에서 BOS(Break of Structure)와 CHoCH(Change of Character)는 신비롭게 설명되지만, 코드 속 정의는 간명하다. 먼저 스윙(변곡점)을 잡는다 — N봉(기본 50) 전의 고점이 최근 N봉의 최고가보다 높으면 그 봉이 스윙 고점 후보가 되는 식이다. 그다음 종가가 마지막 스윙 고점을 상향 돌파하면 구조 파괴 이벤트가 발생한다. 이때 직전 추세가 상승이었으면 BOS(추세 지속), 하락이었으면 CHoCH(추세 전환)라는 이름표가 붙는다. 같은 이벤트에 추세 맥락만 다른 이름을 붙이는 것이다.
하락 추세 중 상승 추세 중
고점A ─────╮ 고점C ─────────── ◀ 종가 돌파
╲ │ ╱╲ ╱ = BOS (추세 지속)
╲ │╱ ╲ ╱╲ ╱
╲ ● ╲ ╱ ╲──╮ ╱╲ ╱
╲╱ ╲ ╱ ╲ ╱ ╲╱
저점B ╲ ╱ ╲╱
종가가 고점A 상향 돌파 = CHoCH (하락→상승 전환 선언)
판정식: crossover(close, 마지막 스윙고점) → 직전 편향이 하락이면 CHoCH
스윙 확정 조건: 그 봉이 스윙인지 아는 데 N봉(기본 50봉)의 미래가 필요하다봇 개발자가 여기서 형광펜을 칠 곳은 마지막 줄이다. 스윙 고점은 50봉이 지나야 확정된다. 차트에서 SMC 지표가 과거에 그려놓은 스윙 라벨은 전부 사후 확정된 것들이다. 15분봉 기준 50봉이면 12시간 반 — 지금 이 순간의 봉이 스윙 고점인지 아닌지는 반나절 뒤에나 알 수 있다는 뜻이다. 사람 눈에는 “구조가 깨질 때마다 지표가 정확히 표시해 줬네"로 보이지만, 실시간의 봇에게 주어지는 것은 훨씬 늦고 성긴 정보다. 지표를 백테스트할 때 이 확정 지연을 무시하면 미래 정보를 쓰는 백테스트가 된다 — 내가 완성봉 원칙에 집착하는 이유의 확장판이다.
뼈대 2: 오더블록 — ‘급히 떠난 자리’의 수치적 정의
오더블록의 서사는 “기관이 물량을 쌓은 마지막 음봉/양봉"이다. 코드의 정의는 이렇다: 구조 돌파가 발생하면, 직전 스윙과 현재 사이에서 극값을 만든 봉을 찾아 그 봉의 고저 범위를 상자로 저장한다. 상승 돌파면 그 구간의 최저가 봉이 불리시 오더블록이 된다. 가격이 훗날 그 상자로 돌아오면(리테스트) 지지를 기대하고, 상자를 완전히 관통하면(mitigation) 상자를 폐기한다.
디테일이 두 개 있는데 둘 다 배울 게 있다. 첫째, 변동성 필터. 봉의 범위가 ATR(200)의 2배를 넘는 ‘고변동성 봉’은 고저를 뒤집어 기록한다 — 긴 꼬리 봉이 만드는 과대한 상자를 걸러내는 장치다. 둘째, 소멸 기준의 선택지. 상자 관통을 종가로 판정할지(Close), 고저로 판정할지(High/Low)를 사용자에게 맡긴다. 같은 개념이라도 판정 소스가 다르면 상자의 수명이 달라진다.
① 형성 ② 리테스트 ③ 소멸(mitigation)
╱╲ 돌파↗ ╲ ╲
╱ ╲ ╱ ╲ ╱ ╲
▓▓▓▓▓▓▓▓▓▓ ╱ ◀ 돌파 전 최저가 봉 ▓▓▓▓▓▓ ← 지지 기대 ▓▓▓▓▓▓
▓ 불리시OB ▓ ▓ ╲╱ ▓ ╲
╲ ← 하향 관통 = 폐기
필터: 봉 범위 ≥ 2×ATR(200) 인 고변동성 봉은 고저 반전 기록 (꼬리 상자 방지)
소멸: Close 기준(보수적) vs High/Low 기준(민감) — 선택이 상자 수명을 바꾼다
구현: 돌파 시점에 구간 슬라이스 → 극값 인덱스 → 상자 저장 (최대 100개 큐)봇의 관점에서 오더블록은 동적으로 생성·소멸되는 지지/저항 레벨의 목록이다. RSI처럼 매 봉 하나의 숫자가 나오는 지표가 아니라, 상태(상자 목록)를 관리하는 자료구조다. 이 차이가 구현 난이도를 결정한다 — 숫자 지표는 함수 하나면 되지만, 오더블록은 생성 이벤트, 보유 목록, 소멸 조건, 우선순위(가장 가까운 상자부터)까지 설계해야 한다. 지표가 아니라 작은 시스템이다.
뼈대 3: FVG, EQH/EQL, 그리고 프리미엄/디스카운트
**FVG(Fair Value Gap)**는 3봉 패턴이다. 불리시 FVG의 판정식: 현재 봉의 저가가 두 봉 전 고가보다 높고, 직전 봉 종가도 그 고가 위에 있으면 — 두 봉 전 고가와 현재 저가 사이에 아무도 거래하지 않은 공백이 남는다. 그 공백은 미래에 메워지는 경향이 있다는 것이 서사이고, 코드는 자동 임계값(봉 변화율 누적 평균)으로 자잘한 갭을 걸러낸다. 가격이 갭을 완전히 되메우면 갭은 목록에서 삭제된다 — 오더블록과 같은 생성·소멸 구조다.
EQH/EQL은 거의 같은 높이의 고점(저점) 쌍이다. 판정은 두 스윙 레벨의 차이가 0.1×ATR(200) 미만일 때. 서사적으로는 ‘유동성이 고인 곳’(그 위에 손절 주문이 쌓여 있어 큰돈이 한 번 건드리고 간다)으로 읽는다. 프리미엄/디스카운트 존은 더 단순하다 — 최근 스윙 범위의 상단 5%가 프리미엄(비싸다), 하단 5%가 디스카운트(싸다), 중앙 ±2.5%가 이퀼리브리엄. “디스카운트에서 사고 프리미엄에서 팔라"는 SMC의 기본 문법이 여기서 나온다.
[FVG 불리시] 봉1 봉2 봉3
▂▄ ▄█▆ ▂█▄
고가H ──┐ 갭 ┌── 저가L 조건: L > H and 봉2종가 > H
└─▒▒▒▒▒─┘ ▒ = 미체결 공백 (되메움 관찰 대상)
[EQH] 고점A ══════ 고점B |A-B| < 0.1 × ATR(200) → EQH
[존 구분] 스윙 범위(top~bottom) 기준
프리미엄 top ~ 0.95·top+0.05·bottom (상단 5% — 팔 자리)
이퀼리브리엄 중앙 ±2.5% 밴드 (관망)
디스카운트 0.95·bottom+0.05·top ~ bottom (하단 5% — 살 자리)여기까지 오면 SMC의 정체가 보인다. 신비로운 기관 추적 장치가 아니라, 고전 기술적 분석의 리네이밍에 가깝다. 구조 파괴는 돌파, 오더블록은 수요/공급 존, FVG는 갭, EQH는 이중천장, 디스카운트는 눌림목이다. 이름이 바뀌면서 정밀해진 것은 사실이다 — 판정식이 명시되고 생성·소멸 규칙이 생겼다. 그것이 이 지표의 진짜 기여라고 생각한다. 서사는 마케팅이고, 판정식은 자산이다.
개발자의 눈: 그림 그리는 지표를 판정하는 봇으로
이 지표를 봇에 넣으려면 세 가지 번역 작업이 필요하다.
첫째, 그리기와 판정의 분리. 이 코드의 절반 이상은 선·상자·라벨을 그리는 코드다. 봇에는 화면이 없다 — 필요한 것은 “지금 이 순간 불리시 CHoCH가 발생했는가”, “현재가 아래 가장 가까운 미소멸 불리시 오더블록은 어디인가” 같은 질의 가능한 상태다. 번역하면 이벤트 스트림과 상태 저장소가 된다. 둘째, 확정 지연의 명시. 스윙 구조는 50봉, 내부 구조는 5봉 뒤에 확정된다. 실시간 봇은 확정 전 정보를 쓸 수 없으므로, 모든 이벤트에 ‘발생 봉’과 ‘확정 봉’을 따로 기록해야 백테스트가 정직해진다. 셋째, 상위 타임프레임 데이터의 시점 정렬. 원본 코드는 상위 TF 조회에 lookahead 옵션을 쓴다 — 차트 표시용으로는 관행이지만, 봇이 같은 방식으로 과거를 재생하면 미래 참조가 된다. HTF 봉은 그 봉이 닫힌 시점 이후에만 쓸 수 있다.
# 화면의 그림 → 질의 가능한 상태
state.trend = BULLISH | BEARISH (스윙/내부 각각)
state.last_event = BOS | CHoCH (+발생가, 발생봉, 확정봉)
state.order_blocks = [(고가, 저가, 방향, 생성봉), ...] 미소멸 목록
state.fvgs = [(상단, 하단, 방향), ...] 되메움 전 목록
state.zone = PREMIUM | EQUILIBRIUM | DISCOUNT
진입 후보 (불리시 시나리오 예시):
① 내부 CHoCH 상승 전환 AND
② 현재가가 디스카운트 존 AND
③ 가장 가까운 불리시 OB 상단 리테스트 (거리 ≤ k×ATR)
금지: 스윙 확정 전 값 사용 / HTF lookahead / 그리기 로직의 이식
파라미터 후보: 스윙 N ∈ {20,50} 내부 n ∈ {3,5,8} 존 경계 ∈ {5%,10%} k ∈ {0.5,1.0}내 봇과의 접점 — 그리고 검증 계획
번역을 끝내고 나면 흥미로운 사실이 드러난다. 내 봇은 SMC라는 단어를 한 번도 쓴 적이 없지만, 이미 SMC의 절반을 다른 이름으로 운용하고 있다. 과매도 눌림목 진입은 ‘디스카운트 존에서 산다’와 같은 문장이고, 저점근접 게이트(24시간 저점 대비 3.0, VV201 스윕 확정값)는 디스카운트 판정의 내 버전이다. BTC 4시간봉 하락장 레짐 차단(VV202)은 ‘상위 TF 구조가 베어리시면 롱 금지’와 같은 문장이다. 진입 기록에 레짐을 저장하기 시작한 것(VV164)은 SMC식으로 말하면 ‘구조 맥락의 스탬핑’이다. 개념은 수렴한다 — 살아남는 전략들이 비슷한 곳에 도달하는 것인지, 아니면 같은 상식의 다른 표기법인지는 열린 질문으로 남긴다.
그래서 이 지표에서 내 봇으로 가져와 검증할 가치가 있는 후보는 명확하다. 첫째, 내부 CHoCH를 반등 확인 게이트의 대체재로 — 현행 반등확인(저점 대비 반등률)과 5봉 내부 구조 전환 중 어느 쪽이 손절권 진입률을 더 낮추는가. 둘째, 오더블록 리테스트를 진입가 개선에 — 지정가를 현재가가 아니라 가장 가까운 불리시 OB 상단에 거는 변형. 셋째, EQL 근접을 감점 요인으로 — 같은 저점을 두 번 찍은 자리는 유동성 사냥의 표적이라는 가설의 실측. 검증 방법은 늘 그렇듯 하나다: 매매기록 위에서 전수 재현하고, 수익·승률·손절권이 동시에 개선될 때만(파레토 우세) 채택한다. 결과 숫자는 측정 후에만 적는다 — 이 문장은 이제 이 코너의 서명이다.
소회
500줄을 해부하고 남은 감상은 의외로 담백하다. SMC는 ‘스마트 머니’를 추적하지 않는다. 고점과 저점과 종가를 비교한다. 그런데 그게 실망스럽지 않다 — 오히려 그래서 쓸 만하다. 추적 불가능한 서사였다면 검증도 불가능했을 텐데, 비교문의 묶음이라면 내 매매기록 위에서 시험할 수 있다. 지표의 가치는 서사의 화려함이 아니라 판정식의 명료함에 있다.
그리고 이름에 대하여. ‘기관의 발자국’, ‘유동성 사냥’, ‘공정 가치’ — SMC의 용어들은 시장에 의도를 가진 주인공이 있다는 인상을 준다. 나는 461개 버전을 만들며 반대 방향으로 걸어왔다. 시장에 주인공이 있는지 나는 모른다. 내가 아는 것은 내 계좌의 체결 기록과, 그 위에서 측정된 조건부 기대값뿐이다. SMC의 판정식 중 몇 개가 그 기대값을 개선해 준다면 이름이야 뭐라 부르든 게이트에 들어올 것이고, 못 하면 아름다운 서사인 채로 남을 것이다.
리처드 와이코프는 백 년 전에 시장을 ‘컴포지트 맨’ — 모든 큰손을 합친 가상의 단일 행위자 — 이 움직이는 것처럼 읽으라고 가르쳤다. SMC는 그 오래된 렌즈의 현대판이다. 렌즈는 세상을 보는 도구이지 세상 그 자체가 아니다. 렌즈를 믿기 전에, 렌즈로 본 것을 측정하라.
참고: 이 글이 해부한 지표는 LuxAlgo의 Smart Money Concepts (CC BY-NC-SA 4.0)이다. 코드 전문은 라이선스와 지면을 존중해 싣지 않았으며, 본문의 판정식 설명은 공개 소스를 읽고 내 언어로 재서술한 것이다.