Nodejs 바이낸스 API 연동 - 매수 주문
안녕하세요.
어제에 이어 오늘은 node.js로 binance api 연계를 해보겠습니다.
우선 trade.js라는 파일을 생성합니다.
이 파일을 아래와 같이 약간 구조화를 하겠습니다.
const API_KEY = require("./apikey.json")
const { Spot } = require('@binance/connector')
const client = new Spot(API_KEY.BINANCE_API_KEY, API_KEY.BINANCE_API_SECRET)
class Trade {
}
module.exports = Trade
apikey와 binance connector는 어차피 쓸거니 미리 선언해줍니다.
client도 마찬가지입니다.
그리고 class를 만들어봅니다.
이 클래스 내부에 매수, 매도 function을 만들 생각입니다.
일단 골격부터 만들어볼까요?
class Trade {
buy() {
console.log("buy")
}
sell() {
console.log("sell")
}
}
module.exports = Trade
buy와 sell을 만들었습니다.
확인을 해봐야겠죠?
test.js 파일을 만들고 아래와 같이 입력합니다.
const Trade = require("./trade")
let trade = new Trade()
trade.buy()
trade.sell()
node test.js
실행을 해봅니다.
잘 호출되고 찍히는 것을 확인할 수 있네요.
이제 코인을 한번 사보도록 하죠. buy를 아래와 같이 수정합니다.
buy() {
client.newOrder('BTCUSDT', 'BUY', 'MARKET', {
quoteOrderQty: '11.54877342'
}).then((response) => {
console.info(response.data)
}).catch(error => console.error(error))
}
의미를 설명하자면..
BTCUSDT : BTC를 USDT로 거래하는 마켓
BUY : 사겠다.
MARKET : 시장가
quoteOrderQty : 이 금액만큼 최대한
즉, USDT 11.54877342를 가지고 시장가로 살 수 있는 최대한의 BTC를 사겠다.
이런 의미가 됩니다.
USDT 11.54877342는 별 의미가 있는 건 아닙니다.
어제 포스팅을 보시면 아실 텐데.. 제가 가진 USDT 수량이 이 정도더라고요.
자세한 항목들은 바이낸스 API Document를 참조하시면 됩니다.
아래 이미지와 같은 파라미터들을 조합해서 사용할 수 있습니다.
어쨌든 이제 실행해봅시다. 아까 만든 test.js를 다시 호출합니다.
node test.js
{
symbol: 'BTCUSDT',
orderId: 12111913769,
orderListId: -1,
clientOrderId: 'YfGnexWUOXzHYsJpq3iRiC',
transactTime: 1659536870908,
price: '0.00000000',
origQty: '0.00049000',
executedQty: '0.00049000',
cummulativeQuoteQty: '11.43084740',
status: 'FILLED',
timeInForce: 'GTC',
type: 'MARKET',
side: 'BUY',
fills: [
{
price: '23328.26000000',
qty: '0.00049000',
commission: '0.00000000',
commissionAsset: 'BTC',
tradeId: 1566363391
}
]
}
이런 결과가 나옵니다.
일단 정상적으로 잘 매수되었습니다. 각각의 응답 항목 역시 바이낸스 공식 문서를 보시면 됩니다.
주요한 항목 몇 가지를 언급하면..
executedQty는 수량입니다. 0.00049 BTC가 매수되었나 봅니다.
cummulativeQuoteQty는 사용한 금액입니다. 11.43084740 USDT가 사용되었습니다.
주문 넣을 때 11.54877342 USDT만큼 사겠다고 했으나, 그걸로 살 수 있는 최대를 사니 잔돈이 좀 남았겠네요.
그리고 fills는 주문이 체결된 건수와 내용입니다. 이번엔 1건으로 처리되었네요. 큰 금액으로 거래하면 여러 건으로 분할하여 매매되기도 합니다.
그리고 여기서는 수수료를 확인할 수 있습니다. 이번엔 수수료가 안 들었네요. 바이낸스가 일부 페어들에 대하여 수수료를 받지 않고 있어서 그런 듯합니다. 보통은 수수료가 있습니다.
commissionAsset이 어떤 코인으로 수수료를 받았는지를 나타냅니다. 바이낸스의 수수료 방식은 업비트와 조금 다릅니다. 사용자에게 주어야 할 코인에서 수수료를 빼고 주는 방식을 사용합니다. 매수할 때는 사려는 코인에서 수수료만큼 빼고 주죠. 반대로 매도할 때는 판매된 금액을 줄 때 수수료를 빼고 줍니다.
참고로 거래되는 페어, 위의 경우에 BTC나 USDT가 아닌 다른 코인으로 수수료가 지불되는 경우도 있습니다.
개인이 계정 설정에서 BNB로 수수료를 지불하도록 설정한 경우에는 매수/매도 모두 BNB로 수수료가 지불됩니다.
자 그럼 실제로도 매수가 잘 되었는지 확인해야겠죠?
바이낸스에서 확인을 해봅니다.
동일한 데이터로 매수된 것을 확인할 수 있습니다.
어제 만들었던 asset.js를 통해 API로 계좌도 확인해보겠습니다.
제가 다른 자동매매 프로그램이 계속 돌아가고 있어서 다른 코인들의 수량은 어제와 차이가 있을 수 있습니다.
하지만 USDT는 사용하지 않기 때문에 아까 얘기했던 11.54877342를 보유하고 있었습니다.
그중에 11.43084740을 매수에 사용했고, 남은 수량이 0.11792602개가 맞는 것 같네요.
이렇게 node.js를 통해 바이낸스 매수주문을 넣어보았습니다.
하지만 여기서 끝내면 좀 아쉽네요.
하드코딩했던 파라미터 항목들을 변수나 인자로 꺼내보겠습니다.
buy(symbol, quoteOrderQty) {
client.newOrder(symbol, 'BUY', 'MARKET', {
quoteOrderQty: quoteOrderQty
}).then((response) => {
console.info(response.data)
}).catch(error => console.error(error))
}
일단 저는 시장가 주문만 할 예정이니까 이렇게만 바꾸겠습니다.
trade.buy('BTCUSDT', '11')
그러면 호출할 때 위와 같이 호출을 하면 되겠죠.
자동매매 프로그램을 만든다면, 본인이 하고자 하는 매매법에 따라 API의 파라미터를 적절하게 조합해야 합니다.
원래대로라면 범용으로 사용 가능하도록 모듈화를 해야겠지요. 하지만 바이낸스 커넥터가 이미 그 역할을 하게 구현이 되어 있습니다.
그러니 우리는 필요할 때 필요한 파라미터를 조합해서 호출만 하면 되죠.
매도도 거의 유사하긴 합니다. 하지만 오늘은 매수까지만 하겠습니다. 매도는 내일!