
3월 14일, 트레이딩봇 v4가 PAPER에서 LIVE 모드로 전환되었다. 시뮬레이션에서는 수천 번 돌려봤지만, 실제 돈이 걸린 첫 주는 전혀 다른 경험이었다.
결론부터 말하면 — 숏 포지션 +4.47% 익절 성공, 하지만 과정은 순탄치 않았다. 이 글에서는 LIVE 첫 주의 모든 것을 투명하게 기록한다.
v4 전략 요약
v4 “듀얼 익절” 전략의 핵심을 간단히 정리하면:
| 항목 | 내용 |
|---|---|
| 코인 | BTC 단일 |
| 구조 | 업비트 현물 롱 + 바이빗 1x 숏 동시 진입 |
| DCA | Phase 1(탐색) → Phase 2(집중) 2단계 |
| 익절 | 지정가(높은 목표) + 크론(안전망) 이중 구조 |
| 감성 | 4시간마다 뉴스 분석 → 포지션 비중 조절 |
| 원금 | 총 300만원 (각 거래소 150만) |
올라도 내려도 한쪽은 수익. 수익 쪽 먼저 익절하고, 손실 쪽은 DCA로 평단 회복. 이것이 v4의 철학이다.
LIVE 전환 — D-Day (3/14)
전환 직전 스냅샷
LIVE 전환 시점의 거래소 잔고:
| 거래소 | 잔고 | 포지션 |
|---|---|---|
| 업비트 | KRW 잔고 확보 완료 | 없음 (PAPER 잔여분 정리 완료) |
| 바이빗 | USDT 잔고 확보 완료 | 없음 |
깨끗한 상태에서 시작. 모드 전환 시 반드시 기존 포지션을 정리해야 한다는 교훈을 PAPER 기간에 이미 배웠다.
첫 진입 (3/14 21시 크론)
21시 크론 실행 → 롱+숏 동시 진입… 했어야 했는데, 문제가 터졌다.
버그 #1 — Bybit step_size 위반
LIVE 첫 실행에서 숏 진입이 실패했다.
Bybit Error: Qty invalid (step_size violation)
원인: 바이빗은 BTC 주문 수량을 0.001 단위로만 받는다. Python의 round(qty, 5) 함수가 0.00105처럼 5자리까지 반올림한 값을 보내면서 거부당한 것.
수정: round() → math.floor(qty * 1000) / 1000으로 변경. 항상 0.001 단위로 내림 처리한다.
# Before (실패)
qty = round(amount / price, 5) # 0.00105 → 거부
# After (성공)
qty = math.floor(amount / price * 1000) / 1000 # 0.001 → 통과
시뮬레이션에서는 수량 정밀도를 검증하지 않았기 때문에 LIVE에서만 발견되는 버그였다.

버그 #2 — 바이빗 최소 주문금액
step_size를 고치니 다음 문제가 나타났다. 최소 주문 수량 0.001 BTC(당시 약 10.5만원)인데, DCA 1회 금액이 2만원으로 설정되어 있었다.
0.001 BTC를 사려면 최소 10.5만원이 필요한데, 2만원짜리 주문을 넣으니 수량이 0.00019가 되고, 내림하면 0.000 → 주문 불가.
조치: Phase 1 DCA 금액을 전면 변경.
| 변경 전 | 변경 후 |
|---|---|
| 2만원 × 15회 = 30만 | 11만원 × 3회 = 33만 |
3만원 증가지만, 양쪽 거래소 모두 최소주문을 충족하게 되었다. 라운드 #1도 초기화하고 다시 시작.
버그 #3 — 익절 지정가 미등록
진입은 성공했는데, 익절 주문이 거래소에 등록되지 않았다. 크론이 4시간마다 돌면서 가격만 체크하는 방식이었는데, 지정가 주문 등록 실패 시 재시도 로직이 없었다.
수정: 매 크론 실행마다 거래소에 TP(Take Profit) 주문이 있는지 확인하고, 없으면 자동 재등록하는 로직 추가.
# 매 실행마다 TP 주문 존재 여부 확인
if not has_tp_order(exchange):
place_tp_limit_order(exchange, position)
# 실제 거래소 잔고 기준으로 수량 결정
실전 결과 — 숏 익절 +4.47%
버그를 모두 수정한 후, 봇은 정상 작동하기 시작했다.
타임라인
| 날짜 | 이벤트 | 상세 |
|---|---|---|
| 3/14 16시 | 롱+숏 P1 #1 진입 | 양쪽 11만원씩 |
| 3/16 20시 | 롱 P1 #3 완료 | Phase 1 종료 (33만 투입) |
| 3/18 12시 | 숏 P1 #2 진입 | 감성 BEARISH 전환 |
| 3/19~ | 숏 트레일링 활성화 | 가격 하락 시작 |
| 3/20 | 숏 익절 +4.47% 🎉 | 트레일링 스탑 작동 |
| 3/20 | 롱 Phase 2 #1 진입 | 손실쪽 DCA 시작 |
현재 포지션 상태 (3/21 기준)
| 포지션 | 상태 | 투자금 | 수익률 |
|---|---|---|---|
| 숏 | ✅ 익절 완료 | 22만 | +4.47% |
| 롱 | 🔄 Phase 2 DCA #1 | 약 65만 | 진행 중 |
숏이 먼저 익절되면서, 롱은 Phase 2로 전환되어 DCA 물타기 중이다. v4 전략이 설계대로 작동하고 있다.

