본문 바로가기

[Toy Project] 자동매매

[Toy Project] 자동매매 프로그램 만들기 - 7. 매매 정보 엑셀에 기록하기

728x90
반응형

[목차]

 

1. 매매 함수 반환 값 분석

 

2. 매매 기록 엑셀에 자동 기록

 

3. 주기적으로 엑셀에 시가 기록

 

 

  1. 매매 함수 반환 값 분석

 

매매 정보를 엑셀에 기록하기에 앞서, 매매를 했을 때 반환되는 결과가 어떤 형태인지 먼저 알아보자. 

 

우선, 매매할 때 이용하는 함수는 buy_limit_order / sell_limit_order 또는 buy_market_order / sell_market_order이다. 

 

업비트의 API 가이드에 따르면 이 함수들의 반환 값은 다음과 같다. 

 

실제로 반환 값을 출력해보면 아래와 같이 딕셔너리의 형태로 이루어져 있는 것을 볼 수 있다. 

지정가 매수를 한 경우이다.

 

여기서 우리가 반드시 기록할 필요가 있는 변수들이 무엇이 있을까?

기본적으로 매매한 코인명과 매매 시간, 매매한 양은 필요할 것이다. 

따라서, 우선 매수인지 매도인지를 알려주는 'side' 변수가 필요하다. 

그리고 매매한 코인 명인 'market' 변수, 매매 시간을 나타내는 'created_at' 변수, 지정가인지 시장가인지 알려주는 'ord_type' 변수도 필요하다. 다만, RSI를 이용한 매매법은 항상 시장가로 매매를 하기 때문에 이는 생략한다. 

또 매수를 한 경우에는 매수한 금액인 'price'가 필요하며 매도한 경우에는 매도한 수량을 표현하는 'volume' 변수가 필요하다. 

 

단, 매도한 금액은 시장가 매도로는 바로 얻을 수 없기 때문에, volume에 매도된 가격을 곱해주어야 하는데, 매도된 가격을 정확하게 파악하기가 어려우므로, 매도 후 원화 보유량 - 기존의 원화 보유량을 통해서 매도한 금액을 계산하기로 하였다. 

 

따라서, ('side', 'market', 'created_at', 'price') 변수를 사용할 것이다. 

 

 

  2. 매매 기록 엑셀에 자동 기록

 

이전의 매매 게시글에서 매매의 결과를 res 변수에 저장하였다. 

주문에 실패한 경우에는 딕셔너리에 'error'라는 키값이 포함되므로, 'error'가 key값으로 존재하지 않는 경우에만 엑셀에 기록하였다. 

 

엑셀에 매매 정보를 기록하는 함수인 write_trade 함수를 구현해보자. 

 

엑셀에 기록하는 순서는 각 행별로 [매매 일자, 매매 시간, 코인명, 매매 종류, 매매 금액] 총 5개의 항목을 매번 기록한다. 

행에 들어갈 값들은 row라는 리스트에 하나씩 넣어준 뒤, 한 번에 엑셀에 작성한다. 

def write_trade(trade, diff):
    wb = load_workbook('엑셀 파일명')
    ws = wb[wb.sheetnames[0]]

 

trade는 매매 함수에서 반환된 딕셔너리이고, diff는 매도인 경우 보유 중인 원화의 변화량이다. 

먼저, 매매가 이루어진 시간이다. 

시간은 'created_at': '2021-05-28T00:18:12+09:00' 의 형태로 반환되므로, 날짜와 시간을 각각 분리해낸 후 저장한다. 

따라서 다음과 같이 코드를 구현한다. 

day = trade['created_at'].split('T')[0] # 날짜
time = trade['created_at'].split('T')[1].split('+')[0] # 시간
row.append(day)
row.append(time)

 

그다음 코인명은 반환된 ticker로 구해낸다. 미리 {ticker, 코인 한글명}을 쌍으로 갖는 딕셔너리를 생성해둔다. 

coinname = {'KRW-ETC':'이더리움클래식', 'KRW-XRP':'리플', 'KRW-ETH':'이더리움', 
'KRW-BTC':'비트코인캐시', 'KRW-OMG':'오미세고', 'KRW-EOS':'이오스'}

row.append(coinname[trade['market']])

 

다음은 매수/매도에 따라서 각각 매매한 금액을 저장하는 부분이다. 

'side' 의 값이 'ask'이면 매도, 'bid'이면 매수이므로 조건문을 통해서 분리한다. 

매도인 경우에는 입력받은 diff 인수를 넣어주고, 매수인 경우에는 'price'의 값을 넣어준다. 

if trade['side'] == 'ask':
    row.append('매도')
    row.append(diff)
