안녕하세요. 개발하는 Stocker입니다. 오늘은 Binance 거래소 API를 연동하는 데에 사용될 ccxt 라이브러리 사용법을 소개하려합니다. 사실 Binance에서 제공하는 API endpoint를 그대로 사용할 수도 있지만 개발의 편리성과 에러 핸들링을 위해 라이브러리를 사용하는 것을 권장합니다!
ccxt란?
ccxt(CryptoCurrency Exchange Trading Library)는 다양한 언어에서 범용적으로 사용할 수 있는 암호화폐 거래소 모듈입니다. 바이낸스를 비롯한 비트파이넥스, 비트렉스, 크라켄 등 125개의 거래소 API를 지원합니다.
ccxt 라이브러리 다운로드
ccxt를 사용하기 위해서는 가장 먼저 ccxt 라이브러리를 다운받습니다.
pip install ccxt
그리고 아래와 같이 ccxt 라이브러를 임포트하고 바이낸스 객체를 만들면 준비는 끝입니다!
import ccxt
binance = ccxt.binance()
거래에 사용될 ccxt 주요 기능
ccxt에는 정말 많은 기능들이 내포되어 있습니다. 이번에는 실제로 제가 가장 많이 사용했으며 필수적이라고 생각한 기능을 소개하겠습니다. (이정도만 사용해도 트레이딩을 하는데에 아무 지장이 없었습니다!)
ticker 조회
가장 먼저 ticker를 조회 방법을 알아보겠습니다.
※ ticker: 주식 시장 혹은 거래소에서 특정 자산이나 주식을 고유하게 식별하는 데에 사용되는 약어입니다. ex) 삼성전자 - 005930
markets = binance.fetch_tickers()
print(market.keys())
이 코드를 작성하면 아래처럼 실제로 binance에서 거래할 수 있는 ticker 목록이 보여집니다.
현재가 조회
특정 ticker의 현재가를 조회하기 위해서는 fetch_ticker 함수를 실행하여 ticker 정보가 포함된 딕셔너리를 반환받습니다. 그 딕셔너리에 접근하여 아래와 같이 해당 일자의 시가, 종가, 저가, 종가 등의 정보를 얻으실 수 있습니다.
ticker = binance.fetch_ticker('ETH/USDT')
print(ticker['open'], ticker['high'], ticker['low'], ticker['close']) # 시가, 종가, 고가, 저가
과거 데이터 조회
fetch_ohlcv 메소드를 사용해서 조회할 수 있습니다. 파라미터 인자로 ticker와 1m, 1h, 1d와 같은 timeframe 정보 등을 넣으 실 수 있습니다.
일봉 데이터를 조회하는 코드입니다.
ohlcvs = binance.fetch_ohlcv('ETH/USDT', '1d')
print(ohlcvs)
결과적으로 500일 동안의 데이터가 타임스탬프 시간의 오름차순으로 2차원 리스트에 정렬되어 출력됩니다.
타임스탬프 시간이 보시기에 불편하실 수도 있습니다. 그러면 아래와 같이 코드를 추가하시면 좀 더 보기 편한 일자 데이터를 보실 수 있습니다.
ohlcvs = binance.fetch_ohlcv('ETH/USDT', '1d')
for idx, ohlcv in enumerate(ohlcvs):
ohlcvs[idx] = [datetime.fromtimestamp(ohlc[0]/1000).strftime('%Y-%m-%d %H:%M:%S'), ohlcv[1], ohlcv[2], ohlcv[3], ohlcv[4]]
print(ohlcvs)
아래처럼 시간데이터가 예쁘게 출력됨을 알 수 있습니다.
fetch_ohlcv함수를 통해 여러 가지 방법으로 데이터를 조회할 수 있습니다. 자세히 보시는 것을 강추드리며 깃헙에 올라온 소스코드를 직접 가져왔습니다!
fetch_ohlcv 깃헙 소스 코드
def fetch_ohlcv(self, symbol, timeframe='1m', since=None, limit=None, params={}):
self.load_markets()
market = self.market(symbol)
# binance docs say that the default limit 500, max 1500 for futures, max 1000 for spot markets
# the reality is that the time range wider than 500 candles won't work right
defaultLimit = 500
maxLimit = 1500
price = self.safe_string(params, 'price')
params = self.omit(params, 'price')
limit = defaultLimit if (limit is None) else min(limit, maxLimit)
request = {
'interval': self.timeframes[timeframe],
'limit': limit,
}
if price == 'index':
request['pair'] = market['id'] # Index price takes self argument instead of symbol
else:
request['symbol'] = market['id']
duration = self.parse_timeframe(timeframe)
if since is not None:
request['startTime'] = since
if since > 0:
endTime = self.sum(since, limit * duration * 1000 - 1)
now = self.milliseconds()
request['endTime'] = min(now, endTime)
method = 'publicGetKlines'
if price == 'mark':
if market['inverse']:
method = 'dapiPublicGetMarkPriceKlines'
else:
method = 'fapiPublicGetMarkPriceKlines'
elif price == 'index':
if market['inverse']:
method = 'dapiPublicGetIndexPriceKlines'
else:
method = 'fapiPublicGetIndexPriceKlines'
elif market['linear']:
method = 'fapiPublicGetKlines'
elif market['inverse']:
method = 'dapiPublicGetKlines'
response = getattr(self, method)(self.extend(request, params))
return self.parse_ohlcvs(response, market, timeframe, since, limit)
잔고 조회
잔고를 조회하려면 실제로 계좌가 연결되어 있어야 합니다. 지금까지 소개해드린 동작은 계좌 연결 없이도 수행할 수 있습니다.
바이낸스 거래소로부터 부여받은 api key와 sercet key를 딕셔너리 형태의 파라미터로 넘깁니다.
그리고 fetch_balance라는 함수를 통해서 잔고를 조회하실 수 있습니다.
binance = ccxt.binance({
'apiKey': 'YOUR API KEY',
'secret': 'YOUR SECRET KEY',
})
balance = binance.fetch_balance()
print("USDT: ", balance['USDT'])
print("ETH: ", balance['ETH'])
위 코드의 실행 결과는 다음과 같습니다.
매수/매도
매수를 위해서는 create_market_buy_order 혹은 create_limit_buy_order 함수를 사용합니다.
매도의 경우는 create_limit_sell_order, create_market_sell_order 라는 함수를 매수 함수와 같은 조건으로 진행하시면 됩니다.
order = binance.create_limit_buy_order('XRP/BNB', 50, 0.03) # 지정가, 파라미터는 왼쪽부터 ticker, 체결가, 수량
order = binance.create_market_buy_order('ETH/USDT', 0.01) # 시장가, 파라미터는 왼쪽부터 ticker, 체결량
결과로 반환받은 order 주문 내역을 출력하면 아래와 같이 긴 딕셔너리를 보실 수 있습니다.
주문 실행 결과
fetch_order 함수를 사용하시면 주문 결과를 조회하실 수 있습니다. 여기서 실제로 체결된 가격, 체결량, 체결 시각 등의 정보를 받아보실 수 있습니다.
실행 방법은 fetch_order함수에 파라미터로 위에서 결과로 반환받은 딕셔너리 안에 담긴 orderId와 ticker를 넣어 실행합니다.
resp = binance.fetch_order(8389765509512670860, "ETH/USDT")
print(resp)
결과는 다음과 같습니다.
주문 취소
지정가로 주문했을 경우 주문을 취소하는 경우도 종종 발생합니다. 이럴 때는 아래와 같이 코드를 입력하시면 됩니다.
여기서 파라미터 인자로 넘긴 값은 주문 번호와 ticker입니다.
resp = binance.cancel_order(8389765509512670860, "ETH/USDT")
print(resp)
이상으로 ccxt가 유용하게 사용되기를 바라며 포스팅 마치겠습니다! 더 궁금하신 점이나 부족한 점 있으면 언제든 댓글로 남겨주세요! 감사합니다!
'트레이딩' 카테고리의 다른 글
[트레이딩] 암호화폐 선물 시장에서 무위험 +a(약 10%) 수익 창출 꿀팁! (1) | 2022.12.23 |
---|---|
Funding Fee를 이용한 트레이딩 꿀팁 - SUN 토큰 (1) | 2022.07.24 |
암호화폐 시장의 Funding Fee(펀딩비)와 Funding Rate(펀딩 비율) 소개 및 분석 (2) | 2022.07.24 |
[Python]백테스트를 위한 암호화폐 데이터 준비하기(1분 봉) (0) | 2022.02.25 |
[Python]백테스트를 위한 암호화폐 데이터 준비하기(1일 봉) (0) | 2022.02.24 |