问题描述
请问 order_shares 是与 passorder 的哪种下单模式一样, 是快速下单, 还是等 K 线有变化后才下单? 与下面哪种模式一样呢?
解决方案
在 QMT 平台中,order_shares 的下单模式等同于 passorder 函数中 quickTrade=0(默认模式) 的情况。也就是说,它是等当前 K 线完全走完后,在下一根 K 线的第一个 tick 数据到来时才触发下单,而不是立即(快速)下单。
详细区别与机制解析
1. order_shares 的运行机制
order_shares 是 QMT 提供的一个封装好的、更易用的股票指定股数交易函数。它的底层触发机制是标准的 K 线驱动模式:
- 当策略在盘中运行到最后一根 K 线时,每个 tick 都会驱动
handlebar运行并判断条件。 - 只有当这根 K 线走完(即最后一个 tick 确定,K 线闭合)时,产生的信号才是有效信号。
- 实际下单动作会在下一根 K 线的第一个 tick 产生时发出。
2. passorder 的运行机制与 quickTrade 参数
passorder 是 QMT 的综合交易下单底层函数,它提供了一个非常关键的参数:quickTrade(快速交易)。
quickTrade = 0(默认):与order_shares完全一样,等当前 K 线走完,下一根 K 线第一个 tick 触发下单。quickTrade = 1(快速下单):非历史 bar 上执行时(即ContextInfo.is_last_bar() == True),不需要等 K 线走完,只要策略模型中调用到了该函数,就会立即触发下单交易。quickTrade = 2:不判断 bar 状态,只要调用就立即触发(甚至在历史回测 bar 上也会触发,需谨慎使用)。
如何让 order_shares 实现快速下单?
如果你希望使用简单的 order_shares 语法,但又想实现类似 passorder 的立即下单效果,可以通过配合调用 do_order(ContextInfo) 函数来实现。
do_order(ContextInfo) 函数的作用是:实时触发前一根 bar 或当前未走完 bar 产生的信号。调用它后,会把刚刚生成的模型信号立刻发出,且只发一次,从而打破“必须等下一根 K 线第一个 tick”的限制。
示例代码:
def handlebar(ContextInfo):
# 假设满足了某个买入条件
if buy_condition:
# 1. 使用 passorder 快速下单 (quickTrade=1)
# passorder(23, 1101, ContextInfo.accID, '000001.SZ', 5, -1, 100, 'my_strategy', 1, 'remark', ContextInfo)
# 2. 或者使用 order_shares 配合 do_order 实现立即下单
order_shares('000001.SZ', 100, 'LATEST', ContextInfo, ContextInfo.accID)
do_order(ContextInfo) # 立即将 order_shares 的信号发出去
总结
order_shares= 等 K 线走完后下单(同passorder的quickTrade=0)。- 如果需要盘中条件一满足就立即下单,请使用
passorder并设置quickTrade=1,或者在使用order_shares后紧接着调用do_order(ContextInfo)。