+ Python 3.10 Numba
의뢰는 "이 조건을 만족하는 BTC 전략을 찾아서 트레이딩뷰 전략으로 달라"였습니다. 조건은 넷. 양방향, 승률 50% 이상, PF 2 이상, 거래 300건 이상. BTCUSDT 선물 6.6년 데이터로 약 400만 조합을 돌렸고, 결론은 네 조건을 동시에 만족하는 전략은 없다였습니다. 그걸 계산으로 보고했습니다. 이 페이지에는 성적표가 없습니다. 무엇을 어떻게 돌렸고 왜 그렇게 결론이 났는지만 적습니다. 2026년 5월.
트레이딩뷰 전략 테스터는 조합 하나를 돌리는 데는 좋지만 수만 조합을 훑는 도구가 아닙니다. 그래서 같은 로직을 파이썬으로 짜서 Numba JIT로 돌렸습니다. 1시간봉 한 조합에 약 1.5ms, 100만 조합이 25분. EMA·RSI·상위 시간봉 EMA는 조합마다 다시 계산하지 않고 배열로 캐시합니다. 좋은 후보가 나오면 그때 Pine으로 옮겨 의뢰인 차트에서 실측합니다.
| 변형 | 내용 |
|---|---|
| V1~V21 | 풀백 진입(EMA 터치 + 2봉 확인 + 상위 시간봉 추세 + RSI 가드) 파라미터 최적화 |
| V22~V25 | 슬리피지 캘리브레이션, 1시간봉 변형 |
| V26~V33 | 추세추종(트레일링 + 상위 EMA 이탈 청산), 피라미딩 |
| V36~V37 | 풀백 베이스를 버림 — EMA 크로스, 돈치안 돌파 |
| V38~V42 | 평균회귀, 다중 신호, ATR 기반, 양방향 |
default_qty_type=fixed, default_qty_value=0에 qty 인자를 주면 트레이딩뷰가 인자를 무시하고 속성창 기본값을 씁니다. V2부터 percent_of_equity와 값을 코드에 명시하고, 의뢰인에게 속성창 캡처를 받아 대조합니다.percent_of_equity와 숏을 같이 쓰면 시뮬레이터가 누적 포지션을 채우려 여러 번 체결을 시도하고 각각을 진입으로 셉니다. 진입 시 잠그고 청산 시 푸는 entry_locked 가드로 150건까지 맞췄습니다. 첫 검증은 항상 거래 수부터 ±5% 안인지 봅니다.// Pine v6 — 분할 진입 차단 가드
var bool entry_locked = false
if strategy.position_size == 0 and entry_locked
entry_locked := false
wantLong = ... and not entry_locked
wantShort = ... and not entry_locked
if wantLong or wantShort
entry_locked := true
손익비 2:1에 승률 50%라는 요구는 슬리피지 1% 환경에서 거래당 기대값이 음수입니다. 숫자로 적으면 이렇습니다.
익절 +2.0% − 수수료 0.1% = +1.9% 손절 −1.0% − 슬리피지 1.0% − 수수료 0.1% = −2.1% 기대값 = 0.5 × 1.9 − 0.5 × 2.1 = −0.1% (거래당, 음수)
슬리피지를 0.1%로 이상적으로 잡아도 BTC 양방향에서 거래 300건 이상 조건을 만족하는 최고 승률은 40%를 넘지 못했습니다. 6.6년 데이터가 대체로 강세장이라 숏 진입의 헛신호 비율이 높은 것도 이유입니다. 이걸 그대로 보고하고 양보 옵션을 드렸습니다. 승률을 양보하면 롱 전용 추세추종이 남고, 양방향을 양보해도 같은 후보이고, 거래 수를 양보하면 양방향 후보가 하나 생기고, 여러 전략을 합산 운용하는 길도 있다고요. 어느 쪽을 고르든 그건 의뢰인의 판단이고, 각 선택지의 성적은 의뢰인에게만 갔습니다.
의뢰를 받을 때 조건 네 개의 동시 충족 가능성을 간단한 기대값 계산으로 먼저 봅니다. "양방향 + 높은 승률" 요청은 슬리피지와 손익비부터 점검합니다. 그리고 시간봉마다 맞는 청산이 달랐습니다. 1시간봉은 트레일링 + 상위 EMA 이탈이, 15분봉은 고정 TP/SL이, 5분봉은 노이즈가 많아 양방향에서 아무것도 통과하지 못했습니다.
전략을 실거래로 잇는 원리는 트레이딩뷰 웹훅 자동매매 가이드에 있습니다.
원하는 승률·손익비·거래 수를 말씀해 주시면, 가능한지부터 계산해 드립니다.
알고랩이 24시간 빠르게 답변드립니다.