问题描述
解决方案
在 JoinQuant(聚宽)平台中,下单函数(如 order, order_target, order_value 等)除了指定标的代码(security)和数量(amount)/价值(value)外,还可以通过 style、side 和 close_today 等参数来控制交易的具体行为,例如订单类型(市价/限价/止损)、多空方向以及期货的平仓顺序。
以下是详细的控制方式说明:
1. 控制订单类型 (style 参数)
通过 style 参数,您可以指定订单是市价单、限价单还是止损单。如果 style 为 None,则默认为市价单(MarketOrder)。
A. 市价单 (MarketOrderStyle)
不指定价格,以当前市场价格成交。
- 普通用法:
MarketOrderStyle() - 科创板保护价:对于科创板标的,必须指定保护价。
- 买入时:成交价不高于保护价。
- 卖出时:成交价不低于保护价。
# 普通市价买入
order('000001.XSHE', 100, style=MarketOrderStyle())
# 科创板市价买入,设置保护价为 50.0 元
order('688001.XSHG', 200, style=MarketOrderStyle(limit_price=50.0))
B. 限价单 (LimitOrderStyle)
指定成交价格,只有当市场价格满足条件时才成交。
- 用法:
LimitOrderStyle(limit_price)
# 以 10.5 元的价格限价买入
order('000001.XSHE', 100, style=LimitOrderStyle(10.5))
C. 停止单/止损单 (StopOrder)
当价格突破设定的触发价(stop_price)时,自动转化为市价单或限价单。
- StopMarketOrderStyle:触发后转为市价单。
- StopLimitOrderStyle:触发后转为限价单。
- 模式 (
mode):'stop_loss'(止损):价格跌破触发价(多头止损)或涨破触发价(空头止损)时触发。'take_profit'(止盈):价格涨破触发价(多头止盈)或跌破触发价(空头止盈)时触发。
# 止损单示例:当价格跌破 9.0 元时,以市价卖出(止损)
# 注意:停止单仅在当日有效
order('000001.XSHE', -100, style=StopMarketOrderStyle(mode='stop_loss', stop_price=9.0))
2. 控制多空方向 (side 参数)
主要用于期货交易,控制是开多仓还是开空仓。
'long'(默认):做多。用于股票买入、期货开多或期货平空。'short':做空。用于期货开空或期货平多。
注意:股票和基金目前暂不支持通过此参数直接开空单(融券需使用融资融券专用API)。
# 期货开空单(卖出开仓)
order('IF2306.CCFX', 1, side='short')
# 期货平空单(买入平仓)
order('IF2306.CCFX', -1, side='short')
3. 控制平仓顺序 (close_today 参数)
该参数仅对上海国际能源中心 (INE)、上海期货交易所 (XSGE)、中金所 (CFFEX) 的期货标的生效。这些交易所区分“平今仓”(平掉今日新开的仓位)和“平昨仓”(平掉昨日以前的持仓),且手续费可能不同。
close_today = True:只平今仓。如果今仓不足,订单会废单。close_today = False(默认逻辑):优先平昨仓,昨仓不足部分平今仓。
# 强制平今仓(例如股指期货平今手续费较高,策略可能需要精细控制)
# 平掉 1 手 IF2306 的多单,且指定只平今日新开的仓位
order('IF2306.CCFX', -1, side='long', close_today=True)
4. 综合代码示例
以下是一个综合示例,展示了如何在策略中组合使用这些参数:
# -*- coding: utf-8 -*-
def initialize(context):
g.stock = '000001.XSHE'
g.future = 'IF2306.CCFX'
# 设定账户类型以支持期货
set_subportfolios([SubPortfolioConfig(cash=context.portfolio.starting_cash, type='futures')])
def handle_data(context, data):
# 1. 股票限价买入
# 以 15.0 元限价买入 100 股平安银行
order(g.stock, 100, style=LimitOrderStyle(15.0))
# 2. 股票止损卖出
# 如果持有平安银行,且价格跌破 14.0 元,以市价止损卖出 100 股
if context.portfolio.positions[g.stock].total_amount >= 100:
order(g.stock, -100, style=StopMarketOrderStyle(mode='stop_loss', stop_price=14.0))
# 3. 期货开空单
# 以市价开 1 手股指期货空单
order(g.future, 1, side='short', style=MarketOrderStyle())
# 4. 期货指定平今仓
# 平掉 1 手股指期货空单,强制只平今日仓位
# 注意:amount 为负数表示卖出/平仓,side='short' 表示操作的是空头方向的持仓
order(g.future, -1, side='short', close_today=True)
总结
| 参数 | 作用 | 可选值/类型 | 适用场景 |
|---|---|---|---|
| style | 订单定价方式 | MarketOrderStyle (市价)LimitOrderStyle (限价)StopMarketOrderStyle (停止市价)StopLimitOrderStyle (停止限价) |
所有标的 (科创板市价单需指定保护价) |
| side | 多空方向 | 'long' (做多)'short' (做空) |
主要是期货,股票默认为 long |
| close_today | 平仓优先顺序 | True (只平今)False (优先平昨) |
上期所、能源中心、中金所的期货标的 |
Q&A
Q: 如果我不设置 style 参数,默认是什么订单?
A: 默认为市价单 (MarketOrderStyle)。但在科创板交易中,直接使用默认市价单可能会因为缺少保护价而报错,建议显式设置 MarketOrderStyle(limit_price=...)。
Q: order_target 函数支持这些参数吗?
A: 支持。order_target 和 order_target_value 等函数同样支持 style, side, close_today 参数,用于控制调仓时的具体交易行为。
Q: 停止单(StopOrder)在收盘后还有效吗?
A: 无效。JoinQuant 的订单(包括停止单)仅在当日交易时间内有效,收盘后未触发或未成交的订单会被系统自动撤销。