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

PTrade order_market 函数:对手方最优、本方最优等市价单类型的区别与实战应用

ptrade | 发布时间: 2025/12/17
以下内容由 EasyQuant 生成。

问题描述

使用市价单时,如何选择最优的委托类型来保证成交速度和成交价格?

解决方案

在PTrade中,选择最优的市价委托类型(market_type)需要根据交易所规则(沪市 vs 深市)以及你对成交速度成交价格的偏好来决定。

由于沪深两市支持的市价单类型不同,没有一种单一的类型可以通用于所有股票。以下是基于PTrade API文档的详细分析和策略建议。

核心结论:如何选择

  1. 上海证券交易所(沪市主板/科创板)

    • 最优选择:market_type=1 (最优五档即时成交剩余转限价)
    • 理由: 这是平衡速度与价格的最佳选择。它会立即吃掉对手盘最优的5档流动性(保证速度),如果还有未成交部分,会自动转为限价单挂在最后一档成交价上(保证剩余部分不撤单,且价格合理)。
  2. 深圳证券交易所(深市主板/创业板)

    • 注意: 深市不支持类型1。
    • 速度优先:market_type=4 (最优五档即时成交剩余撤销)
      • 理由: 立即吃掉5档流动性。未成交部分自动撤单。适合急于成交且不在乎部分撤单的场景。
    • 价格优先/保证成交:market_type=0 (对手方最优价格)
      • 理由: 以对手方(卖一或买一)的价格挂单。如果对手盘量不够,剩余部分会挂在那个价格等待。这实际上更像是一个“跟随行情的限价单”,速度不如类型4,但不会被撤单。

策略代码实现

以下代码展示了如何封装一个智能下单函数,根据股票代码自动判断市场,并选择该市场下“兼顾速度与成交率”的最优市价单类型。

def initialize(context):
    # 设置股票池:包含沪市主板、科创板、深市主板
    g.security = ['600570.SS', '688001.SS', '000001.SZ']
    set_universe(g.security)

def handle_data(context, data):
    # 示例:对股票池中每只股票买入100股
    for stock in g.security:
        smart_market_order(context, stock, 100)

def smart_market_order(context, stock_code, amount):
    """
    智能市价单函数
    根据标的所属市场,选择最优的市价委托类型
    """
    # 获取股票后缀以判断市场
    suffix = stock_code.split('.')[-1]
    
    # 默认市价单类型
    # 0: 对手方最优 (深市保成交)
    # 1: 最优五档转限价 (沪市最优解)
    # 4: 最优五档即时成交剩余撤销 (深市抢速度)
    target_market_type = 0 
    
    # 1. 判断市场并选择类型
    if suffix == 'SS' or suffix == 'XSHG':
        # 上海市场 (主板支持1,4; 科创板支持0,1,2,4)
        # 选择 1: 最优五档即时成交剩余转限价
        # 优点: 吃掉5档流动性,剩余部分转为限价单排队,不会被撤销
        target_market_type = 1
        
    elif suffix == 'SZ' or suffix == 'XSHE':
        # 深圳市场 (支持0,2,3,4,5,不支持1)
        # 权衡选择:
        # 如果追求极致速度且接受部分撤单,选 4 (最优五档即时成交剩余撤销)
        # 如果追求必须成交且接受稍慢,选 0 (对手方最优价格)
        # 这里为了保证策略逻辑连贯(不希望订单被撤),我们演示使用 0
        # 如果你的策略是高频抢单,请改为 4
        target_market_type = 0
    
    else:
        log.warning("未知市场标的: %s,跳过下单" % stock_code)
        return

    # 2. 处理科创板/创业板的保护限价 (limit_price)
    # PTrade文档指出:科创板市价委托必须设置保护限价,否则可能失败
    # 这里简单演示:买入保护价为最新价的105%,卖出为95%
    current_price = get_snapshot(stock_code)[stock_code]['last_px']
    protect_price = 0.0
    
    if amount > 0: # 买入
        protect_price = current_price * 1.05
    else: # 卖出
        protect_price = current_price * 0.95
        
    # 3. 下单
    # 注意:order_market 是交易专用函数,回测中也可以使用,但逻辑会有所模拟
    # 只有科创板/创业板部分券商强制要求limit_price,普通A股可不传或传0
    # 为兼容性,建议对所有市价单计算一个较宽的保护价
    
    log.info("对 %s 下市价单, 数量: %d, 类型: %d" % (stock_code, amount, target_market_type))
    
    order_market(stock_code, amount, market_type=target_market_type, limit_price=protect_price)

详细参数解析

根据PTrade API文档,order_marketmarket_type 参数详解如下:

类型值 名称 含义 适用场景 支持市场
0 对手方最优价格 以对手方(如卖一)价格申报。 稳健型。不吃单,价格好,但大单成交慢。 科创板, 深市
1 最优五档...转限价 吃掉5档,剩下的变成限价单挂着。 推荐(沪市)。兼顾速度和成交率,不会撤单。 沪市(主板/科创)
2 本方最优价格 以自己方(如买一)价格申报。 极慢。相当于挂一个被动限价单,等待别人来吃。 科创板, 深市
3 即时成交剩余撤销 吃掉对手盘,吃不完的立即撤销。 极速。类似FOK/IOC,适合高频。 深市
4 最优五档...剩余撤销 吃掉5档,剩下的立即撤销。 推荐(深市抢单)。防止深价格滑点过大。 沪市, 深市
5 全额成交或撤单 要么全成,要么全撤。 特殊需求。适合套利,防止单腿成交。 深市

常见问题 (Q&A)

Q1: 为什么我在回测中使用 order_market 感觉和 order 没区别?
A: 在回测模式下,撮合机制是模拟的。PTrade的回测引擎通常会假设市价单以当前分钟/Tick的收盘价或开盘价成交。market_type 的细微差别(如五档撮合、转限价逻辑)主要在实盘交易中由交易所柜台执行时才会体现出显著差异。

Q2: 科创板和创业板下单失败提示“无效的价格”是怎么回事?
A: 根据交易所规定,科创板和创业板在使用市价委托时,必须指定保护限价(limit_price)。虽然是市价单,但你必须告诉交易所你能接受的最差价格(买入的上限或卖出的下限),以防止价格瞬间剧烈波动导致巨额亏损。

Q3: 如果我用 market_type=4 (剩余撤销),如何知道订单是否完全成交?
A: 你需要在下单后监听 on_order_response (委托主推) 或查询 get_orders()。如果状态变为 6 (已撤) 或 5 (部撤),说明流动性不足,未成交部分被撤销了。此时你的策略逻辑可能需要决定是否追单。

Q4: 为什么深市没有 market_type=1
A: 这是交易所规则决定的。深圳证券交易所的交易系统不支持“转限价”这种指令,只支持“剩余撤销”或“对手方最优”。因此在深市交易时,必须在“保成交(Type 0)”和“抢速度(Type 4)”之间做选择。