问题描述
根据文档对期货主力品种比如“zn2605.SF”,使用 passorder 函数进行下单,prType=14 对手价,实盘的时候居然无法立刻成交,而是在委托里等待成交,并且这种现象也比较普遍,请教下,对手价不是应该立刻成交的吗(主力合约又不是冷门品种),另外 prType 只看到郑商所有市价最优价,其他上期所没有这个选项吗。。。【市价最优价[郑商所][期货] 】
解决方案
在使用 QMT 平台的 passorder 函数进行期货实盘交易时,遇到使用对手价(prType=14)无法立刻成交的情况,主要由以下几个原因导致,同时针对上期所的市价单问题,也有相应的替代方案。
一、 为什么对手价(prType=14)无法立刻成交?
虽然您交易的是主力合约(如 zn 沪锌),流动性较好,但“对手价”本质上仍然是限价单(Limit Order)。它的工作机制是:在策略触发下单的瞬间,系统读取当时的盘口对手价(买入取卖一,卖出取买一),并以该价格作为限价发送委托。
无法立刻成交的原因通常包括:
- 行情波动微秒级延迟:从策略发出信号、获取盘口价格,到委托到达交易所撮合主机,存在网络和系统延迟。在这几毫秒到几十毫秒内,如果行情剧烈波动,原本的卖一价可能已经被其他单子吃掉,价格上移。您的委托到达时,就变成了挂在买一或买二的限价单,需要等待价格回落才能成交。
- 对手盘挂单量不足:如果您的下单量大于当时盘口对手价的挂单量,部分成交后,剩余的部分就会挂在盘口等待成交。
二、 如何确保立刻成交?(替代方案)
为了在量化交易中确保信号触发后立刻成交,通常不建议直接使用对手价,而是采用以下两种方式:
1. 使用涨跌停价(推荐,最接近市价必成)
在 QMT 中,可以使用 prType=12(涨跌停价)。
- 买入时:以当天的涨停价报单。
- 卖出时:以当天的跌停价报单。
交易所撮合机制:国内期货交易所的撮合机制是“价格优先、时间优先”。即使您以涨停价买入,交易所也会以当前盘口的最优卖价(卖一、卖二等)依次与您撮合成交,直到您的委托量全部成交。这实际上起到了市价单的作用,且能最大程度保证成交。
# 使用涨跌停价买入开仓 1 手 zn2605.SF
passorder(0, 1101, ContextInfo.accid, 'zn2605.SF', 12, -1, 1, ContextInfo)
2. 使用超价委托(指定价 + 滑点)
如果您不想承担极端极端行情下以涨跌停价成交的风险(虽然极少发生,但在乌龙指或极端秒板行情中存在),可以自己计算超价。
获取最新价或对手价后,手动加上或减去几个最小变动价位(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 中只看到郑商所有市价最优价,上期所没有。这是因为国内各期货交易所对市价单的支持规则不同:
- 上期所(SHFE)/ 能源中心(INE):原生不支持市价单(Market Order)。所有发往上期所的委托必须是限价单。因此,在 QMT 或任何交易软件中,上期所都没有真正的“市价”选项。
- 中金所(CFFEX)/ 大商所(DCE)/ 郑商所(CZCE):支持市价单或最优价单。
总结:
由于上期所不支持市价单,量化交易者在交易上期所品种(如 zn, cu, rb, ru 等)时,行业通用的“市价”替代方案就是使用涨跌停价(prType=12)或者超价限价单(prType=11)。建议您将策略中的 prType=14 修改为 prType=12,即可解决实盘中挂单不成交的问题。