VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy
Member
avatar
加入于:
帖子: 179
声望: 0

代码如下:
engine = init_cli_trading([gateway])
engine.main_engine.add_app(RiskManagerApp) # 加载风控
a = engine.main_engine.get_engine('RiskManager')
a.active = True
a.daily_order_limit = 10
测试结果,连续报单超过10笔,委托并未被拦截。
后改用:
setting1 = {}
setting1["active"] = True
setting1["daily_order_limit"] = 10
报错:
AttributeError: 'RiskEngine' object has no attribute 'update_setting'. Did you mean: 'update_rule_setting'?

Super Moderator
avatar
加入于:
帖子: 141
声望: 15

我先查一下 vnpy_riskmanager 模块的源代码,看看风控引擎的加载和设置更新机制。

再看一下规则模板基类 template.py 中 update_setting 的实现:

原因已经清楚了。让我再确认一下 APP_NAME 和 get_engine 的取值,顺便看下官方文档的说明:

问题原因

你两次尝试失败的原因不同:

尝试 1(直接改属性):get_engine('RiskManager') 拿到的是 RiskEngine 对象(风控管理引擎)。a.active = True 和 a.daily_order_limit = 10 只是给引擎对象动态添加了两个属性,真正执行检查的是引擎内部的规则对象(如 DailyLimitRule),规则读取的是自己身上的参数,所以完全没生效。

尝试 2(调用 update_setting):update_setting 是规则模板(RuleTemplate)上的方法,而 RiskEngine 引擎上对应的方法叫 update_rule_setting(rule_name, setting),需要传规则名 + 参数字典。这就是报错信息里提示 update_rule_setting 的原因。

正确写法

参考 vnpy_riskmanager/engine.py 的 update_rule_setting 方法:

from vnpy_riskmanager import RiskManagerApp

engine = init_cli_trading([gateway])
engine.main_engine.add_app(RiskManagerApp)

risk_engine = engine.main_engine.get_engine("RiskManager")

setting = {
    "active": True,
    "total_order_limit": 10,        # 汇总委托上限(每日总委托笔数)
}
risk_engine.update_rule_setting("每日上限检查", setting)

调用后,该方法会把参数写入规则对象、推送 UI 事件,并持久化保存到 risk_manager_setting.json,下次启动直接生效。

“每日上限检查”规则的合法参数

根据 rules/daily_limit_rule.py,该规则的参数名如下(你写的 daily_order_limit 不是合法参数,即使成功调用也会被忽略):

参数名 含义 默认值
active 启用规则 True
total_order_limit 汇总委托上限 20000
total_cancel_limit 汇总撤单上限 10000
total_trade_limit 汇总成交上限 10000
contract_order_limit 单合约委托上限 2000
contract_cancel_limit 单合约撤单上限 1000
contract_trade_limit 单合约成交上限 1000

另一种方式:配置文件

也可以在运行目录下创建 risk_manager_setting.json,启动时会自动加载(注意 key 要用规则的中文名称):

{
    "每日上限检查": {
        "active": true,
        "total_order_limit": 10
    }
}

其他可用规则名可在启动日志中查看(引擎初始化时会输出“风控规则[xxx]加载成功”),也可通过 risk_engine.get_all_rule_names() 获取。

参考来源:vnpy_riskmanager/engine.py、vnpy_riskmanager/template.py、vnpy_riskmanager/rules/daily_limit_rule.py


基于RAG技术开发的VeighNa AI助手,你的个人专属 Desk Quant