3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,及时止损和止盈是控制风险、锁定利润的关键手段。joinquant(聚宽)平台提供了**停止单(Stop Order)**功能,允许交易者在标的价格突破特定阈值时,自动将委托转化为市价单或限价单。本文将详细介绍如何使用 StopMarketOrderStyle 和 StopLimitOrderStyle 提交自动止损止盈委托。
停止单在下单时不会提前锁定持仓和资金。只有当市场价格突破(向上或向下)您设定的触发价(stop_price)时,该订单才会被激活并转化为普通的市价单或限价单进行撮合。如果触发时账户资金或可交易持仓不足,委托将会失败。
在提交停止单时,需要指定模式参数 mode,可选值为 "stop_loss"(止损)或 "take_profit"(止盈)。其触发逻辑如下:
"stop_loss"):
stop_price 必须大于最新价(向上突破买入)。stop_price 必须小于最新价(向下突破卖出)。"take_profit"):
stop_price 必须小于最新价。stop_price 必须大于最新价。注意:如果下单时,设定的触发价不满足上述关系,该停止单会立即触发转化为普通订单。
当价格突破触发价时,自动转为市价单。
StopMarketOrderStyle(mode, stop_price)
mode: 字符串,"stop_loss"(止损)或 "take_profit"(止盈)。stop_price: 浮点数,触发价格。当价格突破触发价时,自动转为指定价格的限价单。
StopLimitOrderStyle(mode, stop_price, limit_price)
mode: 同上。stop_price: 同上。limit_price: 浮点数,触发后转为限价单的委托价格。停止单需要作为 style 参数传入 order、order_target、order_value 或 order_target_value 函数中。
假设当前持有 000001.XSHE(平安银行),现价为 12.0 元,计划在跌破 11.0 元时进行止损卖出(转为市价单):
# 跌破 11.0 元时,市价卖出所有持仓
order_target('000001.XSHE', 0, style=StopMarketOrderStyle('stop_loss', 11.0))
假设某期货合约当前价格为 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))
order_target 或 order_target_value 提交新订单时,如果该标的存在未完成的订单(包括未触发的停止单),先前未完成的订单将会被系统自动取消。