QMT 委托回调怎么写
passorder 的返回值只表示「发出去了」,不等于成交。状态变化走主推回调。
用哪个函数
官方就有两套主推,写在策略文件里,客户端自己调用,不用你订阅:
| 函数 | 什么时候进 | 第二个参数 |
|---|---|---|
order_callback | 账号委托状态变化 | 委托对象 |
deal_callback | 账号成交状态变化 | 成交对象 |
还有 position_callback、account_callback、orderError_callback,同样要先绑账号。
先生效条件
- 在
init里调用ContextInfo.set_account(...)。 - 只在实盘运行模式生效。回测、研究、编辑器里点运行,常常没有真实委托,回调也不会来。
- 策略交易界面里的
account由客户端注入;编辑器里要自己填资金账号。
最小写法
python
#coding:gbk
def init(C):
C.set_account(account) # 交易界面会注入 account;编辑器里改成你的资金账号
def handlebar(C):
pass
def order_callback(C, orderInfo):
print('order', getattr(orderInfo, 'm_strInstrumentID', ''),
getattr(orderInfo, 'm_nOrderStatus', ''),
getattr(orderInfo, 'm_nVolumeTraded', 0),
getattr(orderInfo, 'm_strOrderSysID', '') or getattr(orderInfo, 'm_strOrderID', ''))
def deal_callback(C, dealInfo):
print('deal', getattr(dealInfo, 'm_strInstrumentID', ''),
getattr(dealInfo, 'm_nVolume', 0),
getattr(dealInfo, 'm_dPrice', 0),
getattr(dealInfo, 'm_strOrderSysID', ''))字段是 m_ 前缀。版本不同名字可能略差,先 dir(orderInfo) 再取。完整属性见手册 委托、成交。
passorder 如果传了 userOrderId,对应对象里的 m_strRemark,回调和查询都能对上这一笔。
主动查询是另一条路
主推没来、要对当日全账,再用 get_trade_detail_data:
python
orders = get_trade_detail_data(account, 'STOCK', 'ORDER')
deals = get_trade_detail_data(account, 'STOCK', 'DEAL')strDatatype:ORDER / DEAL / POSITION / ACCOUNT。期货 'FUTURE',两融 'CREDIT'。下单时如果传了 strategyName,查询带同一个名字,只拿本策略的委托和成交。
不要把主推和查询混成「QMT 没有回调」。回调是主推;查询是主动拉。
注意
- 不要用
ContextInfo存长期状态,盘中逐 K 可能回滚。已成数量、废单计数放模块级变量或普通对象。 - 账号类型、
passorder的opType对照 passorder,不要凭记忆填。 - 查函数:API 查询 order_callback
