○ 준비작업
Upbit Open API 를 활용하여 자동매매 프로그램을 만들어 보겠습니다.
먼저 API를 사용하기 위해서는 Upbit 에 사용신청을 해야합니다.
이곳에 사용방법이 안내가 잘되어있으며 기본 사용법까지 설명이 나와있습니다.
이것을 활용하여 프로그램을 만들어보겠습니다.
○ 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)
▶ 후기
매도/매수 전략을 잘짜놓으면 수입을 생길수 있습니다.
적은금액으로 시도하면서 적절한 룰을 정해나갈 예정입니다.
초기에 재미로 만들어봤지만 현재 제법 수입이 나서 본격적으로 만들어 보겠습니다.
저는 초단타로 수입을 내는 목적으로 하겠습니다.
'주식 > [Upbit] 자동매매' 카테고리의 다른 글
[Upbit] 자동매매 프로그램 (Python) - Ticker List 파일 생성 (8) | 2021.04.25 |
---|---|
[Upbit] 자동매매 프로그램 (Python) #3 (5) | 2021.04.08 |
[Upbit] 자동매매 기록 #2 (1) | 2021.04.07 |
[Upbit] 자동매매 프로그램 (Python) #2 (3) | 2021.03.25 |
[Upbit] 자동매매 기록 #1 (1) | 2021.03.20 |