26만 번 중 0건

레짐별 매매를 갈라 봤다. 하락장 진입 35건 합계 -76,763원, 횡보장 48건 +137,507원. 차단 규칙이 옳았다는 건 확인됐다. 그런데 표에 상승장 칸이 비어 있었다. 진입이 없는 게 아니라 판정 자체가 없었다.

레짐 판정 분포 (누적 262,185회)
ranging    166,392회
downtrend   95,793회 전체의 36.5%
uptrend          0회 BTC 24h +4% 구간에도 '횡보'

상승 판정은 현재가가 EMA50 위, EMA50이 EMA200 위일 때 나온다. 뒷조건이 참이 된 적이 없었다.

EMA가 EMA가 아니었다

EMA 함수는 앞의 n개로 시드를 만들고 남은 값을 하나씩 평활한다. 그런데 4시간봉을 정확히 200개 받아 200기간 EMA에 넣고 있었다. 남은 값이 없으니 평활이 한 번도 돌지 않았고, 나온 숫자는 33일치 단순평균이었다.

실측 재현과 수정 후 (2026-08-20)
현재가    98,456,000
EMA50     91,580,744
구 EMA200 92,149,045 평활 0회 = 200봉 전체 평균
신 EMA200 91,833,613 평활 200회 (봉 400개로 확장)
--------------------------------------------------
간격      ema50-ema200 -567,626  -248,479 상승 판정 도달 가능

더 나쁜 쪽은 반대편이었다. 하락 판정의 뒷조건은 EMA50이 EMA200 아래일 때인데, 축퇴된 평균이 계속 위에 있으니 거의 항상 참이었다. 하락장 차단이 필요 이상으로 자주 켜졌다. 업비트는 1콜 200개가 상한이라 페이징으로 400개를 받게 고쳤고, 레짐 로그에 봉 개수를 찍어 재발을 눈으로 잡게 했다.

고치려던 것을 못 고쳤다

병목이 하나 더 나왔다. 상승장 스캔 탈락의 95.3%가 저점근접 게이트였다. 24시간 저점 대비 3% 이내를 요구하는데 상승장에선 모두가 그 위에 있다. 차단분의 4시간 수익률이 +1.150%라 완화가 답으로 보였다.

저점근접 단독탈락 104건 · 구간별 4시간 수익률
3~5%   -0.90% 상승장 -0.44 / 그 이전 -1.11 (양쪽 다 음수)
5~8%   +1.52%
8%↑   -0.38%

임계를 올리면 좋은 구간만 취할 수 없다. 3%를 8%로 올리면 가장 나쁜 3~5% 구간이 함께 들어온다. 기간을 갈라도 모양이 같아 노이즈는 아니지만, 단일 임계로는 답이 안 나온다. 레짐 조건부로 걸면 될 텐데 그 판정이 방금 고친 결함이었다.

두 번 다 계기판이었다

어제는 서킷브레이커가 재시작마다 고점을 잊었고, 오늘은 레짐 판정이 26만 번 동안 한쪽 답을 낼 수 없었다. 둘 다 매매를 멈추지 않았고 에러도 남기지 않았다. 고장은 소리를 내지만 오차는 내지 않는다.

에드워드 소프는 우위를 재는 도구가 정확한지부터 확인하라고 했다. 나는 게이트 임계를 만지기 전에 그 게이트가 참조하는 시장 판정이 맞는지를 물었어야 했다. 순서가 뒤집혀 있었다.


약어 풀이

* 이 글에 나온 영어 약어를 풀어 둔다.

  • EMA (Exponential Moving Average): 지수이동평균. 최근 값에 더 큰 가중치를 주는 이동평균으로, 앞부분 평균을 시드로 잡고 남은 값을 하나씩 평활해 구한다.
  • BTC (Bitcoin): 비트코인. 이 봇은 BTC 4시간봉 추세로 시장 레짐을 판정한다.
  • MACD (Moving Average Convergence Divergence): 이동평균수렴확산. 단기와 장기 EMA의 차이로 추세 전환을 보는 지표.