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

聚宽 JoinQuant 平台如何使用 StopLimitOrderStyle 停止限价单实现自动止损?

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

问题描述

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

Title: joinquant 止损止盈单实现:StopLimitOrderStyle 使用详解

Question: 如何使用聚宽的停止限价单(StopLimitOrderStyle)给策略添加自动止损功能?

解决方案

聚宽 JoinQuant 平台 StopLimitOrderStyle 停止限价单实现自动止损详解

在量化交易中,止损是控制回撤、保护本金的核心手段。聚宽(JoinQuant)平台提供了强大的**停止单(Stop Order)**功能,允许交易者在标的价格突破特定阈值时自动触发委托。其中,StopLimitOrderStyle(停止限价单)是实现精准止损和止盈的利器。


一、 什么是 StopLimitOrderStyle(停止限价单)?

停止限价单包含两个核心价格参数:

  1. 触发价(stop_price):当市场最新价突破(向上或向下)该价格时,停止单被激活。
  2. 限价(limit_price):停止单被激活后,系统会自动向交易所提交一张指定该价格的限价单(Limit Order)

止损与止盈模式的逻辑规则:

  • 止损模式 (stop_loss)
    • 买入/开多/平空:触发价(stop_price)必须大于最新价。也就是说,当价格向上突破阻力位时触发买入。
    • 卖出/开空/平多:触发价(stop_price)必须小于最新价。也就是说,当价格跌破支撑位时触发卖出止损。
  • 止盈模式 (take_profit)
    • 卖出/开空/平多:触发价(stop_price)必须大于最新价。价格上涨到目标位时触发卖出止盈。
    • 买入/开多/平空:触发价(stop_price)必须小于最新价。价格回调到低位时触发买入。

注意:如果下单时设置的触发价不满足上述方向条件,该停止单会立即触发


二、 StopLimitOrderStyle API 构造函数

在代码中,停止限价单的调用格式如下:

StopLimitOrderStyle(mode, stop_price, limit_price)
  • mode (str): 模式选择,可选 "stop_loss"(止损)或 "take_profit"(止盈)。
  • stop_price (float): 触发价格。
  • limit_price (float): 触发后转为限价单的委托价格。

三、 核心代码示例:为策略添加自动止损

以下是一个完整的 JoinQuant 策略示例。该策略在买入平安银行(000001.XSHE)的同时,立即挂出一单停止限价单作为多头持仓的保护性止损。

import jqdata

def initialize(context):
    # 设定沪深300作为基准
    set_benchmark('000300.XSHG')
    # 强烈建议开启动态复权模式(真实价格)
    set_option('use_real_price', True)
    
    g.security = '000001.XSHE'
    
    # 每天 09:30 运行
    run_daily(market_open, time='09:30')

def market_open(context):
    security = g.security
    current_data = get_current_data()
    
    # 1. 如果当前无持仓,则以市价单买入 1000 股
    if security not in context.portfolio.positions:
        log.info("当前无持仓,买入 %s" % security)
        order_obj = order(security, 1000)
        
        if order_obj is not None:
            # 获取买入成交均价(若未立即成交,则用当前最新价估算)
            entry_price = order_obj.price if order_obj.price > 0 else current_data[security].last_price
            
            # 2. 设定止损线:当价格跌破买入价的 5% 时触发止损
            stop_price = entry_price * 0.95
            # 触发后,以买入价的 5.5% 价格(限价)挂单卖出,确保优先成交
            limit_price = entry_price * 0.945
            
            log.info("成功买入,开始挂止损单。触发价: %s, 限价: %s" % (stop_price, limit_price))
            
            # 3. 提交停止限价单进行止损(平多仓,数量为 -1000)
            order(security, -1000, style=StopLimitOrderStyle(mode="stop_loss", stop_price=stop_price, limit_price=limit_price))
            
    else:
        # 如果已有持仓,检查是否有未完成的停止单
        open_orders = get_open_orders()
        log.info("当前已有持仓,挂单中订单数量: %d" % len(open_orders))

四、 停止限价单的重要注意事项

  1. 不锁定资金与持仓:停止单在未触发前,不会提前锁定您的账户资金或持仓份额。这意味着,如果在停止单触发时,您的可用资金不足或可卖出持仓不足,该委托将直接宣告失败
  2. 订单生命周期:停止单仅在标的交易时间内生效。当天未触发的停止单将在收盘后(盘后)被系统自动撤销。如果需要长期止损,需在每日开盘后重新挂单。
  3. 按价值下单时的数量换算:若在 order_valueorder_target_value 中使用 StopLimitOrderStyle,系统会以 limit_price(限价)来计算实际委托的股数:
    $$\text{实际委托数量} = \frac{\text{value}}{\text{limit_price} \times \text{保证金率} \times \text{合约乘数}}$$