[코인 자동투자 봇 제작기 5] Main.py 코드 및 Config 함수 코드 작성

2024. 12. 17. 00:29프로젝트/암호화폐 투자 프로그램 제작

728x90

사진이 하나도 없어서 대표사진 겸 하나 걸어봤다 :)

이제 메인 코드의 로직을 작성할 차례이다.

일반적으로 우리가 코인을 매매할 때의 흐름을 바탕으로 코드를 구성한다고 생각하면 편하다.

대충 그 흐름을 정리해본다면 아래와 같을 것이다.

  1. 거래소에 로그인한다 == 거래소 API를 연결한다
  2. 레버리지 옵션을 선택한다
  3. 차트를 확인한다 == 가격정보를 불러오고 기술적 지표를 계산한다
  4. 원하는 가격에 도달하면 매수한다. == 기술적 지표에 따라 과매도 상황에서 매수한다.
  5. 손실이 너무 많이 발생하면 손절하고, 이득을 보면 매도하여 이익실현을 한다 == 스탑로스를 설정하고 과매수 상황에서 매도
  6. 반복...

이 흐름을 코드 상으로 간단히 구현하면 아래와 같을 것이다.

 

from config import Config

def main():
    print("투자 프로그램을 시작합니다.")
    
    # Config에서 환경변수 및 고정변수 불러오기

    # 초기 자산 조회 - notifier.py

    # 초기 데이터 수집 - data_control.py

    # 반복문 시작
    while True:
        try:
            print("매수/매도 판단을 시작합니다.")
            # 현재 가격 조회

            # 가격데이터 업데이트

            # 매수/매도 판단

            # 주문 진행

        except Exception as e:
            print(f"메인 루프 오류: {e}")
            # notifier.py를 통해 error 로그 전송

1~2번의 로직은 환경변수 및 고정변수를 불러오는 것으로 해결할 수 있다. 

3번의 로직은 반복문 내의 가격데이터 업데이트를 통해 진행되고,

4~5번 로직은 매수/매도 판단 및 주문 진행을 통해 구현할 수 있다.

이제 자세한 로직을 하나하나 구현해나갈텐데, 우선 초기환경을 구성해주는 Config 클래스를 만들어야 한다.

여기까지 커밋해두고 다시 진행하겠다.


config.py 로직 작성

해당 파일에는 민감한 환경변수나, 파라미터와 같은 고정변수들이 들어가야 한다. 코드를 수정하지 않고도 제어할 수 있도록 하는 것을 좋아하기 때문에, 개인적으로 모두 .env 파일에 저장하는 편이다.

.env  파일을 만들면 민감한 변수들을 보다 안전하게 관리할 수 있다는 장점이 있다.

gitignore 파일을 등록해두었다면 당연히 github에도 올라가지 않는다. 이걸 위해서라도 git ignore는 꼭 설정해두자.

pip install python-dotenv

등록해둔 환경변수를 파이썬 파일에서 불러오고 싶다면 os와 python-dotenv라는 라이브러리가 필요하다.

os는 기본적으로 제공되는 모듈이니 python-dotenv만 위의 명령어를 통해 설치해주자.

그 후, 파이썬에서는 아래와 같이 변수를 지정해서 사용해주면 된다.

import os
import dotenv

원하는_변수명 = os.getenv("환경변수에_저장된_변수명")

위와 같이 입력하면 환경변수 내에 저장되어 있는 변수를 파이썬 파일에서 활용할 수 있다.


환경변수 목록 체크하기

환경변수를 설정하기 이전에, 어떤 api를 필요로 하는지 살펴보자.

우리는 데이터를 받거나 다른 앱과 상호작용할 때 api를 활용하여 모든 행동을 제어할 것이다.

필요한 api와 그에 관련한 key들은 아래와 같다.

  1. binance api : 기본적으로 활용할 거래소는 해외 거래소 중 가장 규모가 크고 안정적인 바이넨스를 사용할 것이다.
    이를 위해 바이넨스 사이트에 접속하여 api access key와 secret key를 받아와야 한다.
  2. slack api : 우리가 거래 현황을 확인하고 알림을 받기 위해 가장 잘 활성화되어 있는 slack api를 활용할 것이다.
    이 slack 내에서 봇을 하나 만들고, api key를 활용하여 작업을 수행해주면 된다.

이 둘을 받고 초기 설정을 하는 부분은 따로 글을 올리도록 하겠다.

우선 api 키를 만들지 않은 상태에서, 이 외에 어떤 변수들이 환경변수에 등록되어야 할지 생각해보자.

이전에 사용하던 파일에서는 암호화를 요구하는 변수 뿐만 아니라 사소하게 주기적으로 변경될 수 있는 변수에 대해서도 환경변수로 저장했다.

예를 들면,

  1. 시드머니 : 초기 투자금은 언제든 달라질 수 있다. 총 수익률은 이를 바탕으로 하니 간편하게 수정할 수 있도록 해두자.
  2. 투자하고자 하는 코인 종류 : 어느날은 이더리움이, 어느날은 비트코인만 투자하고 싶을 수 있지 않을까?
  3. 현물/선물 투자비율 : 선물에 얼마나 투자할 것인지, 현물에는 얼마나 투자할 것인지를 정해두고 시장상황에 따라 수정하자.
  4. 레버리지 비율 : 몇배의 레버리지를 걸 것인지 상황에 따라 수정하자.
  5. stop loss 지점

