NOONOO TRADING봇에서 시작하기

자전거래 방지(STP) — 내 주문이 내 주문을 잡아먹으려 할 때

주문을 넣었는데 체결도 안 되고 거부도 아닌데 그냥 사라져 있는 경우가 있습니다. 로그를 보면 상태가 취소됨인데 내가 취소한 적은 없습니다. 같은 계정에서 낸 다른 주문과 마주쳤을 때 거래소가 자동으로 지운 것이고, 이 규칙의 이름이 자전거래 방지(STP, Self-Trade Prevention)입니다.

내 주문끼리 만나면 체결되지 않는다

호가창에서 매수 주문과 매도 주문이 가격에서 겹치면 체결됩니다. 그런데 그 두 주문의 주인이 같은 계정이면 이야기가 달라집니다. 체결 엔진은 그 순간 매칭을 멈추고 둘 중 하나(또는 둘 다)를 취소합니다.

자전거래가 성립하려는 순간

같은 계정의 두 주문
  매도 지정가  $60,100  2계약 (대기 중)
  매수 지정가  $60,100  2계약 (신규 접수)

보통이라면
  → 가격이 겹치므로 즉시 체결

같은 계정이면
  → 체결 차단
  → 둘 중 하나 취소

─────────────
거부(reject)가 아니라 취소(cancel)
  에러 메시지 없이 조용히 사라진다

왜 막느냐면, 자기 주문끼리 사고파는 행위는 실제 거래 없이 거래량만 만들어내는 형태가 되기 때문입니다. 거래소는 시장 데이터의 신뢰성 문제와 규제 요구 때문에 이를 엔진 단에서 차단합니다. 사용자 입장에서 의도했든 안 했든 규칙은 똑같이 적용됩니다. 호가창에서 주문이 어떻게 줄을 서는지는 체결 우선순위에, 호가창 자체를 읽는 법은 호가창 읽기에 있습니다.

세 가지 모드 — 무엇이 지워지는가

거래소마다 이름은 조금씩 다르지만 처리 방식은 대체로 세 가지입니다. 어느 모드냐에 따라 사라지는 주문이 완전히 달라집니다.

STP 모드 비교

상황  기존 매도 2계약 · 신규 매수 2계약

① 신규 취소 (cancel taker)
  방금 낸 주문이 사라짐
  호가창의 기존 매도  유지

② 기존 취소 (cancel maker)
  호가창에 있던 매도가 사라짐
  신규 매수는 남아서 다음 상대와 체결

③ 양쪽 취소 (cancel both)
  두 주문 모두 소멸

─────────────
①이면  진입이 안 된다
②면  걸어둔 익절·손절이 없어진다 ← 위험
③이면  둘 다 없어진다

실무에서 가장 위험한 건 입니다. 익절 지정가를 걸어두고 별개로 추가 진입 주문을 넣었는데 그 둘이 겹치면, 진입은 되고 익절 주문만 조용히 사라집니다. 포지션은 그대로인데 출구가 없어진 상태로 남습니다. 부분 체결이 섞이면 상황이 더 복잡해집니다 — 부분 체결에서 잔량이 어떻게 남는지 확인해 두면 좋습니다.

언제 터지나 ① 그리드 봇

가장 흔한 발생처입니다. 그리드는 매수 사다리와 매도 사다리를 동시에 깔아두기 때문에, 가격대가 좁거나 격자 간격이 촘촘하면 자기 주문끼리 마주칠 여지가 생깁니다.

격자가 겹치는 순간

그리드 설정  간격 $50 · 한 칸 2계약

매도 사다리  $60,050 / $60,100 / $60,150
매수 사다리  $59,950 / $59,900 / $59,850

급등으로 매도 $60,050 체결
  → 봇이 재배치: 매수 한 칸 위로 이동
  → 새 매수  $60,050 접수

그런데 취소 지연으로
  옛 매도 $60,050 잔량  0.4계약이 아직 남아 있음

─────────────
STP 발동 → 한쪽 취소
매수 사다리  3칸 → 2칸
봇은 "주문 넣었다"고 기록
  실제 격자엔 구멍이 생김

