비트코인 자동 매매 프로그램 제작중 keyerror 0 가 발생했습니다

조회수 607회
import pyupbit
import time
import datetime
import pandas as pd

def get_target_price(ticker, interval, k):        # 변동성 돌파 전략으로 매수 목표가 정하기 
    df = pyupbit.get_ohlcv(ticker, interval=interval, count=2)     
    target_price = df.iloc[0]['close'] + (df.iloc[0]['high'] - df.iloc[0]['low']) * k       
    return target_price

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

def get_current_price(ticker):                      # 현재 가격 가져오기
    return pyupbit.get_orderbook(ticker=ticker)[0]["orderbook_units"][0]["ask_price"]

def get_balance(currency):                          # 잔고 조회
    balances = upbit.get_balances()
    for b in balances:
        if b['currency'] == currency:
            if b['balance'] is not None:
                return float(b['balance'])
            else:
                return 0

def get_buy_average(currency):                      # 매수평균가
    balances = upbit.get_balances()
    for b in balances:
        if b['currency'] == currency:
            if b['avg_buy_price'] is not None:
                return float(b['avg_buy_price'])
            else:
                return 0

def get_trade_time(ticker):                         # 최근 거래 채결 날짜 가져오기
    df = pd.DataFrame(upbit.get_order(ticker, state="done"))
    trade_done = df.iloc[0]["created_at"]
    trade_done_time = datetime.datetime.strptime(trade_done[:-6], "%Y-%m-%dT%H:%M:%S")
    return trade_done_time


# 로그인
access = "-----"          # 본인 값으로 변경
secret = "-----"         # 본인 값으로 변경

upbit = pyupbit.Upbit(access, secret)
print("Login OK")


# 총 매수 할 원화, 분할 매수 비율
total = 1000000
rate30 = 0.3
rate40 = 0.4
rate_minus = 0.95

# 시간 간격
interval = "day"
# interval = "minute240"

# ticker, k, currency
ticker = "KRW-ARK"
currency = "LTC"
k = 0.12


# 자동 매매 무한반복
while True:

    # 시간 설정
    start_time = get_start_time(ticker, interval)
    now = datetime.datetime.now()
    end_time = start_time + datetime.timedelta(days=1) - datetime.timedelta(seconds=5)
    # end_time = start_time + datetime.timedelta(minutes=240) - datetime.timedelta(seconds=5)

    # 매매 시작
    if start_time < now < end_time:
        target_price = get_target_price(ticker, interval, k)
        print("Start: %s" % (start_time))
        print("End: %s" % (end_time))
        print("Target price: %d" % (target_price))

        i = 0 
        while i < 3:
            now = datetime.datetime.now()
            current_price = get_current_price(ticker)
            time.sleep(0.5)

            # 매수 1차
            if i==0 and (target_price-50) <= current_price < (target_price+100):
                upbit.buy_market_order(ticker, total*rate30)
                time.sleep(1)
                buy_average = get_buy_average(currency)
                i += 1                
                print("%dst Buy OK" % (i))              

            # 매수 2차
            if i==1 and current_price < buy_average*rate_minus:
                upbit.buy_market_order(ticker, total*rate30)
                time.sleep(1)
                buy_average = get_buy_average(currency)
                i += 1
                print("%dnd Buy OK" % (i))


            # 매수 3차
            if i==2 and current_price < buy_average*rate_minus:
                upbit.buy_market_order(ticker, total*rate40)
                time.sleep(1)
                buy_average = get_buy_average(currency)
                i += 1
                print("%drd Buy OK" % (i))

            if now > end_time:
                break

    elif now > end_time:
        coin = get_balance(currency)
        upbit.sell_market_order(ticker, coin)
        time.sleep(1)
        print("Sell OK")

를 실행하면

예외가 발생했습니다.
 KeyError
0

 File "-----", line 17, in get_current_price
    return pyupbit.get_orderbook(ticker=ticker)[0]["orderbook_units"][0]["ask_price"]

 File "-----", line 87, in <module>
    current_price = get_current_price(ticker)

라는 문장이 출력되면서 작동이 안됩니다.

  • 오류문을 천천히 읽어보시면, get_current_price 를 실행하면서 뭔가 키를 얻어내려고 했는데 0이라는 키를 못 찾았다는 오류라는 걸 아실 수 있습니다. 엽토군 2022.1.26 20:32

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)