재테크 A2Z

2025.05.25 다중 종목 자동매매 시스템 구성 본문

재테크

2025.05.25 다중 종목 자동매매 시스템 구성

a2ztec 2025. 5. 25. 08:29

📌 목표

기존에는 비트코인(KRW-BTC)만 자동매매 대상으로 삼았으나, 이제는 이더리움(KRW-ETH)을 포함한 다중 종목 전략 자동화를 지원하도록 run.py를 리팩터링했습니다.

📁 적용 전략

  • 이동평균 (moving_average)
  • RSI (rsi)
  • 볼린저밴드 (bollinger)
  • 트렌드 추종 (trend_following)
  • 그리드 트레이딩 (grid_trading)
  • 변동성 돌파 (volatility_breakout)
  • 모멘텀 전략 (momentum)

🎯 대상 종목

아래 리스트에 코인을 추가하면 자동으로 모든 전략이 해당 종목에 대해 적용됩니다:

tickers = ["KRW-BTC", "KRW-ETH"]

🔁 자동매매 루프 설정 방식

모든 전략과 종목에 대해 1분마다 실행되도록 schedule 라이브러리로 설정:

for name, func in strategies.items():
    for ticker in tickers:
        schedule.every(1).minutes.do(lambda n=name, f=func, t=ticker: run_strategy(n, f, t))

📂 전체 코드 다운로드

다중 종목 자동매매를 위한 전체 코드 파일:


import time
import schedule
import pyupbit
import os
from dotenv import load_dotenv
from datetime import datetime

from autobot_trader.strategies.moving_average import get_moving_average_signal
from autobot_trader.strategies.rsi import get_rsi_signal
from autobot_trader.strategies.bollinger import get_bollinger_signal
from autobot_trader.strategies.trend_following import get_trend_following_signal
from autobot_trader.strategies.grid_trading import get_grid_trading_signal
from autobot_trader.strategies.volatility_breakout import get_volatility_breakout_signal
from autobot_trader.strategies.momentum import get_momentum_signal

from autobot_trader.telegram_bot import send_message
from autobot_trader.log_signal import log_signal
from autobot_trader.order_executor import market_buy, market_sell
from autobot_trader.db_logger import log_trade, init_db, get_last_trade_time

# ✅ 환경 변수 로드
load_dotenv()
ACCESS_KEY = os.getenv("UPBIT_ACCESS_KEY")
SECRET_KEY = os.getenv("UPBIT_SECRET_KEY")
upbit = pyupbit.Upbit(ACCESS_KEY, SECRET_KEY)

# ✅ DB 초기화
init_db()

# ✅ 전략 실행 함수
def run_strategy(name, func, ticker):
    print(f"⏱️ [{name}] 전략 실행 중... ({ticker})")
    try:
        signal = func()
        price = pyupbit.get_current_price(ticker)

        if price is None:
            print("❌ 가격 조회 실패")
            return

        last_time, last_side = get_last_trade_time(ticker, name)

        if signal == "buy" and last_side == "buy":
            time_diff = (datetime.now() - last_time).total_seconds() / 60
            if time_diff < 10:
                print(f"⛔ 최근 매수({time_diff:.1f}분 전), 재매수 금지")
                return

        if signal == "buy":
            amount = 10000
            if amount < 5000:
                print("⛔ 최소 주문 금액 미만 (5,000원)")
                return

            try:
                result = market_buy(ticker, amount)
                if result:
                    volume = float(result['executed_volume'])
                    log_trade(ticker, "buy", volume, price, name)
                    log_signal(name, ticker, signal, price)
                    send_message(f"📈 <b>[{name}] {ticker} 매수 완료</b>\n가격: <code>{price:,.0f}원</code>")
            except Exception as e:
                send_message(f"❌ <b>[{name}] 매수 에러</b>: {e}")

        elif signal == "sell":
            balance = upbit.get_balance(ticker)
            if balance is None or balance < 0.0001:
                print("⛔ 매도할 잔고 부족")
                return

            try:
                result = market_sell(ticker, balance)
                if result:
                    log_trade(ticker, "sell", balance, price, name)
                    log_signal(name, ticker, signal, price)
                    send_message(f"📉 <b>[{name}] {ticker} 매도 완료</b>\n가격: <code>{price:,.0f}원</code>")
            except Exception as e:
                send_message(f"❌ <b>[{name}] 매도 에러</b>: {e}")
        else:
            print(f"💤 [{name}] 시그널 없음")

    except Exception as e:
        send_message(f"⚠️ <b>[{name}] 전략 실행 오류 ({ticker})</b>: {e}")

# ✅ 메인 루프
def main():
    print("🚀 전략 다중화 자동매매 루프 시작 (1분마다 실행)")

    strategies = {
        "moving_average": get_moving_average_signal,
        "rsi": get_rsi_signal,
        "bollinger": get_bollinger_signal,
        "trend_following": get_trend_following_signal,
        "grid_trading": get_grid_trading_signal,
        "volatility_breakout": get_volatility_breakout_signal,
        "momentum": get_momentum_signal
    }

    tickers = ["KRW-BTC", "KRW-ETH"]  # 🎯 대상 종목 추가 시 이 리스트에 추가

    for name, func in strategies.items():
        for ticker in tickers:
            schedule.every(1).minutes.do(lambda n=name, f=func, t=ticker: run_strategy(n, f, t))

    while True:
        schedule.run_pending()
        time.sleep(1)

if __name__ == "__main__":
    main()

 

 

📝 다음 단계

  • 전략별 자금 할당 비율 설정
  • 코인별 수익률 리포트 분리
  • 자동 리밸런싱 기능 추가

'재테크' 카테고리의 다른 글

2025.05.31 개인연금 #1  (0) 2025.05.31
2025.05.25 코인매매전략  (0) 2025.05.25
2025.05.25 코인 자동매매 시스템 구축 일지  (0) 2025.05.25
볼린저밴드 매매  (1) 2025.05.18
2025.05.17 개인연금 현황  (1) 2025.05.17