🚀 AI 一键生成 joinquant 策略代码
立即体验

joinquant 事件驱动编程:如何使用 on_event 捕获强行平仓与风控事件

joinquant | 发布时间: 2026/7/25
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 事件驱动编程:使用 on_event 捕获强行平仓与风控事件

Question: joinquant 中当期货或信用账户触发强行平仓时,如何通过 on_event 回调函数捕获并处理?

解决方案

joinquant 事件驱动编程:使用 on_event 捕获强行平仓与风控事件

在聚宽(joinquant)量化交易平台中,事件驱动模式可以让策略在账户或标的发生特定市场事件时立即做出响应。通过定义 on_event 回调函数,策略能够动态监听持仓标的或账户的特殊变更(如分红送股、强行平仓等),从而提高策略的异常处理与风控能力。


1. 什么是 on_event 事件回调?

on_event(context, event) 是 joinquant 提供的一个可选策略程序架构接口。当用户账户中持仓的标的发生对应事件时,策略引擎会自动调用该函数。

语法定义

def on_event(context, event):
    # 业务逻辑代码
    pass

参数说明

  • context: Context 对象,包含当前账户、子账户、持仓及时间等总览信息。
  • event: 触发的事件对象。建议使用 isinstance() 对事件类型进行判断。

2. 强行平仓事件(ForcedLiquidationEvent)详解

当期货保证金不足或融资融券账户触发追保防线时,系统可能会执行强行平仓。此时,joinquant 会生成 ForcedLiquidationEvent 并传入 on_event 函数。

事件属性

属性名称 类型 说明
name str 事件名称,固定为 'ForcedLiquidation'
pindex int 子账户索引(子仓位序号)
security str 被强平的标的代码
side str 仓位方向:'long'(多头)或 'short'(空头)
amount int/float 被强行平仓的数量

3. 实战代码示例:捕获强平与风控处理

以下示例展示了如何在 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))

4. 使用 on_event 的最佳实践

  1. 精准类型判断:因未来平台可能拓展更多事件类型,务必使用 isinstance(event, ForcedLiquidationEvent) 明确区分事件。
  2. 配合保证金预警接口:对于期货策略,除了被动等待强平事件外,建议主动在交易逻辑中使用 context.subportfolios[i].is_dangerous(margin_rate) 检查保证金率,在触发强平前主动减仓。
  3. 日志与告警自动化:强平是高风险交易信号,建议在 on_event 中叠加 log.errorsend_message,确保风控人员能第一时间收到通知。