update pay ui
This commit is contained in:
128
app.py
128
app.py
@@ -153,6 +153,66 @@ def get_trading_day_near_date(target_date):
|
||||
return trading_days[-1] if trading_days else None
|
||||
|
||||
|
||||
def get_target_and_prev_trading_day(event_datetime):
|
||||
"""
|
||||
根据事件时间确定目标交易日和前一交易日(用于计算涨跌幅)
|
||||
|
||||
处理跨周末场景:
|
||||
- 周五15:00后到周一15:00前,分时图显示周一行情,涨跌幅基于周五收盘价
|
||||
|
||||
逻辑:
|
||||
- 如果事件时间在交易日的 9:00-15:00 之间,显示当天数据,涨跌幅基于前一交易日
|
||||
- 如果事件时间在交易日的 15:00 之后,显示下一个交易日数据,涨跌幅基于当天
|
||||
- 如果事件时间在非交易日(周末/节假日),显示下一个交易日数据,涨跌幅基于上一个交易日
|
||||
- 如果事件时间在交易日的 9:00 之前,显示当天数据,涨跌幅基于前一交易日
|
||||
|
||||
返回:(target_date, prev_close_date) - 分时图显示日期和涨跌幅基准日期
|
||||
"""
|
||||
if not trading_days:
|
||||
load_trading_days()
|
||||
|
||||
if not trading_days:
|
||||
return None, None
|
||||
|
||||
# 如果是datetime,提取date和time
|
||||
if isinstance(event_datetime, datetime):
|
||||
event_date = event_datetime.date()
|
||||
event_time = event_datetime.time()
|
||||
else:
|
||||
event_date = event_datetime
|
||||
event_time = dt_time(12, 0) # 默认中午,认为在盘中
|
||||
|
||||
# 检查事件日期是否是交易日
|
||||
is_trading_day = event_date in trading_days_set
|
||||
|
||||
# 收盘时间判断
|
||||
market_close_time = dt_time(15, 0)
|
||||
is_after_market = event_time > market_close_time
|
||||
|
||||
if is_trading_day:
|
||||
if is_after_market:
|
||||
# 交易日收盘后:显示下一个交易日,涨跌幅基于当天(即本交易日)
|
||||
target_date = get_trading_day_near_date(event_date + timedelta(days=1))
|
||||
prev_close_date = event_date
|
||||
else:
|
||||
# 交易日盘中或开盘前:显示当天,涨跌幅基于前一交易日
|
||||
target_date = event_date
|
||||
# 找前一个交易日
|
||||
target_idx = trading_days.index(event_date) if event_date in trading_days else -1
|
||||
prev_close_date = trading_days[target_idx - 1] if target_idx > 0 else None
|
||||
else:
|
||||
# 非交易日(周末/节假日):显示下一个交易日,涨跌幅基于上一个交易日
|
||||
target_date = get_trading_day_near_date(event_date)
|
||||
# 找上一个交易日作为基准
|
||||
prev_close_date = None
|
||||
for td in reversed(trading_days):
|
||||
if td < event_date:
|
||||
prev_close_date = td
|
||||
break
|
||||
|
||||
return target_date, prev_close_date
|
||||
|
||||
|
||||
# 应用启动时加载交易日数据
|
||||
load_trading_days()
|
||||
|
||||
@@ -7244,20 +7304,10 @@ def get_stock_quotes():
|
||||
full_stock_names[orig_code] = name
|
||||
full_stock_names[norm_code] = name
|
||||
|
||||
# ==================== 使用全局交易日数据(与 batch-kline 一致) ====================
|
||||
# 确定目标交易日:获取事件时间对应的交易日或之前最近的交易日
|
||||
event_date = event_time.date()
|
||||
|
||||
# 如果事件日期是交易日,使用该日期
|
||||
if event_date in trading_days_set:
|
||||
target_date = event_date
|
||||
else:
|
||||
# 否则,找之前最近的交易日(用于获取历史数据)
|
||||
target_date = None
|
||||
for td in reversed(trading_days):
|
||||
if td <= event_date:
|
||||
target_date = td
|
||||
break
|
||||
# ==================== 使用全局交易日数据(处理跨周末场景) ====================
|
||||
# 使用新的辅助函数处理跨周末场景:
|
||||
# - 周五15:00后到周一15:00前,分时图显示周一行情,涨跌幅基于周五收盘价
|
||||
target_date, prev_trading_day = get_target_and_prev_trading_day(event_time)
|
||||
|
||||
if not target_date:
|
||||
return jsonify({
|
||||
@@ -7266,17 +7316,11 @@ def get_stock_quotes():
|
||||
for code in original_codes}
|
||||
})
|
||||
|
||||
# 获取前一个交易日
|
||||
prev_trading_day = None
|
||||
target_idx = trading_days.index(target_date) if target_date in trading_days else -1
|
||||
if target_idx > 0:
|
||||
prev_trading_day = trading_days[target_idx - 1]
|
||||
|
||||
start_datetime = datetime.combine(target_date, dt_time(9, 30))
|
||||
end_datetime = datetime.combine(target_date, dt_time(15, 0))
|
||||
|
||||
results = {}
|
||||
print(f"批量处理 {len(codes)} 只股票: {codes[:5]}{'...' if len(codes) > 5 else ''}, 交易日: {target_date}, 前一交易日: {prev_trading_day}, 时间范围: {start_datetime} - {end_datetime}")
|
||||
print(f"批量处理 {len(codes)} 只股票: {codes[:5]}{'...' if len(codes) > 5 else ''}, 目标交易日: {target_date}, 涨跌幅基准日: {prev_trading_day}, 时间范围: {start_datetime} - {end_datetime}")
|
||||
|
||||
# 初始化 ClickHouse 客户端
|
||||
client = get_clickhouse_client()
|
||||
@@ -8081,14 +8125,9 @@ def get_batch_kline_data():
|
||||
for row in result:
|
||||
stock_names[row[0]] = row[1]
|
||||
|
||||
# 确定目标交易日
|
||||
target_date = get_trading_day_near_date(event_datetime.date())
|
||||
is_after_market = event_datetime.time() > dt_time(15, 0)
|
||||
|
||||
if target_date and is_after_market:
|
||||
next_trade_date = get_trading_day_near_date(target_date + timedelta(days=1))
|
||||
if next_trade_date:
|
||||
target_date = next_trade_date
|
||||
# 确定目标交易日和涨跌幅基准日(处理跨周末场景)
|
||||
# - 周五15:00后到周一15:00前,分时图显示周一行情,涨跌幅基于周五收盘价
|
||||
target_date, prev_trading_day = get_target_and_prev_trading_day(event_datetime)
|
||||
|
||||
if not target_date:
|
||||
# 返回空数据(使用原始代码作为 key)
|
||||
@@ -8103,21 +8142,24 @@ def get_batch_kline_data():
|
||||
results = {}
|
||||
|
||||
if chart_type == 'timeline':
|
||||
# 批量获取昨收价(从 MySQL ea_trade 表)
|
||||
# 批量获取前收盘价(从 MySQL ea_trade 表)
|
||||
# 使用 prev_trading_day 作为基准日期(处理跨周末场景)
|
||||
prev_close_map = {}
|
||||
target_date_str = target_date.strftime('%Y%m%d')
|
||||
with engine.connect() as conn:
|
||||
base_codes = list(set([code.split('.')[0] for code in codes]))
|
||||
if base_codes:
|
||||
placeholders = ','.join([f':code{i}' for i in range(len(base_codes))])
|
||||
params = {f'code{i}': code for i, code in enumerate(base_codes)}
|
||||
params['trade_date'] = target_date_str
|
||||
result = conn.execute(text(f"""
|
||||
SELECT SECCODE, F007N FROM ea_trade
|
||||
WHERE SECCODE IN ({placeholders}) AND TRADEDATE = :trade_date AND F007N > 0
|
||||
"""), params).fetchall()
|
||||
for row in result:
|
||||
prev_close_map[row[0]] = float(row[1])
|
||||
if prev_trading_day:
|
||||
prev_date_str = prev_trading_day.strftime('%Y%m%d')
|
||||
with engine.connect() as conn:
|
||||
base_codes = list(set([code.split('.')[0] for code in codes]))
|
||||
if base_codes:
|
||||
placeholders = ','.join([f':code{i}' for i in range(len(base_codes))])
|
||||
params = {f'code{i}': code for i, code in enumerate(base_codes)}
|
||||
params['trade_date'] = prev_date_str
|
||||
result = conn.execute(text(f"""
|
||||
SELECT SECCODE, F007N FROM ea_trade
|
||||
WHERE SECCODE IN ({placeholders}) AND TRADEDATE = :trade_date AND F007N > 0
|
||||
"""), params).fetchall()
|
||||
for row in result:
|
||||
prev_close_map[row[0]] = float(row[1])
|
||||
print(f"分时图基准日期: {prev_trading_day}, 查询到 {len(prev_close_map)} 条前收盘价")
|
||||
|
||||
# 批量查询分时数据(使用标准化代码查询 ClickHouse)
|
||||
batch_data = client.execute("""
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user