概念板块重做
This commit is contained in:
Binary file not shown.
90
app_vx.py
90
app_vx.py
@@ -723,6 +723,32 @@ SYWG_INDUSTRY_CACHE = {
|
||||
5: {} # level5: 四级行业
|
||||
}
|
||||
|
||||
# 交易日缓存(从 tdays.csv 加载)
|
||||
TRADING_DAYS_SET = set()
|
||||
|
||||
def load_trading_days():
|
||||
"""从 tdays.csv 加载交易日数据到内存"""
|
||||
global TRADING_DAYS_SET
|
||||
csv_path = os.path.join(os.path.dirname(__file__), 'tdays.csv')
|
||||
try:
|
||||
with open(csv_path, 'r', encoding='utf-8') as f:
|
||||
reader = csv.reader(f)
|
||||
next(reader) # 跳过表头
|
||||
for row in reader:
|
||||
if row:
|
||||
# 解析日期格式 2010/1/4 -> date 对象
|
||||
date_str = row[0].strip()
|
||||
parts = date_str.split('/')
|
||||
if len(parts) == 3:
|
||||
year, month, day = int(parts[0]), int(parts[1]), int(parts[2])
|
||||
TRADING_DAYS_SET.add(datetime(year, month, day).date())
|
||||
print(f"[交易日] 已加载 {len(TRADING_DAYS_SET)} 个交易日 (范围: {min(TRADING_DAYS_SET)} ~ {max(TRADING_DAYS_SET)})")
|
||||
except Exception as e:
|
||||
print(f"[交易日] 加载 tdays.csv 失败: {e}")
|
||||
|
||||
# 启动时加载交易日
|
||||
load_trading_days()
|
||||
|
||||
# 初始化扩展
|
||||
db = SQLAlchemy(app)
|
||||
mail = Mail(app)
|
||||
@@ -4453,7 +4479,7 @@ def api_event_related_stocks(event_id):
|
||||
event_time = event.start_time if event.start_time else event.created_at
|
||||
current_time = datetime.now()
|
||||
|
||||
# 定义交易日和时间范围计算函数(与 app.py 中的逻辑完全一致)
|
||||
# 定义交易日和时间范围计算函数(使用内存中的 TRADING_DAYS_SET)
|
||||
def get_trading_day_and_times(event_datetime):
|
||||
event_date = event_datetime.date()
|
||||
event_time_only = event_datetime.time()
|
||||
@@ -4462,44 +4488,34 @@ def api_event_related_stocks(event_id):
|
||||
market_open = dt_time(9, 30)
|
||||
market_close = dt_time(15, 0)
|
||||
|
||||
with engine.connect() as conn:
|
||||
# First check if the event date itself is a trading day
|
||||
is_trading_day = conn.execute(text("""
|
||||
SELECT 1
|
||||
FROM trading_days
|
||||
WHERE EXCHANGE_DATE = :date
|
||||
"""), {"date": event_date}).fetchone() is not None
|
||||
def get_next_trading_day(from_date):
|
||||
"""从 TRADING_DAYS_SET 获取下一个交易日"""
|
||||
# 最多查找 30 天
|
||||
for i in range(1, 31):
|
||||
next_date = from_date + timedelta(days=i)
|
||||
if next_date in TRADING_DAYS_SET:
|
||||
return next_date
|
||||
return None
|
||||
|
||||
if is_trading_day:
|
||||
# If it's a trading day, determine time period based on event time
|
||||
if event_time_only < market_open:
|
||||
# Before market opens - use full trading day
|
||||
return event_date, market_open, market_close
|
||||
elif event_time_only > market_close:
|
||||
# After market closes - get next trading day
|
||||
next_trading_day = conn.execute(text("""
|
||||
SELECT EXCHANGE_DATE
|
||||
FROM trading_days
|
||||
WHERE EXCHANGE_DATE > :date
|
||||
ORDER BY EXCHANGE_DATE LIMIT 1
|
||||
"""), {"date": event_date}).fetchone()
|
||||
# Convert to date object if we found a next trading day
|
||||
return (next_trading_day[0].date() if next_trading_day else None,
|
||||
market_open, market_close)
|
||||
else:
|
||||
# During trading hours
|
||||
return event_date, event_time_only, market_close
|
||||
# 检查事件日期是否是交易日
|
||||
is_trading_day = event_date in TRADING_DAYS_SET
|
||||
|
||||
if is_trading_day:
|
||||
# If it's a trading day, determine time period based on event time
|
||||
if event_time_only < market_open:
|
||||
# Before market opens - use full trading day
|
||||
return event_date, market_open, market_close
|
||||
elif event_time_only > market_close:
|
||||
# After market closes - get next trading day
|
||||
next_trading_day = get_next_trading_day(event_date)
|
||||
return (next_trading_day, market_open, market_close)
|
||||
else:
|
||||
# If not a trading day, get next trading day
|
||||
next_trading_day = conn.execute(text("""
|
||||
SELECT EXCHANGE_DATE
|
||||
FROM trading_days
|
||||
WHERE EXCHANGE_DATE > :date
|
||||
ORDER BY EXCHANGE_DATE LIMIT 1
|
||||
"""), {"date": event_date}).fetchone()
|
||||
# Convert to date object if we found a next trading day
|
||||
return (next_trading_day[0].date() if next_trading_day else None,
|
||||
market_open, market_close)
|
||||
# During trading hours
|
||||
return event_date, event_time_only, market_close
|
||||
else:
|
||||
# If not a trading day, get next trading day
|
||||
next_trading_day = get_next_trading_day(event_date)
|
||||
return (next_trading_day, market_open, market_close)
|
||||
|
||||
trading_day, start_time, end_time = get_trading_day_and_times(event_time)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user