감성 분석 변동
7일간 감성 분석 히스토리:
| 기간 | 감성 | 스코어 범위 |
|---|---|---|
| 3/14~17 | STRONG_BULLISH → BULLISH | +0.52 → +0.05 |
| 3/18~19 | BEARISH | -0.28 ~ -0.32 |
| 3/19 저녁~ | BULLISH 복귀 | +0.42 |
| 3/20~ | NEUTRAL | -0.18 ~ +0.18 |
감성이 BULLISH → BEARISH → NEUTRAL로 한 바퀴 돈 셈이다. 숏 익절은 BEARISH 구간에서 가격이 내려갈 때 트레일링이 작동하면서 이루어졌다. 감성 분석이 타이밍에 실질적 영향을 준 첫 사례다.
1주차 교훈 — 시뮬레이션으로는 못 배우는 것들
1. 거래소 API는 시뮬레이터보다 까다롭다
step_size, 최소주문금액, 호가 단위… 시뮬레이터에서는 신경 쓰지 않는 제약들이 LIVE에서는 주문 실패로 이어진다. LIVE 전환 전에 거래소 API 제약사항을 전수 점검해야 한다.
2. 실패 → 재시도 로직은 필수
네트워크 지연, API 일시 에러 등으로 주문이 실패할 수 있다. “성공을 가정”하지 말고, 매 실행마다 상태를 확인하고 누락분을 복구하는 방어적 프로그래밍이 필요하다.
3. 최소주문 단위가 전략을 바꿀 수 있다
바이빗 최소 0.001 BTC ≈ 10.5만원. 소액 분할매수 전략이 최소주문 제약에 부딪히면 DCA 설계 자체를 변경해야 한다. 전략 설계 단계에서 거래소 제약을 반영해야 한다.
4. 라운드 초기화를 잊으면 안 된다
PAPER → LIVE 전환 시 기존 상태가 남아있으면 봇이 혼란에 빠진다. 모드 전환 = 라운드 초기화 + 거래소 포지션 확인 + 잔여분 정리를 체크리스트로 관리한다.
다음 주 전망
롱 Phase 2가 진행 중이다. 현재 DCA 1회차이며, 최대 4회까지 가능하다. BTC 가격이 현재 수준에서 크게 벗어나지 않는다면, 평단 회복 후 익절을 기대할 수 있다.
감성은 현재 NEUTRAL. 큰 방향성 없이 횡보하는 구간에서는 v4의 양방향 구조가 강점을 발휘한다.
마무리
LIVE 첫 주는 “실전은 다르다”를 온몸으로 체감한 시간이었다. 3000회 시뮬레이션에서 한 번도 안 터진 버그가 LIVE 첫날 3개나 터졌다.
그래도 결과는 긍정적이다. 숏 +4.47% 익절은 v4 전략의 첫 실전 검증이다. “올라도 내려도 한쪽은 수익”이라는 설계 철학이 작동함을 확인했다.
다음 리포트에서는 롱 Phase 2의 결과와, 라운드 #1의 최종 성적을 공유할 예정이다.
📌 이 시리즈는 실제 자금으로 운영 중인 트레이딩봇의 투명한 기록입니다. 수익이든 손실이든 있는 그대로 공개합니다. 투자 조언이 아니며, 모든 투자의 책임은 본인에게 있습니다.