구멍이 난 격자는 그 가격대가 왔을 때 아무 일도 하지 않습니다. 며칠 지나면 사다리가 군데군데 비어 원래 설계와 다른 봇이 됩니다. 그리드 구조 자체는 그리드 매매에 정리돼 있고, 격자 간격을 잡는 기준은 그리드 봇 최적화에서 다룹니다.

언제 터지나 ② 양방향 모드에서 롱과 숏을 동시에

헤지(양방향) 모드는 같은 종목에 롱과 숏을 동시에 들 수 있게 해 줍니다. 그런데 롱 청산 주문숏 진입 주문은 둘 다 매도 방향이 아니라, 롱 진입(매수)과 숏 진입(매도)이 같은 가격에서 만나는 구성이 나올 수 있습니다.

양방향 모드의 충돌

포지션 모드  헤지(양방향)

롱 진입 대기  매수 $59,900  1계약
숏 진입 대기  매도 $59,900  1계약
  ("어느 쪽으로 뚫든 따라간다" 의도)

가격이 $59,900 도달
  → 두 주문이 서로를 상대로 매칭 시도
  → STP 발동

─────────────
기대  한쪽 체결 후 방향 확인
실제  한쪽 취소 · 남은 쪽만 시장에 노출

양쪽 취소 모드면  둘 다 사라진다
  = 돌파에 아무것도 안 걸린다

양쪽에 걸어두고 뚫리는 방향을 따라가는 구성(스트래들 형태)은 같은 가격에 두면 성립하지 않습니다. 가격을 벌리거나(예: 매수 $59,900 / 매도 $59,800), 조건부 주문으로 트리거를 분리해야 합니다. 양방향 모드의 기본 동작은 단방향·양방향 포지션 모드에 있습니다.

언제 터지나 ③ API 키를 여러 개 쓸 때

키가 다르면 다른 사용자라고 생각하기 쉽지만, STP는 보통 계정 단위(또는 하위 계정 그룹 단위)로 적용됩니다. 봇 두 개에 키를 각각 발급해도 같은 계정이면 같은 STP 그룹입니다.

키가 달라도 같은 계정

봇 A  API 키 #1  매도 $60,100 2계약
봇 B  API 키 #2  매수 $60,100 2계약

두 봇은 서로의 존재를 모른다

결과
  → STP 발동 · 한쪽 취소
  → 취소된 봇은 "왜 사라졌지" 상태
  → 대개 재주문 → 또 취소 → 반복

─────────────
루프에 빠지면 주문 요청 폭증
  → 레이트 리밋까지 맞는다

전략이 서로 반대 방향일 수 있다면 처음부터 하위 계정을 분리하는 편이 안전합니다. 키 발급과 권한 범위는 API 키에서 확인하세요. 취소·재주문 루프는 수수료가 아니라 요청 한도를 먼저 태우기 때문에, 정작 필요한 손절 주문이 밀릴 수 있습니다.

취소된 것을 어떻게 알아채나

STP 취소는 주문 거부와 다릅니다. 거부는 에러 코드가 돌아오지만, STP 취소는 정상 접수된 뒤 상태가 바뀌는 형태라 응답만 보면 성공처럼 보입니다.

구분하는 법

거부(reject)
  주문 요청에 에러 응답
  주문 ID 없음

미체결(open)
  상태 = live · 잔량 그대로

STP 취소
  주문 ID 있음 · 접수 성공
  상태 = canceled
  체결 수량  0
  취소 사유 필드에 STP 관련 코드

─────────────
확인 위치
  주문 내역(체결 아님) · 취소 사유
  봇이면  주문 상태를 접수 후 재조회

봇을 돌린다면 접수 응답만 믿지 말고 수 초 뒤 주문 상태를 다시 조회하는 절차를 넣어야 합니다. 그래야 "걸어둔 줄 알았던 손절이 사실 없다"를 사고 전에 잡습니다. 주문이 아예 접수되지 않는 다른 원인들은 주문이 거부되는 이유에 따로 정리돼 있습니다.

줄이는 방법

실무 규칙

진입·청산 주문의 가격대를 겹치지 않게 설계
  최소 몇 틱 이상 벌린다

청산 주문엔 리듀스온리
  신규 포지션이 아님을 명시

그리드는 취소 확인 후 재배치
  취소 요청과 신규 접수를 동시에 보내지 않는다

