QMT里有个很隐蔽的坑:策略变量放在contextinfo里,每次handlebar刷新都会被重置——导致你以为只下了一单,其实下了一堆,这是一期非常重要QMT踩坑视频,在开始之前,还没有QMT、PTrade又想做量化的朋友可以随时找我。我们先来看一段策略代码:

这段代码很简单,就是先赋值一个is_traded---下单标记为False,(后面我们都叫这个is_traded变量为下单标记),然后在每三秒刷新一次的handlebar中先去检测这个下单标记是不是为False,如果为False,就对某个标的做一个限价下单1手的操作,然后再给我们的下单标记赋值为True,如果三秒后下一个handlebar刷新,检测到下单标记为True了,就直接输出个已下单,然后跳过,就不再下单了。这段代码按照逻辑来说是不是只会下一单?那我们来运行一下看看:

可以看到,程序在给我们三秒下一次原本设定好的委托单嗷,那这不符合代码逻辑啊是不是?我们下单之后明明把下单标记设置为True了,按道理下次handlebar刷新的时候会跳过下单啊?这其实是一个非常严重的问题,因为如果稍有不慎,这个问题会导致你的策略重复地下很多委托。什么原因我们来看官网截图:图上很明确了,contextinfo的变量在下一个handlebar刷新后不会保留,也就是说,contextInfo里的变量会随着handlebar的三秒刷新而重置,(别逗你contextinfo笑了),重置为False之后,是不是又会下单,然后继续重置继续下单...

然后解决方案也很简单,我们重建一个全局class,然后把下单标记放在新建的这个classs里,这样就规避了contextinfo的重置机制,这是更改之后的程序,我们来看看效果:可以看到程序再下了一次委托单之后,就提示已下单跳过了,问题完美解决。

我是为量化投资者提供专业技术服务的一线客户经理,各位在量化方面有什么问题可以随时问我。 |