Skip to content

QMT 委托回调怎么写

passorder 的返回值只表示「发出去了」,不等于成交。状态变化走主推回调。

用哪个函数

官方就有两套主推,写在策略文件里,客户端自己调用,不用你订阅:

函数什么时候进第二个参数
order_callback账号委托状态变化委托对象
deal_callback账号成交状态变化成交对象

还有 position_callbackaccount_callbackorderError_callback,同样要先绑账号。

先生效条件

  1. init 里调用 ContextInfo.set_account(...)
  2. 只在实盘运行模式生效。回测、研究、编辑器里点运行,常常没有真实委托,回调也不会来。
  3. 策略交易界面里的 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')

strDatatypeORDER / DEAL / POSITION / ACCOUNT。期货 'FUTURE',两融 'CREDIT'。下单时如果传了 strategyName,查询带同一个名字,只拿本策略的委托和成交。

不要把主推和查询混成「QMT 没有回调」。回调是主推;查询是主动拉。

注意

  • 不要用 ContextInfo 存长期状态,盘中逐 K 可能回滚。已成数量、废单计数放模块级变量或普通对象。
  • 账号类型、passorderopType 对照 passorder,不要凭记忆填。
  • 查函数:API 查询 order_callback