From 07e74d054e4fad692458f8a608e7550e5c5341b2 Mon Sep 17 00:00:00 2001 From: yanweidong Date: Wed, 2 Sep 2026 21:19:33 +0800 Subject: [PATCH] fix qmt_rest_new.py --- api/qmt_rest_new.py | 87 ++++++++++++--------------------------------- 1 file changed, 23 insertions(+), 64 deletions(-) diff --git a/api/qmt_rest_new.py b/api/qmt_rest_new.py index fb705aa..ac2f529 100644 --- a/api/qmt_rest_new.py +++ b/api/qmt_rest_new.py @@ -1,4 +1,4 @@ -# -*- coding: gbk -*- +# -*- coding: utf-8 -*- import json import locale import os @@ -84,40 +84,44 @@ class ContextInfoHandler(BaseHandler): # ============= 2. Data queries (ContextInfo get_*) ============= STOCK_HANDLER = { - # stock_name|open_date|last_volume|total_share|svol|bvol - "stock_name": ("get_stock_name", "stock_code", True), - "open_date": ("get_open_date", "stock_code", True), - "last_volume": ("get_last_volume", "stock_code", True), - "total_share": ("get_total_share", "stock_code", True), - "svol": ("get_svol", "stock_code", True), - "bvol": ("get_bvol", "stock_code", True), + # handler_type: (method_name, use_context) + "stock_name": ("get_stock_name", True), + "open_date": ("get_open_date", True), + "last_volume": ("get_last_volume", True), + "total_share": ("get_total_share", True), + "svol": ("get_svol", True), + "bvol": ("get_bvol", True), + "divid_factors": ("get_divid_factors", True), + "etf_info": ("get_etf_info", False), + "etf_iopv": ("get_etf_iopv", False), + "instrumentdetail": ("get_instrumentdetail", True), + "his_st_data": ("get_his_st_data", True), } -# "/api/v2/get/*" ContextInfo.* Get a stock name by symbol +# "/api/v2/get/*" Stock-related single-symbol queries class StockGetHandler(BaseHandler): - def get(self,handler_type): + def get(self, handler_type): # 快速路径:配置查找 cfg = STOCK_HANDLER.get(handler_type) if not cfg: - self.write_error(500, reason="Unknown API") - return + raise HTTPError(500, "Unknown API") # 参数验证 - query_vals = self.get_query_argument(cfg.index[1], "").strip() + query_vals = self.get_query_argument("stock_code", "").strip() if not query_vals: - self.write_error(500, reason=f"{cfg.index[1]} required") - return + raise HTTPError(500, "stock_code required") # 方法调用 - method = getattr(self.ctx(), cfg.index[0]) + method_name, use_context = cfg + method = getattr(self.ctx(), method_name) if use_context else globals()[method_name] result = safe_call(method, query_vals) # 响应 - self.finish({ + self.write(json.dumps({ "stock_code": query_vals, "ref": result - }) + }, separators=(',', ':'), ensure_ascii=False, default=str)) # ContextInfo.get_bar_timetag() - Get the bar timestamp class BarTimetagHandler(BaseHandler): @@ -260,14 +264,6 @@ class FullTickHandler(BaseHandler): raise HTTPError(500, "Failed to get tick data") self.write(json.dumps(ret, separators=(',', ':'), ensure_ascii=False, default=str)) -# ContextInfo.get_divid_factors() - Get dividend and adjustment factors -class DividFactorsHandler(BaseHandler): - def post(self): - data = json.loads(self.request.body) - stockcode = data.get('stockcode', '') - ret = safe_call(self.ctx().get_divid_factors, stockcode) - self.write(json.dumps({"stockcode": stockcode, "factors": ret or {}}, separators=(',', ':'), ensure_ascii=False)) - # ContextInfo.get_main_contract() - Get the main futures contract class MainContractHandler(BaseHandler): def post(self): @@ -346,30 +342,6 @@ class TurnoverRateHandler(BaseHandler): ret = ret.to_dict() self.write(json.dumps({"data": ret} if ret else {"error": "Failed to get turnover rate"}, separators=(',', ':'), ensure_ascii=False, default=str)) -# get_etf_info() - Get ETF creation/redemption and constituent data -class EtfInfoHandler(BaseHandler): - def post(self): - data = json.loads(self.request.body) - stockcode = data.get('stockcode', '') - ret = safe_call(get_etf_info, stockcode) - self.write(json.dumps({"stockcode": stockcode, "info": ret or {}}, separators=(',', ':'), ensure_ascii=False, default=str)) - -# get_etf_iopv() - Get the ETF indicative optimized portfolio value -class EtfIopvHandler(BaseHandler): - def post(self): - data = json.loads(self.request.body) - stockcode = data.get('stockcode', '') - ret = safe_call(get_etf_iopv, stockcode) - self.write(json.dumps({"stockcode": stockcode, "iopv": ret}, separators=(',', ':'), ensure_ascii=False)) - -# ContextInfo.get_instrumentdetail() - Get instrument details -class InstrumentDetailHandler(BaseHandler): - def post(self): - data = json.loads(self.request.body) - stockcode = data.get('stockcode', '') - ret = safe_call(self.ctx().get_instrumentdetail, stockcode) - self.write(json.dumps({"stockcode": stockcode, "detail": ret or {}}, separators=(',', ':'), ensure_ascii=False, default=str)) - # ContextInfo.get_contract_expire_date() - Get the futures contract expiration date class ContractExpireDateHandler(BaseHandler): def post(self): @@ -430,14 +402,6 @@ class FactorDataHandler(BaseHandler): ret = ret.to_dict() self.write(json.dumps({"data": ret} if ret is not None else {"error": "Failed to get factor data"}, separators=(',', ':'), ensure_ascii=False, default=str)) -# ContextInfo.get_his_st_data() - Get historical ST data -class HisStDataHandler(BaseHandler): - def post(self): - data = json.loads(self.request.body) - stockCode = data.get('stockCode', '') - ret = safe_call(self.ctx().get_his_st_data, stockCode) - self.write(json.dumps({"stockCode": stockCode, "data": ret or {}}, separators=(',', ':'), ensure_ascii=False)) - # ContextInfo.get_his_index_data() - Get historical index data class HisIndexDataHandler(BaseHandler): def post(self): @@ -1250,7 +1214,7 @@ def make_app(): (r"/api/v2/assets", AssetsHandler), # ContextInfo properties (r"/api/v2/context/info", ContextInfoHandler), - (r"/api/v2/get/(stock_name|open_date|last_volume|total_share|svol|bvol)", StockGetHandler), + (r"/api/v2/get/(stock_name|open_date|last_volume|total_share|svol|bvol|divid_factors|etf_info|etf_iopv|instrumentdetail|his_st_data)", StockGetHandler), # Legacy compatibility routes (r"/api/holding", HoldingHandler), @@ -1275,7 +1239,6 @@ def make_app(): (r"/api/data/market_data", MarketDataHandler), (r"/api/data/market_data_ex", MarketDataExHandler), (r"/api/data/full_tick", FullTickHandler), - (r"/api/data/divid_factors", DividFactorsHandler), (r"/api/data/main_contract", MainContractHandler), (r"/api/data/timetag_to_datetime", TimetagToDatetimeHandler), (r"/api/data/trading_dates", TradingDatesHandler), @@ -1283,14 +1246,10 @@ def make_app(): (r"/api/data/top10_share_holder", Top10ShareHolderHandler), (r"/api/data/option_detail", OptionDetailHandler), (r"/api/data/turnover_rate", TurnoverRateHandler), - (r"/api/data/etf_info", EtfInfoHandler), - (r"/api/data/etf_iopv", EtfIopvHandler), - (r"/api/data/instrumentdetail", InstrumentDetailHandler), (r"/api/data/contract_expire_date", ContractExpireDateHandler), (r"/api/data/option_undl_data", OptionUndlDataHandler), (r"/api/data/financial_data", FinancialDataHandler), (r"/api/data/factor_data", FactorDataHandler), - (r"/api/data/his_st_data", HisStDataHandler), (r"/api/data/his_index_data", HisIndexDataHandler), (r"/api/data/all_subscription", AllSubscriptionHandler), (r"/api/data/option_list", OptionListHandler),