fix: harden screening data collection
Some checks failed
Deploy to Production / deploy (push) Failing after 12h57m55s
Some checks failed
Deploy to Production / deploy (push) Failing after 12h57m55s
This commit is contained in:
parent
0b66eae847
commit
5a452e4714
@ -240,7 +240,9 @@ class PriceCollector(BaseCollector):
|
||||
logger.info("Collecting stock prices via KRX Open API")
|
||||
total = self._collect_openapi()
|
||||
logger.info(f"Collected {total} price records via Open API")
|
||||
return total
|
||||
if total > 0:
|
||||
return total
|
||||
logger.warning("KRX Open API returned 0 price records, falling back to pykrx")
|
||||
except Exception as e:
|
||||
logger.warning(f"KRX Open API failed, falling back to pykrx: {e}")
|
||||
|
||||
|
||||
@ -224,7 +224,10 @@ class StockCollector(BaseCollector):
|
||||
if client:
|
||||
try:
|
||||
logger.info("Collecting stock data via KRX Open API")
|
||||
return self._collect_openapi()
|
||||
total = self._collect_openapi()
|
||||
if total > 0:
|
||||
return total
|
||||
logger.warning("KRX Open API returned 0 stock records, falling back to pykrx")
|
||||
except Exception as e:
|
||||
logger.warning(f"KRX Open API failed, falling back to pykrx: {e}")
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ from collections import defaultdict
|
||||
from datetime import date, datetime, time as dtime, timedelta
|
||||
from decimal import Decimal
|
||||
from typing import Iterable
|
||||
from zoneinfo import ZoneInfo
|
||||
|
||||
import pandas as pd
|
||||
from sqlalchemy import func
|
||||
@ -16,6 +17,15 @@ logger = logging.getLogger(__name__)
|
||||
|
||||
LOOKBACK_CALENDAR_DAYS = 430
|
||||
MIN_HISTORY_ROWS = 20
|
||||
KST = ZoneInfo("Asia/Seoul")
|
||||
|
||||
|
||||
def _now_kst() -> datetime:
|
||||
return datetime.now(KST)
|
||||
|
||||
|
||||
def _today_kst() -> date:
|
||||
return _now_kst().date()
|
||||
|
||||
|
||||
def _as_float(value, default: float = 0.0) -> float:
|
||||
@ -256,7 +266,7 @@ def run_morning_screening():
|
||||
|
||||
def run_intraday_exit_check():
|
||||
"""09:05~15:20 KST - Check exits and optional auto entries."""
|
||||
now = datetime.now()
|
||||
now = _now_kst()
|
||||
if not (dtime(9, 5) <= now.time() <= dtime(15, 20)):
|
||||
logger.info("Outside trading window (09:05~15:20), skipping trade check")
|
||||
return
|
||||
@ -280,7 +290,7 @@ def run_intraday_exit_check():
|
||||
if not pos:
|
||||
continue
|
||||
|
||||
latest_date = _latest_price_date(db, market="KOSPI") or date.today()
|
||||
latest_date = _latest_price_date(db, market="KOSPI") or _today_kst()
|
||||
rows = (
|
||||
db.query(Price)
|
||||
.filter(
|
||||
@ -316,7 +326,7 @@ def run_intraday_exit_check():
|
||||
sell_qty = max(1, int(pos.qty * exit_signal["sell_ratio"]))
|
||||
order = executor.place_sell_order(signal.ticker, sell_qty)
|
||||
db.add(AutoOrder(
|
||||
order_date=datetime.now(),
|
||||
order_date=_now_kst().replace(tzinfo=None),
|
||||
ticker=signal.ticker,
|
||||
order_type="sell",
|
||||
qty=sell_qty,
|
||||
@ -327,7 +337,7 @@ def run_intraday_exit_check():
|
||||
))
|
||||
if order.success and exit_signal["sell_ratio"] >= 1.0:
|
||||
signal.status = "closed"
|
||||
signal.exit_date = date.today()
|
||||
signal.exit_date = _today_kst()
|
||||
signal.exit_price = current_price
|
||||
|
||||
if not getattr(settings, "screening_auto_trade_enabled", False):
|
||||
@ -347,7 +357,7 @@ def run_intraday_exit_check():
|
||||
for signal in watching:
|
||||
if signal.ticker in open_tickers:
|
||||
continue
|
||||
latest_date = _latest_price_date(db, market="KOSPI") or date.today()
|
||||
latest_date = _latest_price_date(db, market="KOSPI") or _today_kst()
|
||||
rows = (
|
||||
db.query(Price)
|
||||
.filter(
|
||||
@ -376,7 +386,7 @@ def run_intraday_exit_check():
|
||||
|
||||
order = executor.place_buy_order(signal.ticker, qty, int(entry["entry_price"]))
|
||||
db.add(AutoOrder(
|
||||
order_date=datetime.now(),
|
||||
order_date=_now_kst().replace(tzinfo=None),
|
||||
ticker=signal.ticker,
|
||||
order_type="buy",
|
||||
qty=qty,
|
||||
@ -407,7 +417,7 @@ def run_closing_review():
|
||||
logger.info("Starting closing review")
|
||||
db = SessionLocal()
|
||||
try:
|
||||
today = date.today()
|
||||
today = _today_kst()
|
||||
|
||||
stale_before = today - timedelta(days=7)
|
||||
stale_signals = (
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user