반대 전략은 하위 계정 분리

접수 후  상태 재조회를 루틴에 포함

취소가 반복되면  재주문 중단 후 점검
  무한 재시도 금지

②의 리듀스온리는 STP 자체를 없애 주지는 않지만, 청산 주문이 신규 진입으로 취급되는 경우를 줄여 충돌 상황을 단순하게 만듭니다. 옵션별 동작은 포스트온리·리듀스온리·IOC에 있습니다. ③은 특히 중요한데, 취소 요청이 처리되기 전에 새 주문이 들어가면 같은 가격에 옛 주문과 새 주문이 잠깐 공존하게 되고 그 짧은 창에서 STP가 발동합니다.

수수료·거래량과의 관계

STP로 취소된 주문은 체결이 아니므로 수수료가 발생하지 않고 거래량 집계에도 잡히지 않습니다. VIP 등급을 거래량으로 산정하는 구조에서, 자전거래로 등급을 올리는 길이 막혀 있다는 뜻이기도 합니다.

취소된 주문의 회계

STP 취소 2계약
  체결 수량  0
  수수료  $0
  30일 거래량 기여  $0

─────────────
비용은 0이지만
  기회는 사라졌다
  (그 가격에 걸려 있어야 할 주문이 없다)

진짜 비용 = 없어진 주문이 잡았어야 할 자리

즉 STP 자체가 돈을 빼가지는 않습니다. 손실은 있는 줄 알았던 주문이 없어서 생깁니다. 등급 산정 기준은 수수료 등급과 VIP 레벨에, 잦은 주문이 실제로 성과를 갉아먹는 구조는 거래 빈도와 수수료 드래그에 있습니다.

정리

같은 계정의 매수·매도가 만나면 체결되지 않는다
거부가 아니라 취소로 조용히 처리된다
모드는 신규 취소 · 기존 취소 · 양쪽 취소
기존 취소 모드는 걸어둔 익절·손절을 지운다
그리드 재배치 지연이 가장 흔한 발생처다
양방향 모드에서 같은 가격 롱·숏 대기는 성립하지 않는다
API 키가 달라도 같은 계정이면 같은 그룹이다
재주문 루프는 레이트 리밋까지 태운다
접수 성공 응답만으로 안심하지 않는다
접수 후 상태 재조회를 루틴에 넣는다
진입·청산 가격대를 겹치지 않게 설계한다
비용은 0이지만 없어진 주문이 손실을 만든다

한 줄로 줄이면 이렇습니다. STP는 내 주문을 지워도 나에게 알려주지 않습니다. 여러 주문을 동시에 걸어두는 방식으로 매매한다면, 화면에 걸려 있다고 믿는 주문이 실제로 살아 있는지 주기적으로 확인하는 절차가 전략의 일부입니다.

주의

본문의 $60,100 · $60,050 · $59,900 · $59,850 같은 호가, 2계약 · 1계약 · 0.4계약 같은 수량, 그리드 간격 $50 과 사다리 3칸 구성, 하위 계정·API 키 두 개 구성 같은 숫자와 설정은 모두 규칙을 설명하기 위한 가정 예시이며 특정 거래소의 실제 호가나 특정 계좌의 측정값이 아닙니다. 자전거래 방지의 세부 동작은 거래소마다 다릅니다. 기본 모드가 무엇인지, 주문마다 모드를 지정할 수 있는지, 적용 범위가 계정 단위인지 하위 계정 그룹 단위인지, 취소 사유를 어떤 코드로 알려주는지, 리듀스온리 주문을 어떻게 취급하는지는 각 거래소의 API 문서와 거래 규정에서 직접 확인해야 합니다. 이 글은 주문 집행 규칙에 대한 설명이며 특정 매매 방식이나 봇 설정을 권유하지 않습니다. 레버리지 거래는 원금 전액을 잃을 수 있고, 주문 상태를 정확히 관리한다고 해서 수익이 보장되지 않습니다. 투자 판단과 그 결과는 본인 책임입니다.

NOONOO TRADING 무료 채팅방에서 실시간 트레이딩을 같이 보세요.

봇에서 시작하기

📈 OKX 신규 가입 시 거래 수수료 할인

OKX 수수료 할인 가입 →