update pay ui
This commit is contained in:
112
app.py
112
app.py
@@ -13590,6 +13590,118 @@ def get_trade_data(seccode):
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/api/market/trade/batch', methods=['POST'])
|
||||
def get_batch_trade_data():
|
||||
"""批量获取多只股票的交易数据(日K线)
|
||||
请求体:{
|
||||
codes: string[], // 股票代码列表(6位代码)
|
||||
days: number // 获取天数,默认1
|
||||
}
|
||||
返回:{ success: true, data: { [seccode]: { data: [], stats: {} } } }
|
||||
"""
|
||||
try:
|
||||
data = request.json
|
||||
codes = data.get('codes', [])
|
||||
days = data.get('days', 1)
|
||||
end_date = data.get('end_date', datetime.now().strftime('%Y-%m-%d'))
|
||||
|
||||
if not codes:
|
||||
return jsonify({'success': False, 'error': '请提供股票代码列表'}), 400
|
||||
|
||||
if len(codes) > 100:
|
||||
return jsonify({'success': False, 'error': '单次最多查询100只股票'}), 400
|
||||
|
||||
# 构建批量查询
|
||||
placeholders = ','.join([f':code{i}' for i in range(len(codes))])
|
||||
params = {f'code{i}': code for i, code in enumerate(codes)}
|
||||
params['end_date'] = end_date
|
||||
params['days'] = days
|
||||
|
||||
query = text(f"""
|
||||
SELECT SECCODE,
|
||||
TRADEDATE,
|
||||
SECNAME,
|
||||
F002N as pre_close,
|
||||
F003N as open,
|
||||
F004N as volume,
|
||||
F005N as high,
|
||||
F006N as low,
|
||||
F007N as close,
|
||||
F008N as trades_count,
|
||||
F009N as change_amount,
|
||||
F010N as change_percent,
|
||||
F011N as amount,
|
||||
F012N as turnover_rate,
|
||||
F013N as amplitude
|
||||
FROM ea_trade
|
||||
WHERE SECCODE IN ({placeholders})
|
||||
AND TRADEDATE <= :end_date
|
||||
ORDER BY SECCODE, TRADEDATE DESC
|
||||
""")
|
||||
|
||||
with engine.connect() as conn:
|
||||
result = conn.execute(query, params)
|
||||
rows = result.fetchall()
|
||||
|
||||
# 按股票代码分组,每只股票只取最近N天
|
||||
stock_data = {}
|
||||
stock_counts = {}
|
||||
|
||||
for row in rows:
|
||||
seccode = row.SECCODE
|
||||
if seccode not in stock_data:
|
||||
stock_data[seccode] = []
|
||||
stock_counts[seccode] = 0
|
||||
|
||||
# 只取指定天数的数据
|
||||
if stock_counts[seccode] < days:
|
||||
stock_data[seccode].append({
|
||||
'date': format_date(row.TRADEDATE),
|
||||
'stock_name': row.SECNAME,
|
||||
'open': format_decimal(row.open),
|
||||
'high': format_decimal(row.high),
|
||||
'low': format_decimal(row.low),
|
||||
'close': format_decimal(row.close),
|
||||
'pre_close': format_decimal(row.pre_close),
|
||||
'volume': format_decimal(row.volume),
|
||||
'amount': format_decimal(row.amount),
|
||||
'change_amount': format_decimal(row.change_amount),
|
||||
'change_percent': format_decimal(row.change_percent),
|
||||
'turnover_rate': format_decimal(row.turnover_rate),
|
||||
'amplitude': format_decimal(row.amplitude),
|
||||
'trades_count': format_decimal(row.trades_count),
|
||||
})
|
||||
stock_counts[seccode] += 1
|
||||
|
||||
# 倒序每只股票的数据(让最早的日期在前)
|
||||
results = {}
|
||||
for seccode, data_list in stock_data.items():
|
||||
data_list.reverse()
|
||||
results[seccode] = {
|
||||
'data': data_list,
|
||||
'stats': {
|
||||
'latest_price': data_list[-1]['close'] if data_list else None,
|
||||
'change_percent': data_list[-1]['change_percent'] if data_list else None,
|
||||
} if data_list else {}
|
||||
}
|
||||
|
||||
# 为没有数据的股票返回空结果
|
||||
for code in codes:
|
||||
if code not in results:
|
||||
results[code] = {'data': [], 'stats': {}}
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'data': results
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': str(e)
|
||||
}), 500
|
||||
|
||||
|
||||
@app.route('/api/market/funding/<seccode>', methods=['GET'])
|
||||
def get_funding_data(seccode):
|
||||
"""获取融资融券数据"""
|
||||
|
||||
Reference in New Issue
Block a user