본문 바로가기
AutoBot

업비트 자동매매 - Upbit Auto Trading No.8 (설정파일 로드 및 구조 작성)

by zemba 2022. 1. 26.
반응형
SMALL

안녕하세요~ Zemba입니다~
지난번 포스팅에서는 텔레그램을 세팅하고 코드로 메시지를 보내는 방법에 대해서 알아보았습니다.
그렇기 때문에 이번 포스팅에서는 본격적으로 설정 파일을 읽고 값을 불러와서 사용하는 방법과 매매에 대한 준비작업을 진행해 보겠습니다. 먼저 지난번 포스팅에서 텔레그램 세팅을 안 하셨다면 참고하시길 바랍니다 ( 참고 : https://zemba.tistory.com/35 )

 

Upbit Auto Trading No.7 (텔레그램 Bot 셋팅 및 코드 작성)

안녕하세요~ Zemba입니다. 오늘은 지난번 포스팅에서 예고하였듯이 텔레그램의 Bot를 세팅하고 코드를 작성하여 메시지를 전송하는 방법에 대해서 작성해보려고 합니다. 우선 텔레그램을 사용하

zemba.tistory.com

우선은 복잡하지 않고 간결하게 실행하고자 합니다. 그래서 파일을 여러개 나누지 않고 실행하는 파일은 1개로 지정하며 나머지 관련 Util 또는 매매 전략에 대한 부분만 교체 가능하도록 구조를 잡으려고 합니다. ( 약간의 귀차니즘 포함 ㅋㅋ )
저는 우선 코드의 변경사항을 클라우드에서 git으로 clone하여 실행하려고 합니다. 그렇기 때문에 github에 repository를 연동해서 사용하도록 했습니다. (프로젝트 생성은 찾아보면 많이 나오기 때문에 생략합니다 ㅎㅎ)

저는 리눅스 환경에서 이 자동매매 python을 동작시키려고 합니다. 그래서 python 명령어를 사용해도 되지만 좀전에 github를 사용하여 적용한다고 말씀드렸기 때문에 별도의 shell script를 생성하여 실행시키려고 합니다.

main.py를 start.sh로 실행

지난번에 만든 텔레그램 클래스와 설정 파일(member_list.json) 그리고 이번에 main.py파일을 생성하고 (이 파일에서 모든 것을 실행시킬 것입니다!) 서버에서 이 python 파일을 실행시키기 위한 start.sh파일도 하나 생성합니다. 그래서 그림과 같이 파일이 생성되어있도록 합니다.

우선 shell의 내용은 다음으로 미루고 본격적인 main.py의 내용을 보도록 하겠습니다.

if __name__ == '__main__':
    while True:
        try:
            print("Start AccumulatedCoinBot")
            member_list = get_member_list()

            json_data = json.loads(member_list)
            print(json_data)
            user_list = json_data['user']

...
...

            time.sleep(60 * 59)
        except Exception as e:
            print(f"Error : {e}")

우리는 main.py를 실행해야하기 때문에 python의 main을 작성해줘야 합니다(?) ㅋㅋ 파일명 하고 이름이 같아서 혼란스러울 수도 있지만 java, c등에서 Application의 시작이 되는 부분을 main함수라고 합니다. 그래서 python도 마찬가지로 application을 수행하기 위한 main을 별도로 작성했다고 보시면 됩니다. 그리고 이 자동매매를 만드는 목적은 잠을 잘 때도 돌아가야 하기 때문에 while True를 선언하여 계속 끝나지 않도록 지정해 줍니다. 그리고 내부 동작이 진행하면서 오류가 발생하여 프로그램이 중지가 될 가능성이 있기 때문에 try-except 구문을 사용하여 오류를 출력은 하지만 중단되게 하지는 않게 작성을 해줍니다. 

우선 여기까지 작성했다면 기본적인 뼈대는 작성이 된것입니다. ( 날로 먹는다 ㅋㅋㅋㅋ )
이제 내부에 관련 코드를 추가하여 동작을 시킬것입니다. 위에 코드를 보시면 이미 라인의 코드가 있는 것을 보실 수 있습니다.
하나하나 살펴보겠습니다.

print("Start AccumulatedCoinBot")
member_list = get_member_list()

json_data = json.loads(member_list)
print(json_data)
user_list = json_data['user']

 

우선 프로그램이 시작했다는 것을 commend line에서 볼수있도록 print함수를 사용하여 Bot의 시작을 출력하도록 했습니다.
그다음에는 이전 포스팅에서 config를 사용하여 설정을 관리하고 변경 가능하도록 하기로 했기 때문에  get_member_list() 함수를 통해 설정 파일을 가지고 오도록 하였습니다. 설정 파일인데 왜 함수명과 변수명이 member_list인지 의문을 가지 실수 있을 텐데요...ㅎ 지난 포스팅에서 말씀드린 것과 같이 저는 지인 몇몇도 같이 돌려줄 계획이 있기 때문에 user를 받도록 구조를 잡아서 한 명 한 명이 member이기 때문에 파일명과 함수명을 member_list라고 정했습니다. ( 이 부분은 불필요하다면 함수명은 변경하셔도 무방합니다! )
우선 여기서 get_member_list()의 내용을 보기 전에 다음 라인부터 먼저 보겠습니다.
앞전 포스팅에서도 말씀드렸지만 config의 형식은 json 포맷을 이용하여 사용할 것이기 때문에 설정 파일을 load 한 다음에 python에서 json형태로 인식할 수 있도록 데이터를 변경하는 과정이라고 보시면 됩니다. ( 여기서 그럼 member_list는 당연히 json형태로 구성되어있어야겠죠!!) 그래서 json_data라는 변수에 config를 load 하여 user_list의 변수에 자동매매를 수행항 user의 목록을 가져도 오록 작성하였습니다. 잊어버렸을 수도 있기 때문에 다시 한번 config의 구조를 설명드리면......

{
   "user":[
      {
         "name":"zemba",
         "access_key":"업비트에서 발급한 access key",
         "secret_key":"업비트에서 발급한 secret key",
         "telegram_token":"텔레그램에서 생성한 개인 봇 토큰",
         "chat_id":"텔레그램 토큰을 통해서 chat_id를 구한다",
         "minimum_buy_price":"5001",
         "target_ticker":[
            "KRW-BTC",
            "KRW-ETH"
			...
         ]
      }
   ]
}

user의 json 배열에서 사용자를 한 명씩 조회하여 각각의 access_key, secret_key, 텔레그램 봇 정보를 통해 자동매매를 수행하기 위함이었습니다. 그렇기 때문에 json으로 config를 load 하고 json 데이터로 변환하여 user_list에 json_data ['user']의 정보를 가져온 것이라고 보시면 됩니다. 그럼 이제 get_member_list() 함수의 내용을 살펴보겠습니다.

def get_member_list():
    f = open('member_list.json', 'r')
    json_str = []
    for s in f:
        json_str.append(s)
    f.close()

    return ''.join(json_str)

 

앞에서도 말씀드렸지만 member_list.json파일에 config정보를 담고 읽어서 사용할 것이기 때문에 file을 열고 내용을 읽도록 합니다.
내용을 읽어서 하나의 문자열로 return 해주도록 합니다. 그럼 이제 전체 코드를 다시 확인하여 정리를 해보면....

  • 작업 과정
    1. get_member_list 함수를 통해 member_list.json 파일을 읽는다.
    2. member_list.json의 파일 내용을 json data로 변환한다.
    3. 변환된 json data 중에 user의 내용을 가져와서 user 목록을 얻는다.

자 우선 여기까지 완료가 되었습니다. 그다음에 해야 할 작업은 config파일의 정보를 사용하기 위해서 값을 꺼내와야 합니다.

for user_config in user_list:
    name = user_config["name"]		#user 이름
    minimum_buy_price = float(user_config["minimum_buy_price"])		#최소 매수 금액
    target_ticker = user_config["target_ticker"]	#거래할 티커 목록
    
    access_key = user_config["access_key"]			#Upbit Access_key
    secret_key = user_config["secret_key"]			#Upbit Secret_key
    
    telegram_token = user_config["telegram_token"]	#텔레그램 토큰
    telegramBot = TelegramSender(telegram_token)	#텔레그램 객체 생성
    chat_id = user_config["chat_id"]				#텔레그램 Bot의 chat_id
    
    ticker_msg = []
    ticker_msg.append(f"============================\n")
    ticker_msg.append(f"Start ----- {now()} -----\n")
    ticker_msg.append(f"============================\n")
    
    # 자동 매매 구현 부분
    
    telegramBot.send(chat_id, ''.join(ticker_msg))

user_list에 config의 list를 가져왔기 때문에 저는 다시 loop를 통하여 config를 읽도록 for문을 적용하였고 ( 혼자 쓰면 필요 없습니다! ) config의 값의 key 값들인 정보를 각각의 변수로 가져옵니다.
텔레그램을 통하여 메시지를 전송하여 자동매매가 잘 수행되고 있다는 정보를 받아야 하기때문에 이전 포스팅에서 만든 TelegramSender의 객체를 생성하고 생성자로 Token정보를 같이 넘겨주도록 합니다. 그리고 마지막에 생성된 객체를 통하여 send로 ticker_msg에 이런저런 거래 정보등을 담은 메세지를 발송하도록 코드를 작성합니다. 여기까지 잘 동작하는지 확인해봐도 됩니다. ticker_msg에 config의 정보들을 추가해주고 이 python을 실행하면 텔레그램 Bot에 메시지가 잘 전달되는지 확인해 보면 됩니다~


자 그럼 여기까지 작성하고 다시 정리를 해보자면.....ㅎ 

  • 작업 과정
    1. get_member_list 함수를 통해 member_list.json 파일을 읽는다.
    2. member_list.json의 파일 내용을 json data로 변환한다.
    3. 변환된 json data 중에 user의 내용을 가져와서 user 목록을 얻는다.
    4. user 목록을 loop 돌면서 user별 config를 불러와서 텔레그램 객체를 생성하고 메시지를 보낼 수 있는 구조를 작성한다.

이렇게까지 작업이 완료되었습니다. ( 음? 거의 다 끝났네? ㅋㅋ )
위서 코드에서 주석으로 작성해둔 것처럼 이제는 자동매매의 로직만 구현해서 추가하면 자동매매 프로그램 완성입니다!!!!!
다음 포스팅은 주석에 작성된 부분인 자동매매의 부분을 중점적으로 다뤄볼 예정입니다.
여기서 잠시 끊고 가는 이유는 다음 포스팅이 가장 중요하고 내용도 많을 것 같아서 우선 여기까지 나누고 다음 포스팅에 작성하려 합니다. ㅎ

저는 전문 투자자도 아니고 그냥 일개 개미에 불과하면 그냥 개발자이기 때문에 전문적인 지식이 없어 실제 투자의 결정은 본인에게 있습니다.

반응형
LIST

댓글