else :
    row.append('매수')
    row.append(trade['price'])

 

최종적으로 row를 엑셀에 작성해주고, 저장해준다. 

ws.append(row)
wb.save('엑셀 파일명')

 

 

  3. 주기적으로 엑셀에 시가 기록

 

내가 짠 매매 전략이 효과적으로 작용하고 있는지를 파악하기 위해서는 시장의 가격 변동률과 나의 자산의 변동률을 비교할 필요가 있다. 만약 매매 대상인 암호화폐들이 주어진 기간 내에 5% 상승했을 때, 나의 자산이 5% 이상 상승했다면 효과적으로 작용하고 있다고 할 수 있는 것이다. 

 

이를 위해서 주기적으로(4시간) 매매 대상인 암호화폐들의 현재가와, 나의 총 보유자산을 자동으로 기록한다. 

 

9시, 13시, 17시, 21시, 1시, 5시마다 기록을 해주기 위해서 먼저 현재 시간의 '시'를 구한다. 

hour = str(datetime.datetime.now()).split(' ')[1].split('.')[0].split(':')[0]
hour = int(hour)

 

datetime.datetime.now()의 형태가 '2021-05-29 17:39:48.160364'의 형태로 나타나기 때문에 여기서 17을 뽑아내기 위해서 split 함수를 여러 번 이용한다. 

 

그다음, '시'를 4로 나눴을 때 나머지가 1인 경우가 기록해야 하는 시점이고, 한번 기록하면 24시간 뒤에 기록해주기 위해서 boolean타입의 리스트를 만들어둔다. 

엑셀에 작성하기 위해서는 리스트에서 '시'에 해당하는 원소의 값이 False이어야 하고, 작성하고 나면 해당 시간의 원소는 True로 바꿔주는 방식이다. 

if hour % 4 == 1 and recordtime[hour // 4] == False:
    for i in range(6):
        recordtime[i] = False
    recordtime[hour//4] = True
    write_regularly(coinlist)

 

write_regularly는 주기적으로 기록하기 위한 함수이다. 

작성하는 방식은 위의 매매 정보 기록과 비슷하므로 생략하겠다. 

아래는 자동으로 작성된 결과를 보여준다. 

 

 

PC로 보시는 것을 권장합니다. 

피드백은 언제나 환영입니다. 댓글로 달아주세요 ^-^

728x90
반응형
  • 문봉궁 2021.08.17 14:21 댓글주소 수정/삭제 댓글쓰기

    운영자님 제가 이제 파이썬 공부한지 한달이 채 되지않은 초짜라
    고수님께 도움하나 요청해도 될까요 ??
    시작이 반이라고 감히 자동매매를 하나씩 짜보고 있는데요
    아래에 코드를 한번 봐주실수 있을까요

    완전 주먹구구식으로 짠거라 부끄럽습니다..ㅠㅠ
    업비트 처럼 티커를 인자로 넣어서 가격을 리턴받고 싶은데
    아래에 바이비트는 초짜 입장에서는 복잡해서 어찌 접근해야 할지를 모르겠습니다..




    import pyupbit as upbit
    import bybit



    # 업비트 코인시세 리턴
    # 업비트는 코인티커를 넣으면 바로 가격이 확인가능
    coin = upbit.get_current_price("KRW-DOGE")
    print(coin)




    client = bybit.bybit(test=False, api_key="", api_secret="")

    # 코인의 순서확인
    #바이빗은 코인순서를 확인후 다시 아래의 리스트인덱스[] <-- 여기에 넣어서 확인 ㅠㅠ
    tickers = client.Market.Market_symbolInfo().result()
    ticker = tickers[0]["result"]
    for i,element in enumerate(ticker):
    print([i],element["symbol"], end=" : ")
    print(element["last_price"]) # 티커위치 확인



    # 순서를 확인한후 순번을 입력해서 시세확인
    bycoin = ticker[17]["last_price"] # 바이비트 달러화 티커위치번호 넣고 가격리턴
    print(bycoin)

    • 죄송합니다 ㅠㅠ 해당 부분은 바이비트에서 제공하는 함수에 대한 정보를 알아야 알 수 있을 것 같네요...

  • 문봉궁 2021.08.17 15:13 댓글주소 수정/삭제 댓글쓰기

    아닙니다 저도 얼른 완성해서 다시 감사인사 하려 오겠습니다.. 꾸벅

  • 익명 2021.09.26 21:05 댓글주소 수정/삭제 댓글쓰기

    비밀댓글입니다

  • 익명 2022.01.16 11:23 댓글주소 수정/삭제 댓글쓰기

    비밀댓글입니다