Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- rise 200고배당커버드콜atm
- 오블완
- OXY
- S&P500
- 재테크
- 자동매매
- 삼성전자우
- N잡
- 매일매수
- 강환국
- ETF
- 퇴직연금
- JEPQ
- 토스
- Python
- IRP
- chatGPT
- isa
- ace 미국30년국채액티브(h)
- 티스토리챌린지
- 미국주식
- 연금
- 주식
- 업비트
- 개인연금
- 삼성전자
- 국장
- 직투
- 앱테크
- SCHD
Archives
- Today
- Total
재테크 A2Z
2025.05.25 다중 종목 자동매매 시스템 구성 본문
📌 목표
기존에는 비트코인(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 |
