3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化交易中,及时止损是控制风险和保护本金的核心手段。JoinQuant(聚宽)平台提供了停止单(Stop Order)功能,其中 StopMarketOrderStyle 用于在标的价格突破设定阈值时,自动触发并转换为市价单进行委托。
StopMarketOrderStyle 是 OrderStyle 的子类,通过在下单函数(如 order、order_target、order_value、order_target_value)中指定 style 参数来使用。
StopMarketOrderStyle(mode, stop_price)
mode (str):
'stop_loss':止损模式。'take_profit':止盈模式。stop_price (float): 触发价格。当市场价格突破该价格时,停止单被激活并转为市价单委托。stop_loss) 与 止盈模式 (take_profit) 判定stop_loss):stop_price 必须小于最新价。当现价跌破 stop_price 时触发卖出。take_profit):stop_price 必须大于最新价。当现价涨破 stop_price 时触发卖出。stop_loss):stop_price 必须大于最新价。当现价突破 stop_price 时触发买入。take_profit):stop_price 必须小于最新价。stop_price 不满足上述触发条件,该停止单会立即触发。order_value 或 order_target_value 配合停止单时,实际委托数量根据 stop_price 计算:以下是一个完整的 JoinQuant 策略,演示如何在持仓后使用 StopMarketOrderStyle 设置市价止损单:
# 导入聚宽函数库
import jqdata
from jqdata import StopMarketOrderStyle
def initialize(context):
# 设定标的为平安银行
g.security = '000001.XSHE'
# 设定基准
set_benchmark('000300.XSHG')
# 开启真实价格模式
set_option('use_real_price', True)
# 设定止损比例为 5%
g.stop_loss_pct = 0.05
# 每日定时运行
run_daily(trade, time='9:30')
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]
cash = context.portfolio.available_cash
# 买入信号:当当前价格高于5日均线1%且无持仓时全仓买入
if current_price > 1.01 * ma5 and position.total_amount == 0:
log.info("价格高于均线1%%,执行买入: %s" % security)
order_value(security, cash)
# 计算止损价(买入价下方5%)
stop_price = current_price * (1 - g.stop_loss_pct)
# 下达市价止损单:当价格跌破 stop_price 时,清仓卖出
order_target(
security,
0,
style=StopMarketOrderStyle('stop_loss', stop_price)
)
log.info("已挂出市价止损单,触发价: %.2f" % stop_price)
# 卖出信号:当价格低于5日均线时主动平仓
elif current_price < ma5 and position.closeable_amount > 0:
log.info("价格低于均线,主动卖出平仓: %s" % security)
order_target(security, 0)
StopMarketOrderStyle 和 StopLimitOrderStyle 有什么区别?
StopMarketOrderStyle 在触发后转换为市价单(Market Order),确保快速成交;StopLimitOrderStyle 在触发后转换为限价单(Limit Order),需额外指定 limit_price,能控制成交价格但存在无法成交的风险。停止单可以跨日生效吗?
before_trading_start 或 run_daily)重新计算并挂出停止单。为何我的停止单下单后立刻成交了?
mode 和 stop_price 的逻辑关系。例如,在卖出止损(stop_loss)时,如果设定的 stop_price 高于当前市场价格,系统判断条件已满足,会立即触发委托。