바이낸스 선물 자동매매

바이낸스 자동매매, TP/SL이 한 달 동안 작동 안 된 이유

creator88837 2026. 7. 15. 09:00

바이낸스 선물 자동매매 봇에서 TP/SL 주문이 한 달 내내 작동하지 않는 버그를 경험했다.
진입은 정상적으로 됐고, 봇 로그에는 "OCO 설정 완료"가 찍혔다.
그런데 실제로는 처음부터 손절도 익절도 걸려있지 않은 상태로 운영되고 있었다.
이 글에서는 원인이 뭐였는지, 어떻게 발견했는지, 어떻게 해결했는지를 실전 로그와 함께 정리한다.

 

TP/SL 버그를 발견한 과정 


2026년 6월 30일, 서버를 재시작하고 점검을 하다가 이상한 걸 발견했다.
거래소에는 SHORT 포지션이 잡혀있는데, fetch_open_orders() 결과가 0건이었다.

포지션이 있으면 TP/SL 주문도 같이 잡혀있어야 정상이다.
그런데 열린 주문이 하나도 없다.

처음에는 서버 재시작 때 주문이 날아간 거라고 생각했다.
그래서 그 시점 이전에 이미 완료된 거래 이력을 직접 조회해봤다.

6월 22일 17:05 진입, 6월 23일 09:00 청산된 거래였다.
거래소 주문 이력에서 STOP_MARKET, TAKE_PROFIT_MARKET을 찾아봤다.
단 한 건도 없었다.

재시작이 원인이 아니었다.
처음부터 TP/SL 주문 자체가 생성되지 않고 있었던 것이다.


원인: closePosition과 수량을 동시에 보내면 수량이 0이 된다 h2

원인은 TP/SL 주문을 만드는 방식에 있었다.

봇이 TP/SL 주문을 걸 때 이렇게 보내고 있었다.

문제 코드:

exchange.create_order(symbol, 'STOP_MARKET', 'sell', amount,
                      params={'stopPrice': sl_price, 'closePosition': True})



closePosition: True는 "포지션 전체를 청산하겠다"는 의미다.
amount는 "이 수량을 청산하겠다"는 의미다.

이 두 가지를 동시에 보내면 충돌이 생긴다.
"전체 청산할게" + "0.008 BTC 청산할게"를 동시에 말하는 것이다.

이 계정에서 STOP_MARKET, TAKE_PROFIT_MARKET 주문은 바이낸스의 Algo 주문 시스템으로 처리된다.
이 시스템은 두 방식이 충돌할 때 에러를 반환하지 않는다.
대신 조용히 수량을 0으로 바꿔서 주문을 만들어버린다.

수량이 0인 주문은 가격이 닿아도 아무것도 안 한다.
이름만 손절/익절 주문이고 실제로는 빈 껍데기였다.

Algo 주문 전용 API로 직접 조회한 결과는 이렇게 나왔다.

type: STOP_MARKET, quantity: 0.0, algoStatus: NEW
type: TAKE_PROFIT_MARKET, quantity: 0.0, algoStatus: NEW

수량이 0인 채로 "열린 상태(NEW)"로 잡혀있었다.
가격이 닿아도 청산할 수량이 없으니 아무 일도 일어나지 않는다.

 

봇이 정상이라고 착각한 이유 


더 큰 문제가 있었다.
봇은 이걸 전혀 모르고 있었다.

TP/SL 주문을 보내고 나서 봇 로그에는 이렇게 찍혔다.
"OCO 설정 완료"

봇이 확인하는 방법이 fetch_open_orders()였는데, 이 방법으로는 Algo 주문이 조회되지 않는다.

일반 조회와 Algo 전용 조회 결과가 다르다.

바이낸스 TP/SL 수량 0 버그


왼쪽은 일반 fetch_open_orders() 결과(0건), 오른쪽은 Algo 전용 조회 결과(수량 0짜리 주문 2건). 같은 계정인데 결과가 다르다.

일반 조회: 0건
Algo 전용 조회: STOP_MARKET / TAKE_PROFIT_MARKET, quantity: '0.0', algoStatus: 'NEW'

봇은 "주문을 냈더니 정상 완료됐다"고 판단하고 다음 단계로 넘어갔다.
그 사이에 수량 0짜리 빈 껍데기 주문이 Algo 시스템 안에 계속 쌓였다.

여기에 또 다른 문제가 있다.
이 수량 0 유령 주문이 "열린 상태(NEW)"로 남아있어서, 다음 진입 때 같은 방향으로 TP/SL 주문을 다시 생성하려 하면 -4130 오류가 나면서 거부됐다.

"이미 같은 방향 closePosition 주문이 있어서 안 된다"는 이유다.
처음엔 TP/SL이 빈 껍데기로라도 생성됐고, 이후 거래부터는 아예 생성조차 안 됐다.
갈수록 막히는 구조였다.

 

2345봇은 처음부터 왜 괜찮았나 


같은 봇 코드로 만든 2봇, 3봇, 4봇, 5봇은 이 문제가 없었다.
차이는 TP/SL 주문을 거는 방식에 있었다.

