概念板块重做
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: 四级行业
|
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)
|
db = SQLAlchemy(app)
|
||||||
mail = Mail(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
|
event_time = event.start_time if event.start_time else event.created_at
|
||||||
current_time = datetime.now()
|
current_time = datetime.now()
|
||||||
|
|
||||||
# 定义交易日和时间范围计算函数(与 app.py 中的逻辑完全一致)
|
# 定义交易日和时间范围计算函数(使用内存中的 TRADING_DAYS_SET)
|
||||||
def get_trading_day_and_times(event_datetime):
|
def get_trading_day_and_times(event_datetime):
|
||||||
event_date = event_datetime.date()
|
event_date = event_datetime.date()
|
||||||
event_time_only = event_datetime.time()
|
event_time_only = event_datetime.time()
|
||||||
@@ -4462,44 +4488,34 @@ def api_event_related_stocks(event_id):
|
|||||||
market_open = dt_time(9, 30)
|
market_open = dt_time(9, 30)
|
||||||
market_close = dt_time(15, 0)
|
market_close = dt_time(15, 0)
|
||||||
|
|
||||||
with engine.connect() as conn:
|
def get_next_trading_day(from_date):
|
||||||
# First check if the event date itself is a trading day
|
"""从 TRADING_DAYS_SET 获取下一个交易日"""
|
||||||
is_trading_day = conn.execute(text("""
|
# 最多查找 30 天
|
||||||
SELECT 1
|
for i in range(1, 31):
|
||||||
FROM trading_days
|
next_date = from_date + timedelta(days=i)
|
||||||
WHERE EXCHANGE_DATE = :date
|
if next_date in TRADING_DAYS_SET:
|
||||||
"""), {"date": event_date}).fetchone() is not None
|
return next_date
|
||||||
|
return None
|
||||||
|
|
||||||
if is_trading_day:
|
# 检查事件日期是否是交易日
|
||||||
# If it's a trading day, determine time period based on event time
|
is_trading_day = event_date in TRADING_DAYS_SET
|
||||||
if event_time_only < market_open:
|
|
||||||
# Before market opens - use full trading day
|
if is_trading_day:
|
||||||
return event_date, market_open, market_close
|
# If it's a trading day, determine time period based on event time
|
||||||
elif event_time_only > market_close:
|
if event_time_only < market_open:
|
||||||
# After market closes - get next trading day
|
# Before market opens - use full trading day
|
||||||
next_trading_day = conn.execute(text("""
|
return event_date, market_open, market_close
|
||||||
SELECT EXCHANGE_DATE
|
elif event_time_only > market_close:
|
||||||
FROM trading_days
|
# After market closes - get next trading day
|
||||||
WHERE EXCHANGE_DATE > :date
|
next_trading_day = get_next_trading_day(event_date)
|
||||||
ORDER BY EXCHANGE_DATE LIMIT 1
|
return (next_trading_day, market_open, market_close)
|
||||||
"""), {"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
|
|
||||||
else:
|
else:
|
||||||
# If not a trading day, get next trading day
|
# During trading hours
|
||||||
next_trading_day = conn.execute(text("""
|
return event_date, event_time_only, market_close
|
||||||
SELECT EXCHANGE_DATE
|
else:
|
||||||
FROM trading_days
|
# If not a trading day, get next trading day
|
||||||
WHERE EXCHANGE_DATE > :date
|
next_trading_day = get_next_trading_day(event_date)
|
||||||
ORDER BY EXCHANGE_DATE LIMIT 1
|
return (next_trading_day, market_open, market_close)
|
||||||
"""), {"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)
|
|
||||||
|
|
||||||
trading_day, start_time, end_time = get_trading_day_and_times(event_time)
|
trading_day, start_time, end_time = get_trading_day_and_times(event_time)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user