본문 바로가기

Python-Autotrade (Upbit)

파이썬(Python)-업비트(Upbit) Schedule를 이용한 특정 시간마다 업비트 거래대금 상위 n개 추출

안녕하세요 세번째 글입니다.

 

이번시간에는 앞선 글  "파이썬(Python)-업비트(Upbit) 거래대금 상위 n개 실시간 조회" 의 코드와 Scheduler를 사용하여 특정시간마다 추출하는 코드를 짜보았습니다. 여기서 Scheduler 란 while문과 결합하여 특정 시간때마다 원하는 함수를 실행하게 해주는 기능을 하게됩니다.

 

1. Scheduler
import pyupbit
import time
import schedule

def test():
    return print('Test 실행중')

schedule.every(5).seconds.do(test) # 5초마다 test 실행
schedule.every(5).minutes.do(test) # 5분마다 test 실행
schedule.every(5).hours.do(test) # 5시간마다 test 실행
schedule.every(5).days.do(test)  # 5일마다 test 실행
schedule.every(5).weeks.do(test) # 5주마다 test 실행

schedule.every().minute.at(":15").do(test) # 매분 15초에 test 실행
schedule.every().hour.at(":15").do(test) # 매시간 15분에 test 실행

# 5시간 15분 15초마다 작업 실행
schedule.every(5).hours.at("15:15").do(test)

# 주중 특정일에 작업 실행
schedule.every().monday.do(test)
schedule.every().sunday.at("13:15").do(test)

# 매일 특정 HH:MM:SS에 작업 실행
schedule.every().day.at("10:30:42").do(test)

while True:
    try:
        schedule.run_pending()
    except Exception as e:
        print(e)
        time.sleep(1)

 

위의 코드는 Scheduler에 대한 여러 예제입니다.

 

여기서 중요한 부분은 원하는 시간을 선택한 후 while문 밖에 설정을 해주고,  while문 안에 있는 run_pending()을 사용하여 실행해 주는 흐름입니다.

 

위의 코드와 거래대금 상위 n개 코드를 사용하여, 매일 오전 10시에 상위 거래대금 10개를 뽑아오는 코드를 만들었습니다. 필자는 BTC,ETH,알트코인 총 3개로 나누어 각각 투자하는 비율을 달리하여 자동매매를 할 예정이기 때문에 상위 거래대금 10개중 BTC,ETH를 제외한 코인을 추출할 예정입니다.  

 

2. 매일 오전 10시마다 BTC,ETH를 제외한 상위 거래대금 추출
import pyupbit
import time
import requests
import json
import pandas as pd
import datetime
import schedule

top_list = []
def top10_market(market,num): #market:'KRW' or 'BTC' or 'USDT', num:상위 num 개
    global top_list
    name_list = []
    volume_list = []
    krw_list =pyupbit.get_tickers(fiat=market)
    for krw in krw_list:
        time.sleep(0.05)
        url = "https://api.upbit.com/v1/ticker?markets=" + krw #원하는 시장 ticker의 url 만들기
        headers = {"Accept": "application/json"}
        response = requests.get(url, headers=headers)
        js_1 = json.loads(response.text) #json.loads 함수를 사용하여, json (문자열) > 파이썬의 사전 (Dictionary) 
        js_2 = js_1[0] # js_1의 경우 list로 둘러싸여 있는 사전 형태, index값인 0을 사용하여 list 벗겨내기
        name = js_2['market']
        volume_24h = js_2['acc_trade_price_24h']
        name_list.append(name) #coin name 리스트로 append
        volume_list.append(volume_24h) #거래대금 리스트로 append
    df = pd.DataFrame({'name' : name_list, '24h_volume' : volume_list}) #df 만들기
    new_df = df.sort_values('24h_volume', ascending=False) # 만든 df를 24h_volume 내림순으로 정렬하여 새로운 df만들기
    for i in range(num):
        top_list.append(new_df.iloc[i,0]) #상위 num 개 리스트로 append
    if 'KRW-BTC' in top_list:
        top_list.remove('KRW-BTC')
    if 'KRW-ETH' in top_list:
        top_list.remove('KRW-ETH')
    return top_list

def get_start_time(ticker):
    """시작 시간 조회"""
    df = pyupbit.get_ohlcv(ticker, interval="day", count=1)
    start_time = df.index[0]
    return start_time

schedule.every().day.at("10:00:00").do(top10_market,'KRW',10)

while True:
    try:
        now = datetime.datetime.now()
        start_time = get_start_time("KRW-BTC") + datetime.timedelta(hours=1) #당일 10시 
        end_time = start_time + datetime.timedelta(seconds=10) #당일10시 10초
        if start_time < now < end_time:
            schedule.run_pending()
            time.sleep(12)
            print(top_list)
    except Exception as e:
        print(e)
        time.sleep(1)

 

scheduler를 사용하여 인수가 있는 함수를 사용할때, 42번째 줄과 같이 (top10_market,'KRW',10) 함수 뒤 인수를 넣어주면 됩니다.  또한 단순히 print를 하는것이 아니라 top_list 라는 변수를 사용할것이기 때문에, global 를 사용하여 함수 밖에도 사용할수 있게 변역변수로 설정을 하였습니다.

 

또한 get_start_time 함수를 사용하여 10시에서 10시10초 사이에만 top_list를 불러오도록 하였습니다.

 

질문사항 있으시면 댓글남겨주세요!