본문 바로가기
Back-end/Node.js

[Node.js] 자동매매 프로그램 만들기 - 매수/매도 (+코드 분석)

by 발담그는블로그 2021. 7. 7.

 

const request = require('request')	//-----------------------------(1)
const uuidv4 = require("uuid/v4")
const sign = require('jsonwebtoken').sign	//---------------------(2)
const crypto = require('crypto')
const queryEncode = require('querystring').encode	//-------------(3)

require("dotenv").config()
const access_key = process.env.UPBIT_API_ACCESS_KEY
const secret_key = process.env.UPBIT_API_SECRET_KEY
const server_url = "https://api.upbit.com"

/**
 * * market: KRW-BTC / USDT-BTC
 * * volume: 시장가 가격
 * * price: 금액 (매도할땐 필요없음)
 * * 
 */
const body = {
    market: 'KRW-BTC',
    side: 'bid',
    volume: '0.01',
    price: '1000',
    ord_type: 'limit',
}

const query = queryEncode(body)
const hash = crypto.createHash('sha512')	//---------------------(4)
const queryHash = hash.update(query, 'utf-8').digest('hex')

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

const token = sign(payload, secret_key)		//---------------------(5)

const options = {
    // method: "GET",
    // url: server_url + '/v1/accounts',
    method: "POST",
    url: server_url + "/v1/orders",
    headers: {Authorization: `Bearer ${token}`},
    json: body
}

request(options, (error, response, body) => {	//------------------(6)
    if (error) throw new Error(error)
    console.log(body)
})

 

(1) require('모듈명')

Node.js의 장점 중 하나는 많은 사람들이 만든 모듈을 쉽게 사용이 가능하다는 것이다. Node.js의 내장 모듈을 사용하려면 require함수를 사용하고, 그 외의 다른 모듈을 받아서 사용하려면 npm을 통하여 모듈을 다운로드하면 된다. (npm install [모듈명]) require 함수와 npm 말고도 exports를 통해 자체적으로 모듈을 만들어서 사용할 수 있다.

 

(2) require('jsonwebtoken').sign

jsonwebtoken이란, JWT Token이라고도 부른다. 이것은 각 객체 사이에서 속성 정보(Claim)를 JSON 데이터 구조로 표현하고 암호화를 통해 정보를 전달하는 Token의 대표이다. 이것은 약자로 전자 서명된 URL-safe의 JSON이다. 전자 서명은 JSON의 변조를 체크할 수 있다.
jwt에서 사용할 수 있는 함수는 sign/verify 2가지 이다. sign은 토큰을 생성(발급)해주는 함수이고 verify는 토큰을 인증해주는 함수이다. JWT는 헤더, 페이로드, 서명 세 가지로 나누어져 있다.

일반 토큰 기반의 인증 vs 클레임(Claim) 토큰 기반 인증
일반 토큰 기반의 인증은 token='wleflwkejflkw' 이렇게 값을 때려박는 형식인데, 클레임 기반 토큰은 사용자 정보나 데이터 속성(=Claim)을 통해 인증한다. 

{
  "id":"mhlab",
  "role":["admin","hr"],
  "company":"hexlant"
}

출처: https://velog.io/@neity16/NodeJS-JWT-Token-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

출처: https://elfinlas.github.io/2018/08/12/whatisjwt-01/

 

(3) Encode

* 인코딩(encoding): 공개적으로 사용가능한 방법을 통해 데이터를 변환하는 것. 다른 프로그램에서의 데이터 유용성을 높이고 저장에 필요한 공간을 줄이려는 의도로 이루어진다. (ex. 문자 'A'의 아스키코드는 65번) 
* 암호화(encrypt): 데이터를 비밀로 유지하려는 의도로 데이터를 변환한 것. 암호 알고리즘을 이용해 데이터를 암호화하고 특수 키를 사용하여 암호 해독. (ex. 대칭키, 공개키)
출처: https://humahumahuma.tistory.com/184

querystring 모듈

* escape(): 문자열 인코딩
* unescape(): 문자열 디코딩

나중에 참고할만한 블로그: https://jeonghwan-kim.github.io/2016/06/29/querystring-body-in-express.html

 

(4) Hash

Hash 함수란, 임의의 크기를 가진 데이터(Key)를 고정된 길이의 데이터(Value)로 매핑하는 함수이다. 같은 종류의 자료를 묶어서 파악할 수 있기 때문에 큰 파일에서 중복되는 레코드를 찾을 수 있다. 즉, DB에서 검색이나 테이블 검색의 속도를 가속화할 수 있다.

이렇게 빠르게 진행될 수 있는 이유는 데이터를 검색할 때 사용할 key와 실제 데이터 값이 한 쌍으로 존재하고, key값이 배열의 인덱스로 변환되기 때문에 검색과 저장의 평균적인 시간 복잡도가 O(1)에 수렴하게 된다.

 

(5) sign(payload, secret_key)

(2)번에서 언급했던대로, sign 함수를 통해 토큰을 생성할 수 있다. 따라서 payload(json 내용)과 secret_key를 통해 토큰을 생성하는 것이다. 

토큰이란

우리가 버스를 탈 때 쓰는 교통카드와 같다고 보면 된다. 혹은, 특정한 목적에 따라서만 사용할 수 있는 바우처 쿠폰과 같다. 일종의 권리를 주는 것이다. 지금 이 자동매매 시스템에서 사용되는 토큰이라는 개념은 주로 '권한'이다.출처: https://krksap.tistory.com/1586

 

(6) request(options, (error, response, body) => {})

반응형

'Back-end > Node.js' 카테고리의 다른 글

[Node.js] 자동매매 프로그램 만들기 - 계좌 조회  (0) 2021.07.04
[Node.js] 환경변수 설정 방법  (0) 2021.07.04
[Node.js] Node.js 입문  (0) 2021.06.27