条件单怎么实现?
比如开盘价格(9.30) 10块钱, 9.31分的价格是10.5元
但实际操作中可能9.30-9.31直接拉升了,所以9.30的时候买不到,
但是想在9.30的时候把10块钱的单子挂上, 在收盘前跌回10块钱的时候即可买入, 应该如何实现?
问题描述
解决方案
在 JoinQuant 聚宽平台上,实现这种“指定价格挂单,等待盘中回落成交”的条件单需求非常简单。您只需要在开盘时(9:30)使用**限价单(LimitOrderStyle)**进行委托即可。
聚宽的限价单撮合机制
根据聚宽的订单处理逻辑:
- 挂单与撮合:当您下达限价单时,如果当前价格无法立即成交,引擎会将该订单挂在盘口。在分钟频率的策略中,挂单会在每个分钟 Bar 结束时尝试撮合。如果盘中价格(分钟 Bar 的最低价)跌到了您的委托价或更低,订单就会自动成交。
- 自动撤单:所有未完成的订单将在本交易日结束后自动撤销,不需要您手动清理。
实现代码示例
您可以设置策略在每天 09:30 运行一次,获取当天的开盘价,并以此价格下达限价买单。代码如下:
# 导入聚宽函数库
import jqdata
def initialize(context):
# 设定要操作的股票
g.security = '000001.XSHE'
# 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 每天 09:30 定时运行挂单逻辑
run_daily(market_open, time='09:30')
def market_open(context):
# 获取当前时刻的数据
current_data = get_current_data()
# 获取当天的开盘价
# 注意:day_open 在 09:27 集合竞价结束后即可获取
open_price = current_data[g.security].day_open
# 假设我们要买入 1000 股
amount = 1000
# 使用 LimitOrderStyle 下限价单
# 这样即使 9:31 价格拉升到 10.5 元,这个 10 元的买单依然会挂在系统中
# 如果盘中价格跌回 10 元及以下,引擎会自动撮合成交
order(g.security, amount, LimitOrderStyle(open_price))
log.info(f"已在 09:30 以开盘价 {open_price} 元挂单买入 {g.security} {amount} 股")
核心逻辑解析
run_daily(market_open, time='09:30'):确保挂单动作在每天开盘的第一时间执行。get_current_data()[g.security].day_open:准确获取当天的开盘价(即您例子中的 10 块钱)。LimitOrderStyle(open_price):这是实现条件单的关键。它告诉交易引擎:“我只愿意以open_price或更低的价格买入”。引擎会接管这个订单,在当天的后续时间里(如 10:30 或 14:00),只要价格触及该价位,就会自动成交。
通过这种方式,您无需在 handle_data 中每分钟去判断价格是否跌回 10 元,交易引擎的底层撮合机制会完美帮您实现这个“条件单”功能。