[Node.js] 업비트 API로 트레이딩 봇 만들기 - 매도/매수

728x90

이전 글에서 다룬 업비트 지갑 연동에 이어,

이번 포스팅에서는 매도와 매수 기능을 추가한 코인 매매 트레이딩 봇을 만드는 방법을 소개합니다.

프로젝트 환경 세팅과 업비트 업비트 지갑연동이 궁금하시다면 아래 링크의 이전 글을 참고 부탁드립니다.

2024.04.28 - [사이드프로젝트] - [Node.js] 업비트 API로 트레이딩 봇 만들기 - 업비트 지갑 연동

 

[Node.js] 업비트 API로 트레이딩 봇 만들기 - 업비트 지갑 연동

제작 계기최근에 코인에 대한 관심이 높아지면서 저 역시 코인 투자를 시작하게 되었습니다. 투자를 진행해보니, 생각보다 많은 시간이 소요되는 것을 느꼈습니다. 이에 "혹시 내

fabric0de.tistory.com

 

참고문서

이전 글에서 말씀드린 업비트에서 제공하는 API 문서를 참고하였습니다.

- 업비트 주문하기 API

 

Open API | 업비트 개발자 센터

 

docs.upbit.com

 

 

프로젝트 구조

📦src
 ┣ 📂api
 ┃ ┣ 📜account.js
 ┃ ┣ 📜orders.js
 ┗ 📜index.js

 

주문하기 코드

업비트 API문서에서 제공하는 주문하기 코드를 참고하여 작성하였습니다.

 

주요 라이브러리

  • axios : HTTP 요청을 위한 라이브러리로 업비트에서 제공하는 코드의 'request' 라이브러리를 변경하였습니다.
  • crypto : Node.js의 내장 모듈로 암호화 관련 기능을 제공합니다.
  • uuid : UUID를 생성하여 요청에 고유한 식별자를 추가하기 위한 라이브러리입니다.
  • jsonwebtoken : JSON 웹 토큰을 생성하여 API 요청에 필요한 인증 토큰을 생성하기 위한 라이브러리입니다.

주문 함수 설명

order 함수는 비동기 함수로, [market, side, volume, price, ord_type]를 인자로 받습니다.

각 파라미터에 대한 설명은 업비트 API 문서를 참고하거나 아래 코드의 주석을 확인하시면 됩니다.

  1. market: 거래할 마켓 ID (예: "KRW-BTC")
  2. side: 주문 종류 (매수: "bid", 매도: "ask")
  3. volume: 주문량 (지정가 주문 및 시장가 매도 시 필수)
  4. price: 주문 가격 (지정가 주문 및 시장가 매수 시 필수)
  5. ord_type: 주문 타입 (지정가 주문: "limit", 시장가 매수: "price", 시장가 매도: "market")

적절한 인수를 넣어 함수가 실행되면, 주문 정보를 쿼리 스트링으로 변환 후 payload 객체에 접근 키, 쿼리 해시, 해시 알고리즘을 포함시킵니다. 그런 다음, payload와 secret_key를 이용해 JWT token을 생성합니다. 마지막으로, options 객체에 HTTP 메소드, 헤더, 데이터, URL을 설정한 후 axios를 이용해 API 요청을 보냅니다.

 

orders.js 매수 구현 코드

import axios from "axios";
import { v4 as uuidv4 } from "uuid";
import crypto from "crypto";
import jwt from "jsonwebtoken";
import querystring from "querystring";
import dotenv from "dotenv";

dotenv.config();

const access_key = process.env.UPBIT_OPEN_API_ACCESS_KEY;
const secret_key = process.env.UPBIT_OPEN_API_SECRET_KEY;
const server_url = process.env.UPBIT_OPEN_API_SERVER_URL;

const order = async (market, side, volume, price, ord_type) => {
  const body = {
    market, // "KRW-BTC", //마켓 ID (필수)
    side, //주문 종류 (필수) bid : 매수 , ask : 매도
    volume, //주문량 (지정가, 시장가 매도 시 필수)
    price, //주문 가격. (지정가, 시장가 매수 시 필수)
    ord_type, //주문 타입 (필수) ,limit : 지정가 주문, price : 시장가 주문(매수), market : 시장가 주문(매도)
  };

  const query = querystring.encode(body);

  const hash = crypto.createHash("sha512");
  const queryHash = hash.update(query, "utf-8").digest("hex");

  const payload = {
    access_key,
    nonce: uuidv4(),
    query_hash: queryHash,
    query_hash_alg: "SHA512",
  };

  const token = jwt.sign(payload, secret_key);

  const options = {
    method: "POST",
    headers: {
      Authorization: `Bearer ${token}`,
      "Content-Type": "application/json",
    },
    data: body,
    url: `${server_url}/v1/orders`,
  };

  try {
    const response = await axios(options);
    console.log(response.data);
  } catch (error) {
    console.error(error);
  }
};

export default order;

 

마무리

여기까지 업비트 주문을 위한 준비가 완료되었습니다.

다음 포스팅에서는 트레이드 조건을 설정한 후,

이번 포스팅에서 준비된 코드를 이용해 매수와 매도를 진행해보겠습니다.

감사합니다.

728x90