fix qmt_rest_new.py
This commit is contained in:
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user