之前的贴子好像沉了。新开贴,请教老师们两个问题。
一是barexitstatus这段代码支不支持回溯?
按视频里讲解的处理方式,是在事件域开始后先贴这段代码:
Numeric i;
Numeric result=1;
for k=0 to DataSourceSize-1
{
result= result*data[i].BarExistStatus;
}
If(result<>1) Return;
但贴了这段代码,好像回溯测试时出现奇怪的问题,会发生一些之前没有的交易信号,原因未查明。所以想差距,在历史回溯测试时历史BAR的BarExistStatus是等于1(运行中)还是2(运行结束)呢?回溯测试我试过改成:If(result==1) Return,结果就完全没有历史信号。
如果加这段代码又要能够回溯测试又能实盘,该怎么改呢?还是说历史回测就不能加这段代码?
二是夜盘实时交易时,有夜盘的品种和没夜盘的品种怎么对齐呢?
因为有些品种有夜盘有些没有夜盘,那有夜盘的品种在BAR进行时BarExistStatuS等于1,没有夜盘的品种BarExistStatuS就等于2吗?如果没有夜盘的品种BarExistStatuS就等于2,那么这个时候岂不是代码一直返回就不交易了?那这时怎么处理呢?
感谢老师的耐心。
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
range[0:DataCount-1]
{
Commentary(BarExistStatuS=+text(BarExistStatuS));
}
Commentary(data1.BarExistStatuS=+text(data1.BarExistStatuS));
data1.Commentary(data0.BarExistStatuS=+text(data0.BarExistStatuS));
}
这种标志不就是先找规律吗,然后再编写
先明白图层上输出都是几,再写策略
王老师,可能是我没有表达清楚, 感觉你回复的和我想问的不是同一回事。
你回复的是说不同图层对不齐的时间,比如DATA[0]数据来了,因此BarExistStatuS是1。DATA[1]数据还没有来,因此BarExistStatuS是2,所以用之前那一串代码等对齐了再运行信号计算的业务逻辑。这个道理我明白。
但我的问题是,夜盘的时间段,那些没有夜盘的品种在这个时间段上BarExistStatuS一直是2,用上数据对齐那串代码后,整个代码在运行到这串代码的时候就一直返回,导致整个代码都一直不进行业务逻辑运算啊。而我的策略逻辑是,夜盘的时间段,有夜盘的品种还是会和没有夜盘的品种进行交互计算(比如要取CLOSE[1]),只不过如果有品种没有夜盘那么是取之前一天白天盘的CLOSE而已。但不能因为有个别品种在夜盘时间因为BarExistStatuS等于2的原因,就导致代码在这里就一直不运算。
举个例子,晚上21:30,DATA[0]有夜盘,DATA[1]没有夜盘,假如有一个不同图层进行交互计算的指标值是K=DATA[0].CLOSE[1]+DATA[1].CLOSE[1],这个K是作为信号计算的一个运算指标。如果数据对不齐,那么两个图层就因为取不到正确的.CLOSE[1]而导致信号闪烁,因此要用上BarExistStatuS这串代码,但用上以后,白盘没问题,因为白盘大家都有数据,但夜盘的时候因为DATA[1]的BarExistStatuS一直是2,所以程序在碰到这串代码后就一直返回。而正确的逻辑应该是,K=DATA[0].CLOSE[1]+DATA[1].CLOSE[1]还是要运算,还是要跑程序,只不过DATA[1]的CLOSE[1】是往前回溯取值才对。
因此问题在于,对于没有夜盘的品种,白天盘的时间数据没有来的时候BarExistStatuS等于2,但夜盘的时候因为是非交易时间段也导致BarExistStatuS等于2。但这两种情况的性质是不一样的。
说得比较啰嗦,不知道表达清楚没有,这个问题困扰我很久了。期待回复,谢谢
私聊解决中