OpenClaw로 코인 자동매매 봇 만들기 — AI가 전략을 세우고, 봇이 실행한다
도입
요즘 OpenClaw를 맥미니에 올려두고 이것저것 시키고 있는데, 인스타나 쓰레드에 OpenClaw한테 코인 자동매매를 맡기는 걸 보고, “나도 하나 만들어볼까?”라는 생각이 들었다. (원래 코인은 손절하고 쳐다도 안 본다 했지만… 빗썸에서 가입만해도 무려 7만원을 준다고 하니 이걸로 한번 재미삼아 만들어보기로 했다. 초대코드를 입력하면 되는데 초대코드가 필요하시면 7FSJ306R3J를 입력해주세요ㅎ 광고아님.. 진짜 아님)
처음에는 빗썸 API를 OpenClaw가 사용할 수 있게 CLI로 프로젝트를 구성한 다음 OpenClaw에서 모든 걸 통제하려고 했다. 크론잡 1분 간격으로 시세 확인하고, 판단하고, 주문까지 다 하는 구조였는데… 1분마다 AI한테 물어보고 응답 기다리고 주문 넣는 구조는 현실적으로 말이 안 됐다. Ollama로 로컬 모델을 돌리자니 응답이 너무 느렸고, Google Gemini API를 연결했더니 1분마다 호출하는 API 비용이 무서웠다.
그래서 방향을 완전히 바꿨다. 정통적인 룰 기반 자동매매 봇을 따로 만들고, OpenClaw는 30분마다 시장 상황에 대한 정보를 수집해서 전략 파일만 수정하는 방식으로 역할을 분리했다.
목차
왜 역할을 분리했는가
처음 구상은 단순했다. OpenClaw가 CLI로 전부 다 하는 거다.
OpenClaw → 시세 확인 → AI 판단 → 주문 실행 → 반복
크론잡을 1분으로 걸어두고 매분 OpenClaw가 빗썸 API를 호출하고, 시세를 보고 “지금 사야 해? 팔아야 해?”를 판단하고, 그 결과에 따라 주문을 넣는 구조였다.
문제는 여러 가지가 있었다.
- Ollama 로컬 모델은 너무 느리다. 맥미니에서 돌리면 응답에 수십 초씩 걸리는데, 크론잡이 1분인데 응답이 1분을 넘기면 다음 크론잡과 겹쳐버린다. 이전 판단이 안 끝났는데 새 판단이 시작되는 거다.
- Google API도 겹침 문제는 마찬가지고, 비용까지 무섭다. 속도 문제를 해결하려고 Gemini API를 연결했는데, 빠를 때도 있지만 느릴 때는 마찬가지로 겹친다. 거기에 1분마다 호출하면 API 비용이 눈덩이처럼 불어난다.
- 1분 크론잡 조차 코인 매매에는 너무 느리다. 변동성이 클 때는 초 단위로 판단해야 할 때도 있다.
결론적으로, AI는 실행이 아니라 전략 쪽에 두는 게 맞다는 판단을 했다. 실제 매매는 빠르고 결정론적인 룰 기반 엔진이 하고, AI는 한 발 뒤에서 시장 상황을 분석하고 전략 파라미터를 조정하는 역할만 하는 거다.
전체 아키텍처
최종적으로 완성된 구조는 이렇다.
flowchart TD
subgraph mac["Mac Mini - 24/7 서버"]
direction TB
OC("OpenClaw
30분마다 뉴스 수집 및 분석")
JSON[("전략 설정 파일
JSON")]
BOT("자동매매 봇
Node.js 데몬")
end
BITHUMB{{"빗썸 거래소"}}
OC -- "파일 쓰기" --> JSON
JSON -- "매 윈도우마다 파일 읽기" --> BOT
BOT -- "REST API" --> BITHUMB
style OC fill:#6366f1,stroke:#4f46e5,color:#fff
style JSON fill:#f59e0b,stroke:#d97706,color:#fff
style BOT fill:#10b981,stroke:#059669,color:#fff
style BITHUMB fill:#ef4444,stroke:#dc2626,color:#fff
style mac fill:#1e293b,stroke:#475569,color:#e2e8f0,stroke-width:2px
핵심은 파일 기반 통신이다. OpenClaw와 매매 봇은 서로 직접 통신하지 않는다. OpenClaw가 JSON 설정 파일을 쓰면, 봇이 다음 실행 윈도우에서 그 파일을 읽어서 전략에 반영한다.
이 방식의 장점은 명확하다.
- 두 시스템이 완전히 독립적으로 돌아간다. OpenClaw가 죽어도 봇은 마지막 설정으로 계속 매매한다.
- AI 장애가 매매를 멈추지 않는다. 설정 파일 읽기에 실패하면 기본값으로 폴백한다.
- 업데이트가 안전하다. 설정 변경은 윈도우 경계에서만 적용되니까, 주문 도중에 전략이 바뀌는 일이 없다.
자동매매 봇의 구조
Node.js로 직접 만든 룰 기반 자동매매 봇이다. 빗썸 거래소를 대상으로 하고, 외부 의존성은 최소화했다.
실행 파이프라인
봇의 핵심 실행 흐름은 네 단계로 구성된다.
시세 수집 → 시그널 생성 → 리스크 검증 → 주문 실행
- 시세 수집: 빗썸에서 WebSocket과 REST API로 실시간 데이터와 캔들 데이터를 가져온다
- 시그널 생성: 룰 기반으로 매수/매도 시그널을 생성한다
- 리스크 검증: 시그널이 리스크 조건을 충족하는지 검증한다
- 주문 실행: 검증된 시그널에 따라 실제 주문을 넣는다
AI는 이 파이프라인에 직접 개입하지 않는다. 대신 오버레이라는 개념을 통해 포지션 크기(얼마나 살지)에만 영향을 준다. 언제 사고 팔지는 순수하게 룰 기반이다.
시그널 엔진
현재 두 가지 전략을 지원한다.
모멘텀 전략 (기본)
모멘텀 기반 진입/퇴출 전략이다. 쉽게 말하면, “최근 N개 캔들 대비 가격이 일정 비율 이상 올랐으면 매수, 일정 비율 이상 떨어졌으면 매도”하는 방식이다. 변동성에 따라 포지션 크기도 자동으로 조절한다.
돌파 전략
클래식한 돌파(breakout) 전략. 최근 N개 캔들의 고점/저점을 돌파하면 진입한다.
AI 오버레이 — OpenClaw와의 접점
오버레이가 바로 AI와 매매 봇이 만나는 지점이다.
OpenClaw가 시장을 분석하면 그 결과를 -1(극도 부정)에서 +1(극도 긍정) 사이의 점수로 표현한다. 봇은 이 점수를 포지션 크기에 곱하는 멀티플라이어로 변환한다.
예를 들어, 뉴스가 부정적이면 OpenClaw가 멀티플라이어를 0.3 정도로 낮춘다. 그러면 봇은 원래 매수할 양의 30%만 산다. 반대로 뉴스가 긍정적이면 1.4로 올려서 더 공격적으로 산다.
유효 기간 체크도 있다. 설정 파일이 일정 시간 이상 업데이트되지 않으면, 오버레이를 무시하고 기본값을 쓴다. OpenClaw가 멈춰도 봇이 오래된 오버레이에 묶이지 않도록 하는 안전장치다.
설정 파일 — OpenClaw와 봇의 통신 채널
JSON 설정 파일 하나가 두 시스템을 연결하는 전부다. 구조는 대략 이렇다.
{
"execution": {
"enabled": true,
"symbols": ["BTC_KRW", "ETH_KRW"],
"orderAmountKrw": 5000,
"dryRun": false
},
"strategy": {
"name": "momentum",
"candleInterval": "15m",
"lookback": 48,
"entryThreshold": 20,
"exitThreshold": 12
},
"overlay": {
"multiplier": 0.75,
"score": -0.25,
"regime": "risk_off"
},
"controls": {
"killSwitch": false
}
}
OpenClaw가 수정할 수 있는 영역은 크게 네 가지다.
| 섹션 | 역할 | 예시 |
|---|---|---|
execution | 매매 실행 설정 | 심볼 변경, 주문 금액 조절, dryRun 전환 |
strategy | 전략 파라미터 | 전략 변경, lookback 기간 조절 |
overlay | AI 오버레이 | 포지션 크기 멀티플라이어, 시장 레짐 |
controls | 긴급 제어 | 킬 스위치로 즉시 매매 중단 |
봇은 매 실행 윈도우(기본 5분) 시작 시점에 이 파일을 읽는다. 파일이 없거나 JSON이 깨져 있으면 기본값으로 폴백한다. 모든 값에 대해 타입 체크와 범위 검증을 하기 때문에, OpenClaw가 이상한 값을 써도 봇이 뻗지 않는다.
OpenClaw의 역할: 뉴스 수집과 전략 조정
OpenClaw는 30분마다 다음 작업을 수행한다.
- 뉴스/SNS 수집: 크립토 관련 뉴스, X(트위터) 타임라인, 텔레그램 채널 등에서 최신 정보를 수집한다
- 시장 심리 분석: 수집한 정보를 바탕으로 시장 심리를 분석한다
- 전략 조정 결정: 분석 결과에 따라 오버레이 멀티플라이어, 레짐(risk_on/risk_off), 전략 파라미터를 결정한다
- 설정 파일 업데이트: 결정된 값을 JSON 파일에 쓴다
예를 들어, “SEC가 비트코인 ETF 추가 승인”이라는 뉴스가 잡히면:
- 점수를 +0.5 이상으로 올리고
- 레짐을
risk_on으로 변경하고 - 멀티플라이어를 1.2 정도로 설정한다
반대로 “대형 거래소 해킹” 같은 뉴스가 잡히면:
- 점수를 -0.8로 내리고
- 레짐을
risk_off로 변경하고 - 심한 경우 킬 스위치를 켜서 매매를 완전히 중단한다
핵심은 OpenClaw가 “지금 사라/팔아라”를 직접 지시하지 않는다는 점이다. 시장 분위기가 어떤지를 숫자로 표현할 뿐이고, 실제 매매 판단은 봇의 시그널 엔진이 한다.
정리
처음에 OpenClaw로 전부 다 하려던 구상에서, “AI는 전략, 봇은 실행”으로 역할을 분리한 게 가장 큰 전환점이었다.
정리하면 이런 구조다.
- 자동매매 봇: 룰 기반 데몬. 빗썸에서 실시간 데이터를 받아서 시그널 → 리스크 → 실행 파이프라인을 돌린다.
- OpenClaw: 30분마다 뉴스/SNS를 수집하고, 시장 심리를 분석해서 전략 설정 파일을 업데이트한다.
- JSON 설정 파일: 두 시스템을 연결하는 유일한 통신 채널. 전략 파라미터, 오버레이, 킬 스위치를 담고 있다.
AI가 매매 실행 경로에 직접 들어가지 않기 때문에, OpenClaw가 느려도, 이상한 판단을 해도, 심지어 죽어도 봇은 안정적으로 돌아간다. 이 디커플링이 이 시스템의 핵심이다.
아직 실매매 데이터가 쌓이는 중이라 수익률 얘기는 이르지만, 구조적으로는 꽤 만족스럽다고 생각한다. 다음에는 실제 매매 결과와 전략 조정 사례들을 공유해봐야겠다.
피드백은 언제나 환영입니다. 😊