본문 바로가기

주식/[Upbit] 자동매매

[Upbit] 자동매매 프로그램 (Python) #1

728x90
반응형

○ 준비작업

Upbit Open API 를 활용하여 자동매매 프로그램을 만들어 보겠습니다.

먼저 API를 사용하기 위해서는 Upbit 에 사용신청을 해야합니다.

 

참조 : wikidocs.net/31063

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

이곳에 사용방법이 안내가 잘되어있으며 기본 사용법까지 설명이 나와있습니다.

 

이것을 활용하여 프로그램을 만들어보겠습니다. 



○ define_argparser 함수 정의

먼저 실행시에 입력값을 받을 수 있도록 argparser를 만들겠습니다.

import argparse

def define_argparser():
    p = argparse.ArgumentParser()

    p.add_argument(
        '--buyamount',
        required=False,
        default=100000
    )

    p.add_argument(
        '--tickerfn',
        required=False,
        default='tickerAll.txt'
    )

    p.add_argument(
        '--sleep',
        required=False,
        default=60
    )

    p.add_argument(
        '--startTime',
        required=False,
        default=0
    )

    config = p.parse_args()
    return config​

사용하다보니 필요한 내용을 추가하고 삭제하다가 남은 옵션값입니다.

--buyamount : 매수할때 사용할 금액입니다. 처음에는 연습용으로 적은금액으로 하기위해 만들었습니다.

--tickerfn : ticker 목록 파일 입니다. 일부 코인만 하다가 현재는 전체를 넣고있습니다.

--sleep : 조회 주기입니다. 

--startTime : 조회 시작 시간(초) 입니다.

sleep 과 startTime은 둘 중 하나만 사용합니다. 초기엔 sleep 쓰다가

0~10초 에데이터를 조회하는게 싫어서 만들었습니다.


 

 


○ main(config) 함수 생성

업비트 API 를 사용하기 위해 인증키를 사용합니다.

key.txt에 access_key, secret_key를 라인으로 구분하여 저장하고 소스에서 불러옵니다.

거래를 하기위해선 key가 필요합니다.

사용할 ticker 이름을 파일에 저장하고 불러옵니다.

def main(config):
    with open("key.txt") as f:
        lines = f.readlines()
        key = lines[0].strip()
        secret = lines[1].strip()
        session = pyupbit.Upbit(key, secret)
        
    with open(config.tickerfn, 'r') as f_ticker:
        tickerList = f_ticker.readlines()        

 

변수 초기화를 해줍니다.

    ## init value
    buy_amount = float(config.buyamount)
    sleep = int(config.sleep)
    startTime = int(config.startTime)
    time_sleep(startTime, 1)

    print(datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'start')

 

구매금액과 거래정보를 불러옵니다

이동평균선 계산을하고 매수/매도 전략을 만들어봅시다.

매수/매도를 등록하면 거래건에 대한 UUID를 가져옵니다.

만약 거래등록을 하고 일정시간이 지나가면 거래를 취소하도록 합니다.

    while True:
        for ticker in tickerList:
            try:
                trade_uuid = ''
                log = False
                now = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
                ticker = ticker.replace('\n', '')

                price = upbitUtils.inquiry_price(ticker)
                df = upbitUtils.get_df(ticker=ticker, interval='minute1', window=30)

                balance = float(session.get_balance(ticker))
                avg_buy_price = float(session.get_avg_buy_price(ticker))

                # 데이터 조회를 못했을 경우 예외 처리
                if df is None or price is None:
                    print(now, '[df_error] ', ticker)
                    continue

                close_ma_5 = df['close'].rolling(window=5).mean()
                close_ma_15 = df['close'].rolling(window=15).mean()
                close_ma_30 = df['close'].rolling(window=30).mean()
                volume_ma_5 = df['volume'].rolling(window=5).mean()
                volume_ma_15 = df['volume'].rolling(window=15).mean()

                # buy
                if balance == 0 :
                    ## 구매 조건 추가
                    if buyType.buy_strategy_1(df, price, close_ma_5, close_ma_15, volume_ma_5, volume_ma_15):
                        print(now, '[buy_strategy_1] ', ticker, ' : ', price)
                        f_trade_wait(upbitUtils.order_buy_amount(session, ticker, price, buy_amount))
                    
                ## sell
                if balance * avg_buy_price > 10000:
                    ## 판매 조건 추가
                    if price >= avg_buy_price * 1.05:
                        print(now, '[sell_strategy_3] ', ticker, ' : ', price)
                        f_trade_wait(upbitUtils.order_sell_all(session, ticker, price))
            except Exception as e:
                print(now, '[exception]', ticker, ' : ', e)
                print(traceback.format_exc())
                
            ## for-end

        time_sleep(startTime, sleep)
        
        for cancel_uuid in trade_wait:
            session.cancel_order(cancel_uuid)
            
        trade_wait.clear()
        ## while-end

 


 


○ 마무리

코드를 실행하는 __main__ 함수를 만듭니다.

if __name__ == '__main__':
    config = define_argparser()
    main(config)

 

▶ 후기

매도/매수 전략을 잘짜놓으면 수입을 생길수 있습니다.

적은금액으로 시도하면서 적절한 룰을 정해나갈 예정입니다.

초기에 재미로 만들어봤지만 현재 제법 수입이 나서 본격적으로 만들어 보겠습니다.

저는 초단타로 수입을 내는 목적으로 하겠습니다.

 

 

728x90
반응형