fix qmt_api get_pass_codes

This commit is contained in:
2026-09-03 19:58:04 +08:00
parent cf5f33ab9e
commit e6c5c1023c

View File

@@ -3,7 +3,7 @@ import json
import locale import locale
import os import os
import sys import sys
from pathlib import Path from urllib.request import Request, urlopen
from tornado.web import Application, RequestHandler, HTTPError from tornado.web import Application, RequestHandler, HTTPError
from tornado.ioloop import IOLoop from tornado.ioloop import IOLoop
import logging import logging
@@ -13,6 +13,7 @@ ACCOUNT_ID = os.environ.get('QMT_ACCOUNT_ID', '')
DATA_DIR = os.environ.get('QMT_DATA_DIR', r'D:\qmt_strategy_data') DATA_DIR = os.environ.get('QMT_DATA_DIR', r'D:\qmt_strategy_data')
TOKEN="QMTbyYanweidong" TOKEN="QMTbyYanweidong"
PORT = 10086 PORT = 10086
PASS_CODES_URL = "http://139.224.247.176:13499/a/pass_codes"
# =================================== # ===================================
logging.basicConfig(level=logging.INFO) logging.basicConfig(level=logging.INFO)
@@ -32,6 +33,36 @@ def safe_call(func, *args, **kwargs):
) from e ) from e
def get_pass_codes(account_id):
request = Request(
PASS_CODES_URL,
headers={"Accept": "application/json", "User-Agent": "big-qmt/1"},
)
with urlopen(request, timeout=10) as response:
payload = json.load(response)
remote_codes = payload.get("data")
if not isinstance(remote_codes, list):
raise ValueError("pass_codes response data must be an array")
positions = safe_call(
get_trade_detail_data, account_id, 'stock', 'position'
) or []
position_codes = [
position.m_strInstrumentID + '.' + position.m_strExchangeID
for position in positions
]
codes = []
seen = set()
for code in remote_codes + position_codes:
code = str(code).strip()
if code and code not in seen:
seen.add(code)
codes.append(code)
return codes
# ============= BaseHandler ============= # ============= BaseHandler =============
AUTH_EXEMPT = set() AUTH_EXEMPT = set()
@@ -358,10 +389,8 @@ def init(ContextInfo):
try: try:
ContextInfo.accountID = ACCOUNT_ID ContextInfo.accountID = ACCOUNT_ID
ContextInfo.set_account(ACCOUNT_ID) ContextInfo.set_account(ACCOUNT_ID)
# Load the symbol universe only when configured.
pass_codes_path = Path(DATA_DIR) / "pass_codes.json" codes = get_pass_codes(ContextInfo.accountID)
with pass_codes_path.open("r", encoding="utf-8") as stream:
codes = json.load(stream)
ContextInfo.set_universe(list(codes)) ContextInfo.set_universe(list(codes))
# Api App # Api App