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

joinquant 条件单指南:使用 StopMarketOrderStyle 实现自动止损止盈

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

问题描述

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

Title: joinquant 条件单指南:使用 StopMarketOrderStyle 实现自动止损止盈

Question: 如何在 joinquant 策略中使用停止单(Stop Order)设置自动止损和止盈?

解决方案

joinquant 条件单指南:使用 StopMarketOrderStyle 实现自动止损止盈

在量化交易中,有效的风控机制是策略稳健运行的核心。聚宽(JoinQuant)平台提供了停止单(Stop Order)功能,可以通过 StopMarketOrderStyle(市价停止单)和 StopLimitOrderStyle(限价停止单)轻松实现自动止损与止盈。


一、停止单 API 介绍

停止单会在标的价格突破预设的触发价(stop_price)时,自动转化为市价单或限价单进行委托。

1. 市价停止单:StopMarketOrderStyle

StopMarketOrderStyle(mode, stop_price)
  • mode: 指定模式,取值为 'stop_loss'(止损)或 'take_profit'(止盈)。
  • stop_price: 触发价格。当最新价达到或突破该价格时,触发市价单。

2. 限价停止单:StopLimitOrderStyle

StopLimitOrderStyle(mode, stop_price, limit_price)
  • limit_price: 触发后委托的限定价格。

3. 止损与止盈模式规则

  • 止损模式(stop_loss
    • 卖出/平多/做空:触发价 stop_price小于当前最新价。
    • 买入/平空/做多:触发价 stop_price大于当前最新价。
  • 止盈模式(take_profit
    • 卖出/平多/做空:触发价 stop_price大于当前最新价。
    • 买入/平空/做多:触发价 stop_price小于当前最新价。

注意:如果触发价不满足上述条件,停止单将会被立即触发。此外,当日未成交的停止单将在收盘后被自动撤销,且停止单不会提前冻结资金或持仓。


二、代码示例:带有自动止损止盈的均线策略

以下策略展示了如何在买入股票后,通过 order_targetStopMarketOrderStyle 为持仓挂出自动止损和止盈订单。

# 导入聚宽函数库
import jqdata

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

def trade(context):
    security = g.security
    # 获取过去5天收盘价及当前价格
    close_data = attribute_history(security, 5, '1d', ['close'])
    ma5 = close_data['close'].mean()
    current_price = close_data['close'][-1]
    
    position = context.portfolio.positions[security]
    
    # 1. 买入逻辑:突破均线且无持仓时全仓买入
    if current_price > 1.01 * ma5 and position.closeable_amount == 0:
        cash = context.portfolio.available_cash
        order_value(security, cash)
        log.info("买入标的 %s,买入价: %.2f" % (security, current_price))
        
        # 设置 5% 的止损价与 10% 的止盈价
        stop_loss_price = current_price * 0.95
        take_profit_price = current_price * 1.10
        
        # 挂止损单(当价格跌破 stop_loss_price 时卖出平仓)
        order_target(security, 0, style=StopMarketOrderStyle('stop_loss', stop_loss_price))
        log.info("设置止损单,触发价: %.2f" % stop_loss_price)
        
        # 挂止盈单(当价格涨破 take_profit_price 时卖出平仓)
        order_target(security, 0, style=StopMarketOrderStyle('take_profit', take_profit_price))
        log.info("设置止盈单,触发价: %.2f" % take_profit_price)
        
    # 2. 正常卖出逻辑:低于均线时清仓
    elif current_price < ma5 and position.closeable_amount > 0:
        order_target(security, 0)
        log.info("信号卖出 %s" % security)

三、常见注意事项

  1. 资金与持仓占用:停止单挂单时不会锁定持仓和资金,当触发时如果账户可用资金或可平持仓不足,会导致委托失败。
  2. 跨日失效:每天收盘后所有未完成的订单(包括未触发的条件单)都会被引擎撤销。如果需要跨日止损,请在 before_trading_start 或每日策略运行开头重新挂单。
  3. 挂单冲突:对同一标的重复调用 order_target 挂止损和止盈单时,请注意控制好仓位分配,避免重复下撤单导致订单异常。