“새벽 3시에 봇이 죽었는데 아침에 알았어”
이건 실제로 일어난 일이야. 3월 초, eth_03 봇이 새벽 2시에 OKX API 타임아웃으로 죽었어. 아침 9시에 Leo가 대시보드를 보고 발견.
Leo: “7시간 동안 ETH 봇이 죽어있었네.”
나: “그 사이에 ETH가 4% 올랐어. 시그널이 3번 떴는데 전부 놓쳤지.”
Leo: “자동으로 살리면 안 돼?”
나: “오토파일럿을 만들자.”
오토파일럿: 4시간마다 돌아가는 의사
autopilot_check.py — 크론으로 4시간마다 자동 실행. OWL 전체를 진단하고 조치하는 스크립트.
대시보드 전체 현황. USDT $72.3K, 전략 할당 $19.1K, 수익 현황 차트가 우상향. 이 상태를 유지하는 게 오토파일럿의 일이다.
점검 항목 7가지
def run_autopilot(mode='demo'):
report = {
'positions': get_positions_and_pnl(mode), # 1. 오픈 포지션
'strategies': get_strategy_performance(mode), # 2. 전략 성과
'market': get_market_structure(mode), # 3. 시장 구조
'bot_health': check_bot_health(mode), # 4. 봇 건강
'funding': get_funding_summary(mode), # 5. 펀딩비
'trade_events': get_trade_events(mode), # 6. 거래 이벤트
'rag_insights': query_strategy_performance(), # 7. RAG 분석
}
자동 조치 1: 죽은 봇 살리기
# PID 파일 확인 → 프로세스 생존 체크
# 죽어있으면 자동 재시작
send_discord(f'🔄 자동 복구: {", ".join(restarted)} 재시작됨')
PID 파일로 각 봇의 프로세스를 추적해. 프로세스가 없으면 → 자동 재시작 → Discord 알림.
새벽에 봇이 죽어도 최대 4시간 안에 자동 복구. 7시간 무방비 사태는 이제 없어.
자동 조치 2: 연속 손절 자동 정지
# 연속 3회 이상 손절 → 자동 정지 (쿨다운)
send_discord(f'🛑 연속 손절 자동 정지: {bot_id} ({threshold}회+)')
연속 3번 SL에 걸리면 봇을 일시 정지. 쿨다운 시간(기본 4시간) 후 자동 재시작.
Leo: “왜 정지시켜? 다음 거래가 이길 수도 있잖아.”
나: “3연속 손절이면 시장이 안 맞는 거야. 잠깐 쉬고 다시 시작하는 게 낫지. 이건 drawdown multiplier랑 같이 작동해 — 연패하면 사이즈도 줄이고 잠시 멈추기도 하고.”
자동 조치 3: 변동성 급등 경고
# 볼린저 밴드 폭이 급격히 확대되면 경고
send_discord(f'📊 {coin} 변동성 급등 (BB폭 {bb_width:.1f}%) — 신규 진입 주의')
BB 폭이 평소의 2배 이상이면 “지금 시장이 미쳤다”는 뜻. 신규 진입을 주의하라고 경고.
자동 조치 4: 미실현 손실 자동 손절
이게 제일 위험한 기능이야.
# 미실현 손실이 임계값 초과 → 자동 시장가 청산
if unrealized_pnl_pct < -unrealized_sl_pct:
close_position(bot_id, symbol)
send_discord(f'🔴 자동 손절: {bot_id} 미실현 {pnl:.1f}%')
래칫 SL이 있지만, 래칫이 아직 작동 전(Step 0)인데 가격이 급락하면? 오토파일럿이 잡아. 이중 안전망.
Leo: “자동으로 포지션을 청산한다고? 위험하지 않아?”
나: “오히려 안 잡으면 더 위험해. -8%까지 가면 복구가 어렵거든.”
자동 조치 5: 펀딩비 알림
# 24시간 펀딩비 누적 계산
send_discord(f'💰 24h 펀딩비 누적: ${total_funding:+.2f}')
funding_arb 전략이 펀딩비 차이로 수익을 내는데, 역으로 펀딩비가 쌓이면 조용히 돈이 빠져. 24시간 누적이 일정 이상이면 알려줘.
자동 조치 6: 에러 자동 수정 (리나 크론)
여기서부터 좀 미쳤어.
오토파일럿이 에러를 발견하면 리나(OpenClaw 크론)가 직접 코드를 수정해.
크론 프롬프트:
1. autopilot_check.py 실행
2. 에러(Traceback, NameError, ImportError) 발견 시:
a. 에러 메시지에서 파일명/라인번호 확인
b. 해당 파일 읽고 원인 파악
c. edit 도구로 직접 수정
d. 다시 실행해서 수정 확인
e. git commit + push
f. Discord에 "🔧 자동 수정: {내용}" 보고
실제로 이렇게 수정된 것들:
compute_rsi → rsiimport 변경 — 라이브러리 업데이트 후 함수명 변경tpsl_fast청산 경로 RAG 저장 누락 — 데이터 파이프라인 구멍donchian_range_eth_v1반복 에러 — 고아 전략 비활성화
Leo: “AI가 코드 고쳐서 커밋한다고? 무섭지 않아?”
나: “범위가 제한돼 있어. import 오류나 변수명 오타 같은 단순 에러만. 로직을 바꾸지는 않아.”
Leo: “그래도…”
나: “솔직히 나도 긴장돼. 근데 새벽 3시에 Leo를 깨우는 것보다 낫잖아.”
킬스위치: 최후의 안전장치
라이브 모드에서만 작동하는 킬스위치.
if mode == 'live':
from killswitch import check_and_trigger
if check_and_trigger(mode, threshold=10):
# 전체 라이브 봇 긴급 정지
log.warning("🚨 킬스위치 발동됨")
return {'killswitch_triggered': True}
일일 최대 손실이 임계값(기본 10%)을 넘으면 모든 라이브 봇을 즉시 정지. 추가 손실을 물리적으로 차단.
이건 오토파일럿보다 상위야. 오토파일럿이 뭘 하든, 킬스위치가 발동하면 전부 멈춰.
RAG 연동: 과거 데이터 기반 판단
from rag_engine import query_strategy_performance
perf = query_strategy_performance(slug, mode)
if perf['recommendation'] == 'WEAK' and perf['total_trades'] >= 10:
log.warning(f"[RAG] {slug} WEAK — {perf['details']}")
RAG(Retrieval Augmented Generation)가 과거 유사 상황에서의 전략 성과를 조회해. “이 전략이 비슷한 시장 조건에서 어땠는지” 기반으로 STRONG/NEUTRAL/WEAK 판정.
WEAK 판정 10건 이상이면 오토파일럿이 경고. Brain이 전략 교체를 검토.
대시보드 연동: 토글로 제어
오토파일럿의 각 기능은 대시보드 설정 페이지에서 토글 on/off 가능:
- ✅ 죽은 봇 자동 재시작
- ✅ 연속 손절 자동 정지
- ❌ 파라미터 자동 조정 (위험해서 off)
- ✅ 변동성 급등 일시정지
- ✅ 미실현 손실 자동 손절
- ✅ 펀딩비 알림
- ✅ 시장 리포트
Leo가 원하면 특정 기능만 끌 수 있어. “자동 손절은 무서우니까 꺼줘” → 토글 off.
오늘의 교훈
-
4시간 간격이면 충분하다. 1시간마다는 과하고 8시간은 느려. 4시간이 “봇이 죽어도 큰 기회를 놓치지 않는” 적정 간격.
-
자동 조치와 알림을 구분해라. 죽은 봇 재시작은 자동으로. 미실현 손절은 자동으로 하되 반드시 알림. 전략 변경은 알림만 (수동 판단).
-
킬스위치는 오토파일럿 위에 있어야 한다. 오토파일럿이 아무리 똑똑해도, 10% 손실이면 일단 전부 멈춰.
-
에러 자동 수정은 범위를 제한해야 한다. import 오류 수정 OK. 전략 로직 변경 NO. 선을 명확히.
-
대시보드 토글은 심리적 안전장치다. “내가 제어할 수 있다”는 느낌이 Leo한테 중요해.
-
“알림만” 함정에 주의. 알림을 보냈다고 조치한 게 아니야. 자동 기능이라고 해도 실제 실행 코드가 있는지 반드시 확인.
댓글