버그 수정
This commit is contained in:
@@ -173,7 +173,7 @@ def analyze_custom_signals(chart_data):
|
|||||||
disparity = (close / ma20) * 100
|
disparity = (close / ma20) * 100
|
||||||
|
|
||||||
# 🚫 급등 종목 필터: 최근 3일 상승률 체크
|
# 🚫 급등 종목 필터: 최근 3일 상승률 체크
|
||||||
if len(closes) >= 3:
|
if len(closes) >= 4:
|
||||||
price_3days_ago = closes[-4]
|
price_3days_ago = closes[-4]
|
||||||
recent_gain = ((close - price_3days_ago) / price_3days_ago) * 100 if price_3days_ago > 0 else 0
|
recent_gain = ((close - price_3days_ago) / price_3days_ago) * 100 if price_3days_ago > 0 else 0
|
||||||
if recent_gain > 10: # 3일간 10% 이상 급등 시 매수 안함
|
if recent_gain > 10: # 3일간 10% 이상 급등 시 매수 안함
|
||||||
@@ -1123,8 +1123,14 @@ async def get_rule_based_recommendations(
|
|||||||
result = await get_rule_based_recommendations_from_db(db)
|
result = await get_rule_based_recommendations_from_db(db)
|
||||||
|
|
||||||
# 자동매매 실행 (백그라운드)
|
# 자동매매 실행 (백그라운드)
|
||||||
|
# 주의: 엔드포인트 반환 후 FastAPI가 db 세션을 닫으므로,
|
||||||
|
# 백그라운드 태스크는 독립적인 새 세션을 열어서 사용해야 한다.
|
||||||
if auto_trade and result.get("recommendations_by_rule"):
|
if auto_trade and result.get("recommendations_by_rule"):
|
||||||
asyncio.create_task(execute_auto_trade_background(result, db))
|
rec_snapshot = result
|
||||||
|
async def _bg_trade():
|
||||||
|
async with AsyncSessionLocal() as bg_db:
|
||||||
|
await execute_auto_trade_background(rec_snapshot, bg_db)
|
||||||
|
asyncio.create_task(_bg_trade())
|
||||||
logger.info("🤖 Auto-trade task created in background")
|
logger.info("🤖 Auto-trade task created in background")
|
||||||
|
|
||||||
return result
|
return result
|
||||||
@@ -2033,16 +2039,16 @@ async def execute_auto_trade(stock: dict, db: AsyncSession):
|
|||||||
score_val = 0.0
|
score_val = 0.0
|
||||||
|
|
||||||
buy_keywords = [
|
buy_keywords = [
|
||||||
"정배열 상승 매수타점",
|
"정배열 눌림목 매수", # "정배열 눌림목 매수 (이격도 안정)"
|
||||||
"눌림목", # 눌림목 진입 매수타점
|
"눌림목 진입 매수타점", # "눌림목 진입 매수타점"
|
||||||
"RSI 과매도",
|
"RSI 바닥 탈출 반등", # "RSI 바닥 탈출 반등 (XX)"
|
||||||
"RSI 중립-상승",
|
"RSI 안정 상승", # "RSI 안정 상승 (XX)"
|
||||||
"스토캐스틱 과매도",
|
"스토캐스틱 과매도", # "스토캐스틱 과매도 (%K: XX)"
|
||||||
"5일선 > 20일선",
|
"5일선 > 20일선",
|
||||||
"20일선 > 60일선",
|
"20일선 > 60일선",
|
||||||
"골든크로스",
|
"골든크로스", # "MACD 골든크로스"
|
||||||
"볼린저 하한선 터치",
|
"볼린저 하한선 터치",
|
||||||
"ADX 강한 추세",
|
"횡보장 — 평균회귀 유리", # "ADX(XX<20) 횡보장 — 평균회귀 유리"
|
||||||
"거래량 증가와 상승",
|
"거래량 증가와 상승",
|
||||||
]
|
]
|
||||||
should_buy = any(k in text_signals for k in buy_keywords)
|
should_buy = any(k in text_signals for k in buy_keywords)
|
||||||
@@ -2192,7 +2198,7 @@ async def execute_auto_trade(stock: dict, db: AsyncSession):
|
|||||||
last_buy_at = recent_buys[0].created_at if recent_buys else None
|
last_buy_at = recent_buys[0].created_at if recent_buys else None
|
||||||
|
|
||||||
# 쿨다운 체크
|
# 쿨다운 체크
|
||||||
if last_buy_at and (datetime.now() - last_buy_at).total_seconds() < cooldown_min * 60:
|
if last_buy_at and (_get_kst_now() - last_buy_at).total_seconds() < cooldown_min * 60:
|
||||||
logger.info(f"⏳ 추가매수 대기: {stock_name} {cooldown_min}분 쿨다운 미경과")
|
logger.info(f"⏳ 추가매수 대기: {stock_name} {cooldown_min}분 쿨다운 미경과")
|
||||||
return {"action": "HOLD", "stock": stock_name, "reason": "cooldown"}
|
return {"action": "HOLD", "stock": stock_name, "reason": "cooldown"}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user