코인 - 라이프 - 밸런스

당신의 코인과 인생의 밸런스를 위하여 코라밸을 만들었습니다.

코라밸 UI 바로가기

함께만드는 자동매매

바이낸스 자동매매 프로그램 만들기 #1

코라밸 2022. 1. 17. 21:41
320x100

안녕하세요.

코라밸 입니다.

 

이번 글에서는 바이낸스 선물(Futures) 자동매매 프로그램을 같이 만들어 보겠습니다.

  1. 시세 (Ticker) 조회
    방식: WebSocket
    용도: 실시간으로 시세정보를 수신
    사용: 실시간으로 들어오는 시세정보를 저장하고 사용
  2. 주문 정보 변경 체크
    방식: WebSocket
    용도: 모든 주문 정보에 변동이 생길 때마다 웹소켓으로 신호를 받아서 처리
    사용: 주문의 체결이 발생한 즉시 주문 전송 등 사전 정의된 작업 수행
  3. 주문하기
    방식: REST API
    용도: 매수 주문 및 매도 주문 전송
    사용: Open Order 또는 Close Order을 전송
  4. 계좌 정보 조회
    방식: REST API
    용도: 현재 지갑의 잔고 및 보유 포지션의 정보를 조회
    사용: 0.3초에 한번씩 호출하여 현재가와 진입가를 비교해서 현재 손익률, 목표 손익률을 비교해서 처리

1번부터 차례대로 예제 코드를 살펴보겠습니다.

 

시세 (Ticker) 조회 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
const W3CWebSocket = require('websocket').w3cwebsocket;
 
const binanceFuturesTickers = [];
let usdsmTicker = null;
 
const usdsTickerWebSocket = async () => {
    try {
        usdsmTicker = new W3CWebSocket('wss://fstream.binance.com/ws/!miniTicker@arr');
        usdsmTicker.onmessage = (e) => {
            const _binanceFuturesTickers = JSON.parse(e.data);
            for (let tick of _binanceFuturesTickers) {
                binanceFuturesTickers[tick.s] = Number(tick.c);
            }
        };
        usdsmTicker.onerror = () => {
            console.log(`USDS ticker websocket ERROR occurred.`);
        };
        usdsmTicker.onclose = () => {
            usdsTickerWebSocket();
        };
    } catch (error) {
        console.log(error);
    }
};
 
usdsTickerWebSocket();
cs

바이낸스의 Websocker Ticker 같은 경우 업비트와 달리 대략 1초에 한번씩 데이터를 쏴주는 형태입니다.
원하는 형태로 저장하셔서 활용하시면 됩니다.

 

주문 정보 변경 체크 예제 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
const axios = require('axios');
const moment = require('moment');
const W3CWebSocket = require('websocket').w3cwebsocket;
 
const BINANCE_ACCESS_KEY = 'BINANCE_ACCESS_KEY';
 
const getListenKey = async (url, accessKey) => {
    return await axios({
        method: 'POST',
        url,
        headers: {
            'X-MBX-APIKEY': accessKey,
        },
    })
        .then((response) => {
            return response.data.listenKey;
        })
        .catch((error) => {
            console.log(error.response.data);
            return null;
        });
};
 
const usdsmWebSocket = async () => {
    try {
        usdsmUserData = null;
        usdsmListenKey = await getListenKey('https://fapi.binance.com/fapi/v1/listenKey', BINANCE_ACCESS_KEY);
 
        usdsmUserData = new W3CWebSocket(
            `wss://fstream.binance.com/ws/${usdsmListenKey}`
        );
        usdsmUserData.onopen = () => {
            console.log(`USDS-M websocket has been OPENED.`);
        };
        usdsmUserData.onmessage = (e) => {
            usdsmProcess(e);
        };
        usdsmUserData.onerror = () => {
            console.log(`USDS-M websocket ERROR occurred.`);
        };
        usdsmUserData.onclose = () => {
            // console.log(`USDS-M websocket has been CLOSED.`);
            usdsmWebSocket();
        };
    } catch (error) {
        console.log(error);
    }
};
 
const usdsmProcess = async (e) => {
    try {
        if (typeof e.data === 'string') {
            const data = JSON.parse(e.data);
 
            if (data.e === 'ORDER_TRADE_UPDATE') {
                if (data.o.X === 'FILLED' && data.o.o === 'LIMIT') {
                    // 지정가 주문 체결시 하고 싶은 작업을 여기에 작성
                }
            } else if (data.e === 'ACCOUNT_UPDATE' && data.a.m === 'ORDER') {
                // 주문 정보의 변동으로 인해 계좌정보가 변동된 경우 하고 싶은 작업을 여기에 작성
                // 예를 들면 포지션이 추가되었을 때, 포지션이 시장가로 종료 되었을 때 등
            } else if (data.e === 'ACCOUNT_UPDATE' && data.a.m === 'FUNDING_FEE') {
                // 펀딩비가 발생되어 계좌정보가 변동된 경우 하고 싶은 작업을 여기에 작성
            } else if (data.e === 'listenKeyExpired') {
                console.log('USDS-M websocket listen key expired!!!');
            }
        }
    } catch (error) {
        console.log(error);
    }
};
 
usdsmWebSocket();
cs

코드 안의 주석을 보시면 아시겠지만
데이터를 불러오는 로직을 짜놨기 때문에 주석을 읽어보시고 활용하여 정보를 처리하시면 됩니다.

 

이번 글은 여기서 마무리하고

다음편에서 코드 예제를 이어가겠습니다.

 

 

자동매매 개발자 오픈톡: https://open.kakao.com/o/gbD73Bud

 

함께만드는 자동매매

#코인 #암호화폐 #자동매매 #반자동매매

open.kakao.com

 

320x100