개발자의 삶/코인

Nodejs 바이낸스 API 연동 - 매수 주문

비전공돌이 2022. 8. 4. 00:02

안녕하세요.

 

어제에 이어 오늘은 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

실행을 해봅니다.

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를 참조하시면 됩니다.

아래 이미지와 같은 파라미터들을 조합해서 사용할 수 있습니다.

바이낸스 New Order API 파라미터

어쨌든 이제 실행해봅시다. 아까 만든 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로 수수료가 지불됩니다.

 

자 그럼 실제로도 매수가 잘 되었는지 확인해야겠죠?

바이낸스에서 확인을 해봅니다.

Order History

동일한 데이터로 매수된 것을 확인할 수 있습니다.

 

어제 만들었던 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의 파라미터를 적절하게 조합해야 합니다.

원래대로라면 범용으로 사용 가능하도록 모듈화를 해야겠지요. 하지만 바이낸스 커넥터가 이미 그 역할을 하게 구현이 되어 있습니다.

그러니 우리는 필요할 때 필요한 파라미터를 조합해서 호출만 하면 되죠.

 

매도도 거의 유사하긴 합니다. 하지만 오늘은 매수까지만 하겠습니다. 매도는 내일!