정도가 있을텐데, stop loss는 변동성을 바탕으로 재설정할 것이므로 이건 빼고, 나머지 넷에 대한 환경변수를 추가해 두자.

import os
import dotenv

class Config():
    def __init__(self):
        print("환경변수 로드 중...")
        self.binance_access_key = os.getenv("BINANCE_ACCESS_KEY")
        self.binance_secret_key = os.getenv("BINANCE_SECRET_KEY")
        self.slack_api_key = os.getenv("SLACK_API_KEY")
        self.slack_asset_channel_id = os.getenv("SKACK_ASSET_CHANNEL_ID")
        self.slack_trade_channel_id = os.getenv("SKACK_TRADE_CHANNEL_ID")
        self.slack_error_channel_id = os.getenv("SKACK_ERROR_CHANNEL_ID")

        self.seed_money = os.getenv("SEED_MONEY")
        self.coin_tickers = os.getenv("COIN_TICKERS")
        self.sto_fut_rate = os.getenv("STO_FUT_RATE")
        self.leverage_rate = os.getenv("LEVERAGE_RATE")

        print("환경변수 로드 완료")
        
        self.verify(self)

    def verify(self):
        print("환경변수 검증중...")

        print("환경변수 검증 완료!")

이렇게 코드를 추가해 뒀다. 꼭 변수명 앞에 self.를 붙이도록 하자. 자세한 활용법은 추후에 파이썬 공부 부분에서 다루겠다.

나중에 .env 파일에는 아래와 같은 형식으로 그냥 저장하면 된다.

따옴표와 같은 문법기호는 안써도 상관없다.

SEED_MONEY = 200000

이제 환경변수 검증 부분을 작성하자.

이 부분은 비교적 간단하다. 조건문 몇개만 넣어서 제대로 설정되지 않은 변수가 있는지만 확인하면 된다.

import os
import dotenv

class Config():
    def __init__(self):
        print("환경변수 로드 중...")
        self.binance_access_key = os.getenv("BINANCE_ACCESS_KEY")
        self.binance_secret_key = os.getenv("BINANCE_SECRET_KEY")
        self.slack_api_key = os.getenv("SLACK_API_KEY")
        self.slack_asset_channel_id = os.getenv("SKACK_ASSET_CHANNEL_ID")
        self.slack_trade_channel_id = os.getenv("SKACK_TRADE_CHANNEL_ID")
        self.slack_error_channel_id = os.getenv("SKACK_ERROR_CHANNEL_ID")

        self.seed_money = os.getenv("SEED_MONEY")
        self.coin_tickers = os.getenv("COIN_TICKERS")
        self.sto_fut_rate = os.getenv("STO_FUT_RATE")
        self.leverage_rate = os.getenv("LEVERAGE_RATE")

        print("환경변수 로드 완료")
        
        self.verify(self)

    def verify(self):
        print("환경변수 검증중...")
        if not self.binance_access_key:
            raise ValueError("binance access key 환경변수가 제대로 설정되지 않았습니다.")
        elif not self.binance_secret_key:
            raise ValueError("binance secret key 환경변수가 제대로 설정되지 않았습니다.")
        elif not self.slack_api_key:
            raise ValueError("slack api key환경변수가 제대로 설정되지 않았습니다.")
        elif not self.slack_asset_channel_id:
            raise ValueError("slack asset channel id 환경변수가 제대로 설정되지 않았습니다.")
        elif not self.slack_trade_channel_id:
            raise ValueError("slack trade channel id 환경변수가 제대로 설정되지 않았습니다.")
        elif not self.slack_error_channel_id:
            raise ValueError("slack error channel id 환경변수가 제대로 설정되지 않았습니다.")
        elif not self.seed_money:
            raise ValueError("seed money 환경변수가 제대로 설정되지 않았습니다.")
        elif not self.coin_tickers:
            raise ValueError("coin tickers 환경변수가 제대로 설정되지 않았습니다.")
        elif not self.sto_fut_rate:
            raise ValueError("sto fut rate 환경변수가 제대로 설정되지 않았습니다.")
        elif not self.leverage_rate:
            raise ValueError("leverage rate 환경변수가 제대로 설정되지 않았습니다.")
        else:
            print("환경변수 검증 완료!")

이렇게 작성하면 검증 중 특정 변수가 설정되지 않았을 때 Error를 발생시키며 코드가 종료된다.

 


기능 브랜치 마무리하기

지금까지 feature/config 브랜치를 띄워 작업했고, 기본 설정에 대한 내용이 끝났다. 

그러니 아래 명령어를 입력하여 config 브랜치를 종료하고, develop에 병합시킬 것이다.

git checkout develop
git merge feature/config
git push origin develop

위 명령어를 하나씩 순서대로 입력하면, develop 브랜치로 모든 변경사항이 넘어간다.

develop 브랜치로 넘어온 후, 잊고있던 라이브러리 의존성을 추가해주자.

pip freeze > requirements.txt

이후 develop 브랜치에서 commit 해주면 된다.

 

마지막으로, feature/config 브랜치는 더이상 사용하지 않으니 완전히 제거하도록 하자.

기능 브랜치를 제때 제거하지 않으면 나중에 너무 많이 쌓여서 지저분해 보일 수 있다. 

# 로컬 브랜치 삭제
git branch -d feature/config

# 원격 브랜치 삭제
git push origin --delete feature/config

이것까지 마무리했다면, config 기능 개발을 완전히 끝낸 것이다!

728x90