🚀 AI 一键生成 joinquant 策略代码
立即体验

joinquant 订单撮合机制详解:MarketOrderStyle 与 LimitOrderStyle 的触发条件与区别

joinquant | 发布时间: 2026/7/24
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 订单撮合机制:MarketOrderStyle 与 LimitOrderStyle 的触发条件

Question: 请解析 joinquant 中市价单和限价单的撮合逻辑与区别

解决方案

JoinQuant 订单撮合机制详解:MarketOrderStyle 与 LimitOrderStyle

在 JoinQuant(聚宽)量化平台中,理解订单撮合机制是构建精确回测与模拟交易的关键。平台通过 MarketOrderStyle(市价单)和 LimitOrderStyle(限价单)提供不同类型的下单指令,其撮合规则因运行频率和撮合模式(盘口撮合/Bar撮合)的不同而存在差异。


一、下单方式与定义

1. 市价单 (MarketOrderStyle)

  • 定义:不指定具体价格,以当前市场最优价格尝试立即成交。
  • 代码写法order(security, amount, style=MarketOrderStyle()) 或默认不传 style 参数。
  • 科创板特别逻辑:科创板市价单需设置保护价,如 MarketOrderStyle(limit_price)。买入时成交价不得高于保护价,卖出时不得低于保护价,超出部分撤单。

2. 限价单 (LimitOrderStyle)

  • 定义:指定目标价格 limit_price,只有当市场价格达到或优于指定价格时才触发成交。
  • 代码写法order(security, amount, style=LimitOrderStyle(10.0))

二、撮合逻辑与触发条件

订单处理过程遵循:订单创建 -> 订单检查 -> 报单 -> 确认委托 -> 撮合

1. 未启用盘口撮合(回测及默认模式)

在未启用盘口撮合时,系统根据“最新价 + 滑点”及 Bar/Tick 信息进行撮合:

委托类型 运行频率 首次撮合逻辑 挂单后续撮合逻辑 成交价格
市价单 天 / 分钟 / Tick 当“最新价+滑点”在涨跌停范围内时尝试撮合。若触及涨跌停(如涨停买/跌停卖),则直接撤单。 剩余未成交部分直接撤单,不进行挂单。 最新价 + 滑点(开盘时刻运行为开盘价,其他为上一Bar/Tick价格)
限价单 天 / 分钟 下单时尝试按最新价+滑点撮合。若涨跌停无法成交,则挂单等待。 按分钟 Bar 撮合:每分钟Bar结束时尝试撮合。
• 买入:委托价 > Bar最低价
• 卖出:委托价 < Bar最高价
首次成交按“最新价+滑点”;挂单撮合成功按委托价成交
限价单 Tick 下单时尝试按最新价+滑点撮合。 按 Tick 撮合:每个Tick结束时尝试撮合。
• 买入:委托价 > Tick最新价
• 卖出:委托价 < Tick最新价
挂单撮合成功按委托价成交

2. 启用盘口撮合(仅模拟盘可选)

通过 set_option('match_with_order_book', True) 开启:

  • 撮合依据:根据对手盘盘口(买一/卖一等)深度和价格算加权均价。优先从一档开始撮合。
  • 市价单未完全成交:剩余部分全部按最高一档盘口撮合。
  • 限价单未完全成交:剩余部分按委托价挂单,后续按 Bar 或 Tick 逻辑继续撮合。

三、成交量限制与挂单撤单规则

  1. 成交量限制 (order_volume_ratio)
    • 回测模式:单笔订单成交量不超过当日/当前Bar总成交量 $\times$ order_volume_ratio(默认1.0,可通过 set_option('order_volume_ratio', 0.25) 自定义)。
    • 模拟交易:全额成交或受实际盘口成交量限制。
  2. 未完成订单撤销:所有未完成的限价单挂单均会在每个交易日收盘后(17:00前)由系统自动撤销。

四、市价单与限价单的核心区别对比

特性 市价单 (MarketOrderStyle) 限价单 (LimitOrderStyle)
价格确定性 不确定(受滑点和市场波动影响) 确定(成交价优于或等于指定限价)
成交优先度 高,下单即尝试撮合 依赖市场价格是否达到触发条件
挂单机制 不挂单,未成交部分立即撤单 未完全成交部分自动挂单,直至收盘撤单
涨跌停限制 涨停买单、跌停卖单会被直接拒绝/撤单 允许挂单等待解封后撮合
适用场景 追求快速入场/出场,对流动性要求高的策略 对成本敏感、追求精确建仓价格的策略

五、代码示例

import jqdata

def initialize(context):
    set_benchmark('000300.XSHG')
    set_option('use_real_price', True)
    # 设定成交量上限比例为25%
    set_option('order_volume_ratio', 0.25)

def handle_data(context, data):
    security = '000001.XSHE'
    current_price = data[security].close
    
    # 1. 市价单:以当前市场价快速买入 1000 股
    order(security, 1000, style=MarketOrderStyle())
    
    # 2. 限价单:当价格低于当前价 1% 时低吸挂单 1000 股
    target_price = current_price * 0.99
    order(security, 1000, style=LimitOrderStyle(target_price))
    
    # 3. 科创板市价单:必须设置保护价
    # order('688001.XSHG', 200, style=MarketOrderStyle(limit_price=current_price * 1.02))