fix qmt_api get_pass_codes
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user