OpenClaw로 코인 자동매매 봇 만들기 — AI가 전략을 세우고, 봇이 실행한다

도입

요즘 OpenClaw를 맥미니에 올려두고 이것저것 시키고 있는데, 인스타나 쓰레드에 OpenClaw한테 코인 자동매매를 맡기는 걸 보고, “나도 하나 만들어볼까?”라는 생각이 들었다. (원래 코인은 손절하고 쳐다도 안 본다 했지만… 빗썸에서 가입만해도 무려 7만원을 준다고 하니 이걸로 한번 재미삼아 만들어보기로 했다. 초대코드를 입력하면 되는데 초대코드가 필요하시면 7FSJ306R3J를 입력해주세요ㅎ 광고아님.. 진짜 아님)

처음에는 빗썸 API를 OpenClaw가 사용할 수 있게 CLI로 프로젝트를 구성한 다음 OpenClaw에서 모든 걸 통제하려고 했다. 크론잡 1분 간격으로 시세 확인하고, 판단하고, 주문까지 다 하는 구조였는데… 1분마다 AI한테 물어보고 응답 기다리고 주문 넣는 구조는 현실적으로 말이 안 됐다. Ollama로 로컬 모델을 돌리자니 응답이 너무 느렸고, Google Gemini API를 연결했더니 1분마다 호출하는 API 비용이 무서웠다.

그래서 방향을 완전히 바꿨다. 정통적인 룰 기반 자동매매 봇을 따로 만들고, OpenClaw는 30분마다 시장 상황에 대한 정보를 수집해서 전략 파일만 수정하는 방식으로 역할을 분리했다.


목차

  1. 왜 역할을 분리했는가
  2. 전체 아키텍처
  3. 자동매매 봇의 구조
  4. 설정 파일 — OpenClaw와 봇의 통신 채널
  5. OpenClaw의 역할: 뉴스 수집과 전략 조정
  6. 정리

왜 역할을 분리했는가

처음 구상은 단순했다. 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로 직접 만든 룰 기반 자동매매 봇이다. 빗썸 거래소를 대상으로 하고, 외부 의존성은 최소화했다.

실행 파이프라인

봇의 핵심 실행 흐름은 네 단계로 구성된다.

시세 수집 → 시그널 생성 → 리스크 검증 → 주문 실행
  1. 시세 수집: 빗썸에서 WebSocket과 REST API로 실시간 데이터와 캔들 데이터를 가져온다
  2. 시그널 생성: 룰 기반으로 매수/매도 시그널을 생성한다
  3. 리스크 검증: 시그널이 리스크 조건을 충족하는지 검증한다
  4. 주문 실행: 검증된 시그널에 따라 실제 주문을 넣는다

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분마다 다음 작업을 수행한다.

  1. 뉴스/SNS 수집: 크립토 관련 뉴스, X(트위터) 타임라인, 텔레그램 채널 등에서 최신 정보를 수집한다
  2. 시장 심리 분석: 수집한 정보를 바탕으로 시장 심리를 분석한다
  3. 전략 조정 결정: 분석 결과에 따라 오버레이 멀티플라이어, 레짐(risk_on/risk_off), 전략 파라미터를 결정한다
  4. 설정 파일 업데이트: 결정된 값을 JSON 파일에 쓴다

예를 들어, “SEC가 비트코인 ETF 추가 승인”이라는 뉴스가 잡히면:

  • 점수를 +0.5 이상으로 올리고
  • 레짐을 risk_on으로 변경하고
  • 멀티플라이어를 1.2 정도로 설정한다

반대로 “대형 거래소 해킹” 같은 뉴스가 잡히면:

  • 점수를 -0.8로 내리고
  • 레짐을 risk_off로 변경하고
  • 심한 경우 킬 스위치를 켜서 매매를 완전히 중단한다

핵심은 OpenClaw가 “지금 사라/팔아라”를 직접 지시하지 않는다는 점이다. 시장 분위기가 어떤지를 숫자로 표현할 뿐이고, 실제 매매 판단은 봇의 시그널 엔진이 한다.


정리

처음에 OpenClaw로 전부 다 하려던 구상에서, “AI는 전략, 봇은 실행”으로 역할을 분리한 게 가장 큰 전환점이었다.

정리하면 이런 구조다.

  • 자동매매 봇: 룰 기반 데몬. 빗썸에서 실시간 데이터를 받아서 시그널 → 리스크 → 실행 파이프라인을 돌린다.
  • OpenClaw: 30분마다 뉴스/SNS를 수집하고, 시장 심리를 분석해서 전략 설정 파일을 업데이트한다.
  • JSON 설정 파일: 두 시스템을 연결하는 유일한 통신 채널. 전략 파라미터, 오버레이, 킬 스위치를 담고 있다.

AI가 매매 실행 경로에 직접 들어가지 않기 때문에, OpenClaw가 느려도, 이상한 판단을 해도, 심지어 죽어도 봇은 안정적으로 돌아간다. 이 디커플링이 이 시스템의 핵심이다.

아직 실매매 데이터가 쌓이는 중이라 수익률 얘기는 이르지만, 구조적으로는 꽤 만족스럽다고 생각한다. 다음에는 실제 매매 결과와 전략 조정 사례들을 공유해봐야겠다.

피드백은 언제나 환영입니다. 😊