항목          1봇 (버그 있음)                 2345봇 (정상)
────────────────────────────────────────────────────────────────
TP/SL 생성    closePosition: True + 수량 전달  reduceOnly: True + 수량 명시
취소 방법     fetch_open_orders → cancel_order fapiPrivateDeleteAllOpenOrders
                                                + fapiPrivateDeleteAlgoOpenOrders

2345봇은 "이 수량만큼 청산하고, 포지션 줄이는 용도로만 쓸게(reduceOnly)"라고 말했다.
충돌이 없었다.

1봇은 "전체 청산할게(closePosition), 근데 수량도 이만큼이야"라고 말해서 충돌이 생겼다.

취소도 마찬가지다.
2345봇은 일반 주문 취소 + Algo 주문 취소를 둘 다 호출했다.
1봇은 일반 주문 취소만 호출했다. Algo 주문이 남는 이유였다.

 

TP/SL 버그 수정 방법 


수정은 두 곳이다.

첫 번째, TP/SL 주문 생성 방식 변경.

[AI에게 시킨 명령어]
"closePosition 대신 reduceOnly: True로 바꿔줘. 수량은 amount 그대로 쓰고. 2345봇과 동일한 방식으로"

[수정 전]

exchange.create_order(symbol, 'STOP_MARKET', 'sell', amount,
                      params={'stopPrice': sl_price, 'closePosition': True})



[수정 후]

exchange.create_order(symbol, 'STOP_MARKET', 'sell', amount,
                      params={'stopPrice': sl_price, 'reduceOnly': True,
                              'workingType': 'MARK_PRICE'})



두 번째, 주문 취소 함수 변경.
일반 주문 취소만 하던 것을 Algo 주문 취소도 함께 호출하도록 수정했다.

[수정 전]

orders = exchange.fetch_open_orders(symbol)
for o in orders:
    exchange.cancel_order(o['id'], symbol)



[수정 후]

exchange.fapiPrivateDeleteAllOpenOrders({'symbol': 'BTCUSDT'})
exchange.fapiPrivateDeleteAlgoOpenOrders({'symbol': 'BTCUSDT'})

 


결론


핵심은 두 가지다.

첫째, closePosition과 amount를 동시에 보내면 안 된다.
Algo 주문 시스템이 충돌을 에러 없이 처리하면서 수량을 0으로 만든다.
봇 로그에는 "설정 완료"가 찍히기 때문에 발견하기 어렵다.

둘째, TP/SL 주문 취소할 때 Algo 주문 API를 따로 호출해야 한다.
일반 fetch_open_orders()로는 Algo 주문이 조회되지 않는다.
취소 전용 API(fapiPrivateDeleteAlgoOpenOrders)를 반드시 함께 써야 완전히 정리된다.

이 버그는 실용글 3에서 다룬 취소 관련 절반(Algo 취소 API 필요)과 이어지는 내용이다.
취소는 알고 있었는데 생성 단계의 충돌은 이번에 처음 발견했다.

봇이 정상이라고 로그를 찍어도, 거래소에서 직접 Algo 주문을 조회해보는 습관이 필요하다.
특히 포지션이 있는데 열린 주문이 0건으로 나오면 Algo 시스템을 직접 확인해봐야 한다.

 

 

함께 읽으면 좋은 글 

 

2026.05.24 - [바이낸스 선물 자동매매] - 바이낸스 TP/SL 취소 오류, Algo 주문 API 따로 있었다

 

바이낸스 TP/SL 취소 오류, Algo 주문 API 따로 있었다

바이낸스 선물 자동매매 봇에서 TP/SL 주문 취소가 안 되는 문제가 생겼다.익절이 됐는데도 손절 주문이 그대로 남았고, 봇이 다음 포지션을 잡을 때마다 충돌이 생겼다.1달이 넘도록 원인을 못

creator88837.tistory.com

2026.07.09 - [바이낸스 선물 자동매매] - 바이낸스 봇 청산 실패 -2022 오류, 고쳤는데 다음날 또 터졌다

 

바이낸스 봇 청산 실패 -2022 오류, 고쳤는데 다음날 또 터졌다

바이낸스 선물 자동매매 봇 청산 오류 -2022를 정리했다.고쳐서 테스트까지 통과했는데, 다음날 같은 오류가 재발했다.이 글에서는 -2022 오류의 두 가지 원인과 헤지 모드에서의 진짜 해결법을 코

creator88837.tistory.com

2026.07.09 - [바이낸스 선물 자동매매] - 바이낸스 봇 청산 실패 -2019 오류, 0.001 BTC를 1 BTC로 착각한 이유

 

바이낸스 봇 청산 실패 -2019 오류, 0.001 BTC를 1 BTC로 착각한 이유

바이낸스 선물 자동매매 봇 청산 오류 -2019를 정리했다.-2022를 잡고 다음날 발생한 오류로, 0.001 BTC 포지션을 1 BTC로 착각해 증거금 부족이 발생했다.이 글에서는 ccxt fetch_positions의 contracts 단위 오

creator88837.tistory.com

 

📈 백테스트