
몇 년 전 자동매매를 처음 돌렸을 때, 매수 신호보다 먼저 확인한 건 주문이 두 번 들어가지 않는지였다. 가격 조건은 맞았는데 응답이 늦어 같은 주문을 다시 보내면, 전략이 맞아도 포지션은 계획의 두 배가 된다. 코인 자동매매 만들기는 신호를 찾는 일인 동시에 주문과 손실을 통제하는 일이다.
1. 매매 규칙을 숫자로 고정한다
‘거래량이 늘면 산다’는 프로그램으로 옮기기 어렵다. 예를 들어 비트코인 원화 마켓에서 최근 완료된 1시간 봉의 거래량이 직전 20개 봉 평균의 2배 이상이고, 종가가 20개 봉 평균 가격 위에 있을 때만 매수한다고 적어야 한다. 신호를 계산할 때는 아직 끝나지 않은 봉을 빼야 한다. 봉이 닫히기 전에는 거래량과 종가가 계속 바뀌기 때문이다.
매도 조건도 같은 수준으로 정한다. 진입가 대비 2% 하락하면 손절하고, 3% 상승하면 절반을 매도하는 식이다. 이 수치는 수익을 보장하는 추천값이 아니라 규칙을 명확히 쓰기 위한 예시다. 횡보장에서 거래량 신호가 여러 번 나오면 연속 손절이 날 수 있으니, 재진입까지 기다릴 시간과 하루 최대 거래 횟수도 함께 정한다.
2. 온체인 지표는 가격 신호와 역할을 나눈다
온체인 데이터를 붙인다면 거래소 입금량, 대규모 보유자 이동, 스테이블코인 공급 변화를 후보로 볼 수 있다. 다만 거래소 지갑으로 코인이 들어왔다고 곧바로 매도 물량이 되는 건 아니다. 거래소 내부 지갑 이동일 수도 있고, 실제 매도는 훨씬 뒤에 나올 수도 있다. 지갑 분류가 수정되면 과거 수치까지 달라지는 경우도 있다.
나는 온체인 수치를 단독 매수·매도 버튼으로 쓰기보다 위험 필터로 둔다. 가령 거래소 순유입이 최근 30일 분포의 상단에 있고 현물 매도 거래량도 동시에 늘 때 신규 매수를 쉬게 하는 방식이다. 이때 두 데이터의 집계 시각을 맞춰야 한다. 오늘 확인한 온체인 수치를 어제의 가격 결정에 적용하면 백테스트에 미래 정보가 섞인다. 체인별 전송 확정 시간과 데이터 제공 서비스의 갱신 간격도 기록해 둔다.
3. 프로그램은 주문 상태부터 추적한다
기본 흐름은 시세 수집, 신호 계산, 주문 전 점검, 주문 제출, 체결 확인, 잔고 대조다. 이 중 체결 확인을 빼면 위험하다. 주문 접수 응답은 전량 체결을 뜻하지 않는다. 업비트 주문 문서에도 대기·완료·취소 상태와 체결 수량, 남은 수량이 따로 표시된다. 부분 체결 뒤 남은 주문을 어떻게 처리할지까지 코드에 넣어야 한다.
주문마다 고유 식별자를 붙이고 전송 시각, 요청 수량, 응답, 실제 체결 수량을 저장한다. 연결이 끊겼다가 돌아오면 새 주문을 내기 전에 기존 주문과 잔고부터 조회한다. 업비트는 사용자가 지정한 주문 식별자로 주문을 조회할 수 있다. 이 과정이 있어야 통신 오류를 주문 실패로 오해해 중복 매수하는 일을 줄일 수 있다.
API 키에는 잔고 조회와 주문에 필요한 권한만 주고 출금 권한은 제외한다. 업비트 안내에 따르면 인증이 필요한 거래 API는 허용 IP를 등록한 고정 IP 환경에서 사용한다. 키를 코드 파일에 직접 적거나 공개 저장소에 올리지 않는 것도 기본이다. 오류가 반복될 때는 무한 재시도보다 주문을 멈추고 알림을 보내는 편이 안전하다.
4. 손실 한도를 주문 금액보다 먼저 정한다
운용금 100만 원에서 한 번의 거래로 감수할 손실을 1%, 즉 1만 원으로 잡았다고 하자. 손절 폭이 2%라면 단순 계산상 주문 규모는 50만 원이다. 하지만 수수료와 가격 미끄러짐이 더해지면 실제 손실은 1만 원을 넘을 수 있다. 그래서 주문 규모를 계산할 때 예상 체결 비용을 손절 폭에 더하고, 거래량이 얇은 코인은 한도를 더 낮춘다.
개별 주문 외에도 하루 손실 한도와 전체 보유 비중을 둔다. 예를 들어 하루 평가손익이 시작 자금 대비 3% 아래로 내려가면 새 주문을 막고 원인을 확인한다. 손절 주문도 급락장에서는 설정 가격에 정확히 체결되지 않을 수 있다. 자동매매의 손실 한도는 ‘그 가격에 반드시 팔린다’는 약속이 아니라 위험이 커졌을 때 시스템을 멈추는 기준이다.
5. 백테스트와 소액 실거래의 차이를 기록한다
백테스트에서는 수수료, 호가 간격, 미체결, 상장폐지 종목을 빼먹기 쉽다. 왕복 수수료가 각각 0.1%, 매수·매도 가격 미끄러짐이 각각 0.1%라면 거래 한 번의 비용은 단순 합계로 0.4%다. 1회 거래에서 가격이 0.6% 유리하게 움직여도 비용을 빼면 0.2%만 남는다. 실제 비용은 주문 방식과 시장 상황에 따라 달라지므로 체결 기록으로 다시 계산해야 한다.
전략을 만들 때 사용한 기간과 검증 기간을 나누고, 상승장뿐 아니라 급락·횡보 구간도 포함한다. 이후 주문을 보내지 않는 모의 운용으로 신호와 로그를 확인하고, 소액 실거래에서 백테스트 대비 체결 가격과 누락 주문을 비교한다. 내가 자동매매에서 먼저 믿는 숫자는 예상 수익률이 아니라 실제 체결 뒤 남은 손익과 시스템이 멈춘 횟수다. 그 기록이 쌓여야 운용금을 늘릴 근거도 생긴다.
