3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在聚宽(joinquant)量化交易平台中,事件驱动模式可以让策略在账户或标的发生特定市场事件时立即做出响应。通过定义 on_event 回调函数,策略能够动态监听持仓标的或账户的特殊变更(如分红送股、强行平仓等),从而提高策略的异常处理与风控能力。
on_event 事件回调?on_event(context, event) 是 joinquant 提供的一个可选策略程序架构接口。当用户账户中持仓的标的发生对应事件时,策略引擎会自动调用该函数。
def on_event(context, event):
# 业务逻辑代码
pass
Context 对象,包含当前账户、子账户、持仓及时间等总览信息。isinstance() 对事件类型进行判断。当期货保证金不足或融资融券账户触发追保防线时,系统可能会执行强行平仓。此时,joinquant 会生成 ForcedLiquidationEvent 并传入 on_event 函数。
| 属性名称 | 类型 | 说明 |
|---|---|---|
name |
str | 事件名称,固定为 'ForcedLiquidation' |
pindex |
int | 子账户索引(子仓位序号) |
security |
str | 被强平的标的代码 |
side |
str | 仓位方向:'long'(多头)或 'short'(空头) |
amount |
int/float | 被强行平仓的数量 |
以下示例展示了如何在 on_event 中捕获强行平仓事件,并结合日志记录与微信消息通知(send_message)进行风控预警:
import jqdata
from jqdata import ForcedLiquidationEvent, DividendsEvent
def initialize(context):
# 开启动态复权模式
set_option('use_real_price', True)
# 设置基准
set_benchmark('000300.XSHG')
# 设定期货或融资融券账户类型(示例)
set_subportfolios([SubPortfolioConfig(cash=1000000, type='futures')])
def on_event(context, event):
# 1. 捕获强行平仓事件
if isinstance(event, ForcedLiquidationEvent):
log.error("[风控警告] 触发强行平仓事件!")
log.error("标的: %s, 仓位方向: %s, 被强平数量: %s, 子账户索引: %d" % (
event.security, event.side, event.amount, event.pindex
))
# 发送微信风控提醒(模拟盘/实盘有效)
send_message("[警告] 标的 %s 发生强平,平仓数量: %s" % (event.security, event.amount))
# 自定义后续逻辑:例如清除该标的的挂单或更新策略全局状态
cancel_all_orders_for_security(event.security)
# 2. 捕获分红送股事件(可选)
elif isinstance(event, DividendsEvent):
log.info("[事件通知] 标的 %s 发生分红送股事件" % event.security)
def cancel_all_orders_for_security(security):
"""撤销指定标的的所有未完成订单"""
open_orders = get_open_orders()
for order_id, order_obj in open_orders.items():
if order_obj.security == security:
cancel_order(order_obj)
log.info("已撤销标的 %s 的未完成订单: %s" % (security, order_id))
on_event 的最佳实践isinstance(event, ForcedLiquidationEvent) 明确区分事件。context.subportfolios[i].is_dangerous(margin_rate) 检查保证金率,在触发强平前主动减仓。on_event 中叠加 log.error 和 send_message,确保风控人员能第一时间收到通知。