dev 6
This commit is contained in:
@@ -23,9 +23,14 @@ locale.setlocale(locale.LC_CTYPE, 'chinese')
|
||||
def safe_call(func, *args, **kwargs):
|
||||
try:
|
||||
return func(*args, **kwargs)
|
||||
except HTTPError:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.error(f"{func.__name__} call failed: {e}")
|
||||
return None
|
||||
logger.exception("%s call failed", func.__name__)
|
||||
raise HTTPError(
|
||||
502,
|
||||
reason="QMT upstream call failed: %s" % func.__name__,
|
||||
) from e
|
||||
|
||||
|
||||
# ============= BaseHandler =============
|
||||
@@ -662,23 +667,31 @@ class PassorderHandler(BaseHandler):
|
||||
quickTrade = int(data.get('quickTrade', 2))
|
||||
strategy_name = str(data.get('strategyName', '')).strip()
|
||||
order_id = str(data.get('orderId', '')).strip()
|
||||
# QMT stores strategyName in the order remark; preserve the signal key and local order ID.
|
||||
# Put the local ID first so restart reconciliation still works if QMT truncates the remark.
|
||||
remark = '|'.join(part for part in (order_id, strategy_name) if part)[:24]
|
||||
except (json.JSONDecodeError, KeyError, TypeError, ValueError) as e:
|
||||
raise HTTPError(400, reason="Invalid order parameters: %s" % e) from e
|
||||
|
||||
# QMT stores strategyName in the order remark; preserve the signal key and local order ID.
|
||||
# Put the local ID first so restart reconciliation still works if QMT truncates the remark.
|
||||
remark = '|'.join(part for part in (order_id, strategy_name) if part)[:24]
|
||||
try:
|
||||
order_ref = passorder(opType, orderType, self.acc(), stock, pr_type, price, volume, remark, quickTrade, self.ctx())
|
||||
if not order_ref:
|
||||
raise HTTPError(502, "QMT did not return a valid order reference")
|
||||
self.write(json.dumps({
|
||||
"status": "success",
|
||||
"opType": opType,
|
||||
"stock": stock,
|
||||
"strategy_name": strategy_name,
|
||||
"local_order_id": order_id,
|
||||
"order_ref": str(order_ref)
|
||||
}, ensure_ascii=False))
|
||||
except HTTPError:
|
||||
raise
|
||||
except Exception as e:
|
||||
logger.exception("passorder failed")
|
||||
raise HTTPError(400, f"Order submission failed: {str(e)}")
|
||||
raise HTTPError(502, reason="QMT order submission failed") from e
|
||||
|
||||
if not order_ref:
|
||||
raise HTTPError(502, reason="QMT did not return a valid order reference")
|
||||
|
||||
self.write(json.dumps({
|
||||
"status": "success",
|
||||
"opType": opType,
|
||||
"stock": stock,
|
||||
"strategy_name": strategy_name,
|
||||
"local_order_id": order_id,
|
||||
"order_ref": str(order_ref)
|
||||
}, ensure_ascii=False))
|
||||
|
||||
# algo_passorder() - Submit an algorithmic order
|
||||
class AlgoPassorderHandler(BaseHandler):
|
||||
@@ -1428,7 +1441,7 @@ def make_app():
|
||||
(r"/api/trade/debt_contract", DebtContractHandler),
|
||||
(r"/api/trade/assure_contract", AssureContractHandler),
|
||||
(r"/api/trade/enable_short_contract", EnableShortContractHandler),
|
||||
(r"/api/trade/ipo_data", IpoDataHandler),
|
||||
(r"/api/trade/ipo_data", IpoDataHandler),
|
||||
(r"/api/trade/new_purchase_limit", NewPurchaseLimitHandler),
|
||||
|
||||
# Reference functions
|
||||
|
||||
Reference in New Issue
Block a user