본문 바로가기
카테고리 없음

[트레이딩]Python 코인 자동매매 구현하기(기초)

by skwkiix 2024. 3. 5.
728x90

이번 포스팅은 CCXT 라이브러리를 사용하는 법을 간단히 익혀본다.

간단한 자동매매 클래스를 생성하고, 실행 스크립트를 main.py로 저장하여 자동매매 프로그램을 실행시켜본다.

CCXT(Cryptocurrency Exchange Trading Library)  소개

CCXT는 cryptocurrency(암호화폐) 거래소를 위한 통합된 자바스크립트/Python/PHP 라이브러리이다.

https://docs.ccxt.com/#/

 

ccxt - documentation

 

docs.ccxt.com

빗썸 (Bithumb) , 업비트 (Upbit), 코인원 (Coinone) 등의 다양한 가상 자산을 거래할 수 있는 거래소와 통일된 API 를 제공하는 라이브러리이다.

 

업비트 API 를 발급받아서 사용방법을 설명하겠다.


1. 업비트 API 발급

https://upbit.com/home

 

홈 | 업비트

비트코인, 이더리움, 리플, NFT 등 다양한 디지털 자산, 국내 거래량 1위 거래소 업비트에서 지금 확인해보세요. No.1 Digital Asset Exchange in Korea, Upbit. Trade various digital assets conveniently and securely including

upbit.com

우선, 회원가입이 되어있어야 한다.(회원가입 하는 단계는 생략하겠다)

 

  • 홈에서 마이페이지로 들어간다. (Open API 관리 클릭)

 

  • 원하는 기능을 선택하고 IP 주소를 입력한다.
    • IP 주소는 인터넷에 "내 IP " 검색하면 나온다.

Access Key 와 Secret Key를 잘 보관해놓는다.




2. Python 코드 입력 

  • 인증정보 설정
import ccxt

access_key = '발급받은 키1'
secret_key = '발급받은 키2'

upbit = ccxt.upbit() # 인스턴스 생성
upbit.apiKey = access_key 
upbit.secret = secret_key

 

- ccxt 라이브러리를 임포트

- ccxt.거래소 이름을 적고 인스턴스를 생성한다.( ex) 업비트 > ccxt.upbit())

- apikey, secret 함수를 사용해서 인증한다.

 

  • 주문하기 예시
# 시장가 주문 (symbol, 매수/매도, 매수/매도할 금액 , 1)
upbit.create_market_order('BTC/KRW','buy', 10000 ,1)

# 지정가 주문(symbol,매수/매도, 지정가, 수량)
upbit.create_limit_order('BTC/KRW','buy', 100,10)

위와 같은 함수를 적용하여, 간단한 자동매매 구현 클래스를 생성해보았다.

 

구현한 함수는 다음과 같다. (watch_and_order_many)

- symbol(btc/usdt), money(주문할 금액), watch_percent(일정비율) 을 입력받는다.

- 특정 암호화폐(symbol)의 가격이 일정 비율 이하로 떨어질 때 시장 주문을 실행하고, 주문 횟수를 20회로 제한

-  is_buy = False 를 초깃값으로 지정하고 , 주문이 실행되면 True로 변환, is_buy_count가 1씩 올라가게 설정(계속해서 매수하는 것을 방지)

- 매수 주문 중 에러가 발생할 경우, 프로그램이 종료되지 않도록 한다.(예외처리, 에러메시지 출력)

 

생성한 함수를 클래스로 구현하여, 다른 환경에서도 사용할 수 있게 구현했다.

import ccxt

class Myupbit():

    # 생성자(초기에 딱 한번만 설정)
    def __init__(self, key, secret): 
        print('생성자 테스트')
        self.upbit = ccxt.upbit()
        self.upbit.apiKey = key
        self.upbit.secret = secret
        self.is_buy = False
        self.is_buy_count = 0
        
    def watch_and_order_many(self, symbol, money, watch_percent): 
        print('가격 변동을 확인하고, 매수하는 함수')
        infos = self.upbit.fetch_ticker(symbol)
        price = infos['close']
        percent = infos['percentage'] * 100
        rounded_percent = round(percent, 2)
        print(f'현재 {symbol}가격은 {price} 이고, 전일대비 {rounded_percent}% 입니다.')

        # 최대 주문 횟수를 이미 초과했는지 확인
        if self.is_buy_count >= 20:
            print("최대 매수 횟수에 도달하여 더 이상 주문하지 않습니다.")
            return

        # 매수 주문을 실행할 조건 확인
        if percent < watch_percent and not self.is_buy:
            # 예외처리
            try:
                self.upbit.create_market_order(symbol, 'buy', money, 1)
                self.is_buy = True
                self.is_buy_count += 1
                print("매수 주문이 성공적으로 실행되었습니다.")
                
            # 에러 발생 출력
            except Exception as e:
                print(f"매수 주문 중 오류가 발생했습니다: {str(e)}")
        else:

 

이 코드를 my_upbit.py로 저장하고 main.py를 생성한 후, 해당 클래스를 호출하여 사용하면 된다.

# main.py
from my_upbit import Myupbit # my_ubbit.py에 구현한 Myupbit 클래스를 임포트

# 인증
access_key1 = '키 입력'
secret_key1 = '키 입력
My_myupbit = Myupbit(access_key1, secret_key1)

# 다섯가지 암호화폐에 대하여 20번의 주문을 생성
while True:
    My_myupbit.watch_and_order_many('BTC/KRW',10000,0)
    My_myupbit.watch_and_order_many('SOL/KRW',10000,0)
    My_myupbit.watch_and_order_many('ITH/KRW',10000,0)
    My_myupbit.watch_and_order_many('XRT/KRW',10000,0)
    My_myupbit.watch_and_order_many('BBBBBB/KRW',10000,0)

 

이제 터미널에서,  해당 디렉토리로 이동한 후, main.py를 실행해주면, 자동매매가 실행되게 된다.

$ python main.py

 

주의) 로컬에서 구현하게 되면, 컴퓨터가 항상 켜져있어야 함으로 AWS 와 같은 클라우드를 이용해서 계속 실행되도록 하는 것이 좋다.


(다음 포스팅) 매수/매도 전략을 코드로 구현하여 실전에서 사용가능한 자동매매 클래스를 만들어보고, AWS 에서 실행하는 내용이 담길 예정이다.