问题描述
按天执行order函数,看上去并不是挂单成交,当有T字板的时候,并没成交
def initialize(context):
run_daily(period,time='every_bar')
g.security = '000620.XSHE'
def period(context):
order(g.security, 100)
解决方案
在 JoinQuant (聚宽) 平台中,order 函数默认下的是市价单 (MarketOrder)。您遇到的“T字板(涨停)没有成交”的现象,正是由市价单在回测引擎中的撮合逻辑决定的。
1. order 函数的默认撮合逻辑
根据 JoinQuant 的 API 文档,在未启用盘口撮合(回测默认情况)时,市价单的撮合逻辑如下:
- 成交价格:最新价 + 滑点。
- 涨跌停处理:若标的“最新价+滑点”不低于涨停或者不高于跌停时,跌停时市价卖单会被撤销,涨停时市价买单会被撤销。
2. 为什么 T字板 没有成交?
当股票出现 T字板(通常指开盘即涨停,盘中可能打开但收盘仍涨停,或者全天封死涨停)时,价格处于涨停价。
您代码中的 order(g.security, 100) 是一个市价买单。当引擎尝试撮合时,发现当前价格已经涨停,根据上述规则,市价买单会被直接撤销,而不会像真实交易软件中那样挂单排队。因此,您看到的结果是没有成交。
3. 解决方案:使用限价单 (LimitOrder)
如果您希望在涨停板或跌停板时,订单能够挂单排队等待成交(例如 T字板盘中打开时成交),您必须使用限价单。
对于限价单,JoinQuant 的逻辑是:下单时尝试按最新价+滑点撮合,剩余部分会挂单,每分钟尝试按分钟 Bar 撮合(天/分钟频率下)。
您可以将代码修改为使用 LimitOrderStyle,并将限价设置为涨停价(或您期望的价格):
from jqdata import *
def initialize(context):
run_daily(period, time='every_bar')
g.security = '000620.XSHE'
def period(context):
# 获取当前数据,拿到涨停价
current_data = get_current_data()
high_limit = current_data[g.security].high_limit
# 使用限价单下单,价格设置为涨停价
order(g.security, 100, style=LimitOrderStyle(high_limit))
总结:
order()默认是市价单。- 回测中,市价单遇到涨停买入或跌停卖出,会直接撤单,不排队。
- 想要排队挂单,请显式指定
style=LimitOrderStyle(price)。