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

joinquant 平台如何使用 StopMarketOrderStyle 和 StopLimitOrderStyle 提交自动止损止盈委托?

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

问题描述

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

Title: joinquant 条件单指南:停止损失单与止盈单的下单机制

Question: 如何使用 StopMarketOrderStyle 和 StopLimitOrderStyle 提交自动止损止盈委托?

解决方案

joinquant 条件单指南:停止损失单与止盈单的下单机制

在量化交易中,及时止损和止盈是控制风险、锁定利润的关键手段。joinquant(聚宽)平台提供了**停止单(Stop Order)**功能,允许交易者在标的价格突破特定阈值时,自动将委托转化为市价单或限价单。本文将详细介绍如何使用 StopMarketOrderStyleStopLimitOrderStyle 提交自动止损止盈委托。


一、 停止单(Stop Order)基本概念

停止单在下单时不会提前锁定持仓和资金。只有当市场价格突破(向上或向下)您设定的触发价(stop_price)时,该订单才会被激活并转化为普通的市价单或限价单进行撮合。如果触发时账户资金或可交易持仓不足,委托将会失败。

1. 止损模式与止盈模式的触发规则

在提交停止单时,需要指定模式参数 mode,可选值为 "stop_loss"(止损)或 "take_profit"(止盈)。其触发逻辑如下:

  • 止损模式 ("stop_loss")
    • 买入/开多/平空:触发价 stop_price 必须大于最新价(向上突破买入)。
    • 卖出/开空/平多:触发价 stop_price 必须小于最新价(向下突破卖出)。
  • 止盈模式 ("take_profit")
    • 买入/开多/平空:触发价 stop_price 必须小于最新价。
    • 卖出/开空/平多:触发价 stop_price 必须大于最新价。

注意:如果下单时,设定的触发价不满足上述关系,该停止单会立即触发转化为普通订单。


二、 API 构造函数与参数说明

1. 停止市价单 (Stop Market Order)

当价格突破触发价时,自动转为市价单

StopMarketOrderStyle(mode, stop_price)
  • mode: 字符串,"stop_loss"(止损)或 "take_profit"(止盈)。
  • stop_price: 浮点数,触发价格。

2. 停止限价单 (Stop Limit Order)

当价格突破触发价时,自动转为指定价格的限价单

StopLimitOrderStyle(mode, stop_price, limit_price)
  • mode: 同上。
  • stop_price: 同上。
  • limit_price: 浮点数,触发后转为限价单的委托价格。

三、 核心交易函数调用示例

停止单需要作为 style 参数传入 orderorder_targetorder_valueorder_target_value 函数中。

示例 1:股票多头止损(卖出)

假设当前持有 000001.XSHE(平安银行),现价为 12.0 元,计划在跌破 11.0 元时进行止损卖出(转为市价单):

# 跌破 11.0 元时,市价卖出所有持仓
order_target('000001.XSHE', 0, style=StopMarketOrderStyle('stop_loss', 11.0))

示例 2:期货开仓追涨(限价买入)

假设某期货合约当前价格为 3500 元,计划在价格向上突破 3550 元时,以 3555 元的限价单开仓做多:

# 向上突破 3550 时,以 3555 元限价开多仓 1 手
order('RB2405.XSGE', 1, style=StopLimitOrderStyle('stop_loss', 3550.0, 3555.0), side='long')

四、 完整策略源码示例

以下是一个简单的双均线策略,在买入股票后,立即挂出一条停止市价单作为移动止损保护。

import jqdata

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

def market_open(context):
    security = g.security
    close_data = attribute_history(security, 5, '1d', ['close'])
    MA5 = close_data['close'].mean()
    current_price = close_data['close'][-1]
    cash = context.portfolio.available_cash

    # 1. 买入信号:当前价格高于5日均价
    if current_price > MA5 and context.portfolio.positions[security].closeable_amount == 0:
        # 全仓买入
        order_value(security, cash)
        log.info("买入 %s" % (security))
        
        # 2. 挂止损单:买入后立即设置一个低于买入价 5% 的停止损失单
        stop_loss_price = current_price * 0.95
        # 当价格跌破 stop_loss_price 时,自动市价清仓
        order_target(security, 0, style=StopMarketOrderStyle('stop_loss', stop_loss_price))
        log.info("已为 %s 挂出止损单,触发价: %s" % (security, stop_loss_price))
        
    # 3. 正常卖出信号:当前价格低于5日均价
    elif current_price < MA5 and context.portfolio.positions[security].closeable_amount > 0:
        # 卖出所有股票,这会自动取消之前针对该标的未完成的停止单
        order_target(security, 0)
        log.info("均线死叉,主动卖出 %s" % (security))

五、 停止单使用注意事项

  1. 不锁定资金与持仓:停止单在未触发前不会冻结您的可用资金或持仓。因此,请避免在挂单期间将资金挪作他用,否则触发时可能因资金不足导致委托失败。
  2. 自动撤单机制:停止单的有效期仅限于当天交易时间。每个交易日结束(收盘)后,所有未触发的停止单都将被系统自动撤销。
  3. 覆盖效应:使用 order_targetorder_target_value 提交新订单时,如果该标的存在未完成的订单(包括未触发的停止单),先前未完成的订单将会被系统自动取消。