我先查一下 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