策略是跨周期多图层,大周期30秒,小周期1秒,出现一种闪烁问题用PRINT排查不出来,以下是两个问题想求证一下:
1、在1秒周期上进行print序列变量值,如果该序列变量值在该1秒内发生了变化,那么是只会print一次还是两次?(比如1秒BAR的前一个TICK序列变量A=1,下一个TICK序列变量A=-1,那么系统是PRINT出 A=1还是A=-1,还是说会先PRINT A=1然后PRINT A=-1?)
疑问场景:我在排查一个信号闪烁问题,特征是实盘报单了但查看图表没有信号,print开仓条件序列变量A时发现A并不满足报单条件但实盘确实又报单了。因此第一猜测是有没有可能在该1秒BAR的前一个TICK时A满足了条件因此报单,但下一个TICK时A又不满足了信号又消失了。假如print指令只会在一根BAR内输出一次(比如print出来的A是后一个TICK时的值),那么信号闪烁问题就有可能是上述这种猜测,A在1秒内的两个TICK之间发生了变化。
2、上述1只是其中一种信号闪烁的可能性,但我观察了A不太可能在该根BAR发生变化,所以想求证另外一种可能性:对于跨周期多图层来说有没有可能会产生由于数据缺失问题导致的信号闪烁?
疑问场景:比如我的策略报单指令是放在小周期上的,但报单指令条件有引用大周数的相关变量,因此有没有可能大周期和小周期接受数据不同步导致一些变量值变化产生未知的错误?最近被这个信号闪烁问题搞得头疼,非常难以复现,PRINT不出来报单那一刻到底发生了什么,所以想问一下有没有可能是数据不同步问题导致的信号闪烁而不是代码问题。
谢谢!
2、quant会。由于数据没对齐导致。quant3,优化了,可以避免同品种跨周期的数据没对齐问题
1、在1秒周期上进行print序列变量值,如果该序列变量值在该1秒内发生了变化,那么是只会print一次还是两次?(比如1秒BAR的前一个TICK序列变量A=1,下一个TICK序列变量A=-1,那么系统是PRINT出 A=1还是A=-1,还是说会先PRINT A=1然后PRINT A=-1?)
这个问题问得有点不知道怎么回答。
一秒的k线图,照理说,盘中按tick驱动,会驱动两次。
所以也许你的series类型A,前后可能值不一样。
但是如果你在A赋值语句后面写print
那不是驱动两次,也应该print两行吗?肯定是当时A里面放什么值,就print什么值不是吗
这种情况多半就是信号闪烁了,你可以通过print两次来查看前后到底是什么状态
感谢老师,我本意就是想通过Print来观察该变量值在1秒内两个TICK前后是什么状态看发生了什么,因为1秒的周期如果报单了又消失了,肯定是其中一个TICK符合报单条件才报单的(大概率是第一个TICK),但的确又是print了A这个条件值一行而不是两行,而且Print的是不符合报单条件的值,这样的话我就没法Print到报单那一刻A的值到底是什么。
我还原一下代码场景:
onbar
{
Position pos;
Bool ret = A_GetPosition(RelativeSymbol, pos, "");
Print("A_GetPosition:" + IIFString(ret, "True", "False") + "," + Text(pos));
buyposition= pos.longCurrentvolume;
sellposition= pos.shortCurrentVolume;
A= buyposition-sellposition;
print("A:"+text(A));
if(A>=0 and low<=B)
{
print("A确认:"+text(A));
Sellshort(0,open);
}
}
上述为代码场景,其中A= buyposition-sellposition;这一行是关键的开仓变量,只有大于或者等于0时才可以开空单, 紧跟着print("A:"+text(A));这一行进行打印,报单发生那一根1秒BAR, print("A:"+text(A))这行代码打印出来出来只有一行,A值为-1,不符合报单条件,因此print("A确认:"+text(A));这一行不打印很正常。
问题在于,既然报单了,那么某一个TICK时 A值一定是大于或者等于0,但我print不到此时的A值,因此才有上述疑问。
这种情况下,该怎么排查?谢谢老师
......
我没看错吧?你用真实账户的持仓判断图表信号?
那我问一下
你这里的A是指合约净持仓是吧?
假使第一tick驱动的时候,账户1多0空,所以A等于1,大于等于0,满足条件是吧?驱动sellshort,报平多并且开空,然后迅速报单成功并成交,那净持仓是不是就是变成0多1空-1小于0了?
第二tick驱动报过来的时候,请问这个A是不是就不满足条件了?信号是不是消失了?
但貌似不是这里的问题,我贴图上来:
信号闪烁的BAR是20250425的09:06:01这根BAR,实盘帐户委托报单,且当根BAR就成交了。K线图对应的这根BAR没有图表信号。
关键变量的排查:
1、报单的前一根BAR,也就是09:06:00这根BAR,PRINT出来的多头持仓为0,空头持仓为2,净持仓是-2。
2、报单的当根BAR,也就是09:06:01这根BAR,PRINT出来的多头持仓为0,空头持仓为2,净持仓是-2。
3、报单的后一根BAR,也就是09:06:02这根BAR,PRINT出来的多头持仓还是0,空头持仓还是2,净持仓还是-2。
疑问:
1、在09:06:01报单的这根BAR之前和之后,PRINT出来的多头持仓和空头持仓都没有变化。但假如09:06:01这根BAR报单且马上就成交了,为什么在09:06:02查询的时候,持仓还没有变化呢?
2、而09:06:00和09:06:01这两根多头持仓是0,空头持仓是2,净持仓是-2,不符合条件,怎么会卖出开仓呢?
这是空头开仓报单代码,整份代码只有这一处是开空指令。
老师你说的这一部分也对,这也会导致闪烁,我想下怎么控制和避免。但是目前发生的闪烁问题应该不是这个情况,以下是相关的贴图(包括实盘帐户报单截图,K线图表信号截图,控制台截图)。
你给的信息太乱了,没办法分析。
输出的日志和给的代码也对不上。
输出日志的机器时间在哪里?我只能看到bar时间?一根一秒bar不是应该跑两次吗?为什么只有一个日志?挺奇怪的