等级: 超级版主
- 注册:
- 2021-5-24
- 曾用名:
|
本帖最后由 技术009 于 2024-12-24 09:48 编辑
图表模型是一个基于历史回测的理论模型。某些盘中实时发生的情况,在回测中是无法有效复现的,最终导致实际执行的信号和复盘时候的信号存在差异。这种现象我们称之为信号闪烁。
这里我们讨论一些常见的信号闪烁的场景:
1.交易模式使用固定轮询模式。
这是最常见的导致信号闪烁的原因。因为固定轮询模式是实时捕捉信号并执行的。例如采用阳线作为开仓
条件。我们盘中实时下单时候可能是满足阳线的,但是等这个K结束后可能是阴线了。我们的图表模型在历史位置的信号是基于已经完成的K来
重新计算生成的,此时在我们实际下过单的K位置上开仓信号就会消失了。
这个问题可以尝试通过代码来做矫正,例如使用REF函数 获取上一个K已经确认的条件。或者直接改用走完K模式执行信号。
2.使用了跨周期调用。
小周期调用大周期或者大周期调用小周期,都有一个时间对其的机制来确定 被调用周期的K的位置。如果被调用周期的K位置发生变化 或者被调用周期的K本身一直在更新状态都会导致信号闪烁,具体情况如下:
小周期调用大周期:
例如我们1分钟调用日线. 调用的就是当前的日线。此时我们调用的位置其实是固定的,但是日线在收盘前它的K其实是一直在更新的。
而我们无法把它的中间状态一直保留下来,这就导致了小周期调用大周期的闪烁情况了。
这个问题可以尝试通过代码来做矫正,例如调用时候偏移一个周期,即调用上一个大周期的结果。
大周期调用小周期:
例如日线调用1分钟周期. 一个日线下对应很多1分钟周期,所以调用时候遵循就近调用原则来确定调用的K的位置.因此随着时间的变化,
我们调用到的1分钟周期的K始终是会发生变化的。 在日线周期上 上午10点调用到的小周期K和11点调用到的小周期K,就完全不是一个位置的1分钟的K了。
这种情况下指标的计算结果也会发生变化,从而引发信号闪烁。
3.使用了没有历史值的函数
图表模型是依赖于历史回测结果的,如果模型使用的某个函数没有历史过程的值,那么它是无法有效参与回测的。
因为回测是需要程序把历史数值一一对应到历史位置上的。
常见的没有历史值的函数:
1).实际账户相关的函数
比如实际账户(指客户实际登陆的交易账号,而不是图表模型的理论账户)的权益,盈亏等等,这些都是盘中实时变化的,没有中间状态落地的。
2).动态行情函数
通常是盘口的动态数据,例如买一卖一这些函数.这些数据不落地,只有最新值
3).部分常数函数
例如:const ,SYSPARAM,DATACOUNT,ISLASTBAR 等等 。这些函数仅适用于特定场景。他们都只维持最新值,不要用在图表交易模型的计算逻辑中。
常数函数中其他的和品种基础信息相关的,如合约乘数,最小变动价位 则是没有实际影响,因为这些值从含义上本身就是静态的固定值。
4.图表数据发生变化
数据量对图表模型的信号是有直接影响。尤其是起始位置的差异,会直接影响到信号结果。
如果在图表上设置了一个较小的固定数据量,是极容易引发信号闪烁的。例如仅仅设置几十个K的数据量。
那么固定数据量的设置会导致每次出现新K,原有的第一个位置的K就被移除了。
5.其他特殊情况
1.次周期限价指令的问题。
图表模型里 如果报单价格在入场K线范围之外 会算作无效单的(超价不算)。当我们使用次周期入场的限价指令(limit)
时候,在最新K位置的时候,价格检查是不生效的。所以在最新K上这个信号是存在的,当这个最新K变成历史K时候 反而可能因为价格检查机制失效了 导致出现信号闪烁的问题。这种闪烁不容易被发现,但是处理起来只需要用 IGNORECHECKPRICE函数 处理下就行了,具体操作参考这个函数的说明就行了。
2.调用的指标/DLL 中存在闪烁或者使用了未来函数的情况.
即便是非跨周期调用情况下,如果调用的指标本身存在闪烁(上文1-4提到的闪烁因素 或者使用未来函数),那么也可能会连带当前指标也会产生闪烁。有些未来函数函数虽然不能直接用在交易模型中,但是作为被调用的指标目前是没有限制的。此外使用自定义函数(VBA实现的)或者调用C++实现的DLL的过程中, 因为代码逻辑的缘故 也可能会引发闪烁,通常这种更底层的代码出现问题会更加隐晦。
|
|