QMT量化软件,模拟盘和实盘注意事项!
发布时间:2小时前阅读:41
很多人拿到QMT之后上来就急着跑实盘,其实模拟盘阶段把坑踩完,真金白银的时候才不会心态崩。今天专门聊聊QMT里模拟盘和实盘最容易忽略的一个点——持久化,以及从测试到上实盘必须注意的细节,建议收藏再看。
先说为什么要搞持久化。量化策略跑起来以后,很多状态是存在内存里的,比如你已经买了哪些票、每只票的持仓成本线、止盈止损标记、当天是否已经打过板、自定义的标志位等等。但实际环境很复杂,电脑蓝屏、家里停电、券商后台维护、客户端自动更新、甚至你自己想改两行代码热重启一下,只要策略进程一停,内存里的全局变量瞬间清零。如果不做持久化,策略重启后就像失忆了一样,不知道自己昨天买了啥,可能重复下单、漏卖、甚至满仓再怼一遍,后果不用我多说。持久化就是给策略加了个“存档点”,断线重连后能接着上次的状态继续跑。
QMT框架里最常用的做法是用pickle模块把关键数据落盘。你可以把股票池状态、账户中间信息、订单流水、还有自己定义在全局对象里的各种标记变量序列化保存到本地文件里。系统本身也有一套自动触发机制:比如在before_trading_start(第二天开盘前)、handle_data(盘中刷bar)、after_trading_end(收盘后)这几个节点,框架会帮你做一次持久化信息的更新和写入。也就是说,正常情况你不用手动狂写保存代码,框架会在关键时点兜底。
但这里面有几个非常隐蔽的坑,90%的新手都栽过。第一,券商版本升级或者运行环境重启之后,QMT恢复交易时是先跑一遍你策略里的initialize初始化函数,然后再把之前存的持久化数据读回来覆盖。如果你的某个变量在initialize里给了初值,比如g.buy_flag = False,而持久化里记的是True,那最终会以持久化文件里的True为准,这本来是好事,但前提是你这个变量能被序列化。如果你不小心把一个不能序列化的东西塞进去了,就会报错或者直接丢状态。
第二,哪些东西不能持久化?记住一句话:凡是跟IO挂钩的都不能pickle。比如你open()打开的文件句柄、网络连接、数据库游标、某些第三方库实例化出来的复杂类对象,这些一旦试图保存就会直接异常。还有个小技巧:如果你有些变量就是不想被保存(比如只想在单次运行周期内临时用用),或者它就是没法序列化,你可以在initialize里定义变量名时前面加两个下划线,比如g.__temp_list,QMT会把这种当成私有变量,持久化时自动跳过,既不报错也不污染存档。
还有一个实战细节:模拟盘阶段一定要故意测“中断恢复”。比如策略跑了半小时,你手动关掉客户端再开,看它会不会重复发单、会不会忘了自己有仓位、会不会把委托当成新信号再下一遍。很多人在模拟盘觉得信号漂亮,一上实盘遇到周末重启或者券商半夜升级,周一直接翻车。另外模拟盘虽然不花钱,但尽量把撮合逻辑、撤单次数限制、价格笼子这些都开着测,别为了爽把风控全关了,不然实盘一来全是废单。
从模拟盘切实盘还有几个习惯要养:一是路径问题,本地写的文件最好用绝对路径或者固定的用户目录,别用相对路径,换台电脑或者券商给的绿色版放别的位置就找不到存档了;二是日志分开,模拟盘和实盘建议用不同的持久化文件名,防止哪天手滑拿模拟盘的空状态覆盖了实盘仓位;三是权限检查,实盘前确认下单函数是quicktrade=2还是0,确认ContextInfo和全局变量的用法跟你想的一致,确认品种权限开了(比如可转债、创业板、期权经常有人忘了开权限导致委托失败)。
QMT这套机制设计其实是偏专业的,好处是自由度极高,坏处是坑都得自己填。只要你把持久化这块理顺了,策略稳定性至少上一个台阶。
如果你需要一份我整理好的QMT持久化模板代码,或者想知道怎么把止盈止损状态安全地存成本地JSON防崩盘,评论区留个“持久化”或者私信我,我把示例和避坑清单一起发你。
温馨提示:投资有风险,选择需谨慎。
-
REITs打新日历:四川成都 ⌈锦江 REIT⌋ 本周四售!(附认购操作指南)
2026-07-27 16:59
-
2026夜市委托怎么操作?个人经验攻略全分享
2026-07-27 16:59
-
新股发行:【展芯股份】+【国仪公司】+【超纯应材】本周可申购!(附打新神器)
2026-07-27 16:59


问一问

+微信
分享该文章
