3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在使用 QMT 平台的 passorder 函数进行期货实盘交易时,遇到使用对手价(prType=14)无法立刻成交的情况,主要由以下几个原因导致,同时针对上期所的市价单问题,也有相应的替代方案。
虽然您交易的是主力合约(如 zn 沪锌),流动性较好,但“对手价”本质上仍然是限价单(Limit Order)。它的工作机制是:在策略触发下单的瞬间,系统读取当时的盘口对手价(买入取卖一,卖出取买一),并以该价格作为限价发送委托。
无法立刻成交的原因通常包括:
为了在量化交易中确保信号触发后立刻成交,通常不建议直接使用对手价,而是采用以下两种方式:
在 QMT 中,可以使用 prType=12(涨跌停价)。
交易所撮合机制:国内期货交易所的撮合机制是“价格优先、时间优先”。即使您以涨停价买入,交易所也会以当前盘口的最优卖价(卖一、卖二等)依次与您撮合成交,直到您的委托量全部成交。这实际上起到了市价单的作用,且能最大程度保证成交。
# 使用涨跌停价买入开仓 1 手 zn2605.SF
passorder(0, 1101, ContextInfo.accid, 'zn2605.SF', 12, -1, 1, ContextInfo)
如果您不想承担极端极端行情下以涨跌停价成交的风险(虽然极少发生,但在乌龙指或极端秒板行情中存在),可以自己计算超价。
获取最新价或对手价后,手动加上或减去几个最小变动价位(PriceTick),然后以指定价(prType=11)下单。
def handlebar(ContextInfo):
# 获取最新 tick 数据
tick = ContextInfo.get_full_tick(['zn2605.SF'])
if 'zn2605.SF' in tick:
ask1 = tick['zn2605.SF']['askPrice'][0] # 卖一价
price_tick = 5 # 假设锌的最小变动价位是 5
# 买入超价 2 个 tick
order_price = ask1 + price_tick * 2
# 使用指定价下单
passorder(0, 1101, ContextInfo.accid, 'zn2605.SF', 11, order_price, 1, ContextInfo)
您提到 prType 中只看到郑商所有市价最优价,上期所没有。这是因为国内各期货交易所对市价单的支持规则不同:
总结:
由于上期所不支持市价单,量化交易者在交易上期所品种(如 zn, cu, rb, ru 等)时,行业通用的“市价”替代方案就是使用涨跌停价(prType=12)或者超价限价单(prType=11)。建议您将策略中的 prType=14 修改为 prType=12,即可解决实盘中挂单不成交的问题。