突破交易,OnBar中示例代码如下:
if(MarkPosition == 0 && High > 上轨)
{
...
}
else if(MarkPosition == 0 && Low < 下轨)
{
...
}
问题:若实时行情中,当前bar先满足Low < 下轨,则开仓,后续在同根bar中又满足High > 上轨,则又会开一次仓。
请问各位老师,如何限制这种情况?用全局变量控制是否可行,是否会造成信号闪烁?
这里普通的序列变量做开关足够了
图表不要想着用全局变量
序列变量不是在每个tick都会重置吗?
会重置成上一根bar的计算终值
那这样不行啊,每个tick控制变量都被重置了,只有全局变量才不会被重置吧?但全局变量又会引起信号闪烁问题:
if(MarkPosition == 0 && High > 上轨 && 控制变量 == 0)
{
控制变量 = 1;
}
你再想想,重置也能用的
举个代码实例来说明你为什么觉得不能用吧
if(MarkPosition == 0 && High > 上轨 && 控制变量 == 0) //2. 控制变量重置为0,又执行了一次交易
{
控制变量 = 1;
buy
}
else if(MarkPosition == 0 && Low < 下轨 && 控制变量 == 0)
{
控制变量 = 1; // 1. 控制变量在上个bar为0,执行后变量变成1
sellsort
}
解决这个问题我推荐的方法上面说过了,并不推荐使用全局变量的方法来解决。
如果你一定要用global来作为状态变量来控制,也是可以起到控制信号闪烁的效果。
但是我要提醒你,这会引起信号闪烁和偷价。
如果你不介意信号闪烁和偷价,那就没问题
我知道全局变量会引起信号闪烁,所以在问有什么解决方法。现在老师不是推荐用序列变量来控制吗?我发的代码用序列变量作为控制变量还是会造成重复下单的问题啊,是我理解错误还是怎样呢?
因为你的这个问题不是用什么类型的变量引起的,而是逻辑结构引起的信号闪烁,这已经不是变量类型的问题了。
我最后再详细说一遍吧。
如果你有两个信号条件,分别是A和B,你现在写的逻辑是这样的
if(A) buy;
else(B) sellshort;
这种情况下是无法区分A和B谁先发生导致。如果B先发生,然后A发生,那么B信号就会消失。
实际上这种写法,只要碰到一根k线可能同时满足AB两种情况导致反向交易的,是无法通过状态变量的方式进行控制的。
唯一能解决的方案就是上面说过的,跨周期,用更小的周期数据去判断。比如原本你看的日线,降级以后可以用分钟线,一根日线拆成几百根分钟线,每一根分钟线都不可能同时触发AB两个条件,那么就可以非常清楚的看到AB条件在日线一根bar内到底谁先执行,谁后执行。
至于你其他帖子非常执着的说是不是要用global替换series来控制,我的个人意见是,一样会闪烁,解决不了这个问题。
这个建议我已经在你的帖子下反复描述了两三次了,后面就不再赘述了🤝
感谢老师的耐心答复,我已经解决这个问题了,虽然可能在回测中特定场景会有不一致的情况,但在实盘中就不会出现这种两头都开仓的情况了。
再次感谢!