我在跨周期找形态的时候,想寻找顶底分型。我是通过数组弄的,用数组记录每个满足情况的分型的高低点,再去比较分型的高低。
但这里遇到个问题。onbar里,每根bar程序运行一次,就导致小周期运行的时候,我的大周期数组被循环赋值。最后,大周期一个周期内,比如在一天之内,小周期运行了10遍,就把我数组里的数全部赋值成了同一个数。
我已经设置了分图层运行(range),但还是解决不掉range[1:1]里的数组在每个小周期上都运行的问题
OnBar(ArrayRef<Integer> indexs)
{
range[0:0]
{
If( (c[2]>c[1] and c>c[1]))
{
for i = 0 to 3
{
difenxing_arr[i] = difenxing_arr[i + 1];
}
difenxing_arr[4]=data0.c[1];
}
If(c[2]<c[1] and c<c[1])
{
for i = 0 to 3
{
dingfenxing_arr[i] = dingfenxing_arr[i + 1];
}
dingfenxing_arr[4]=data0.c[1];
}
}
///////////////////////////////////////////////////
range[1:1]
{
If( (c[2]>c[1] and c>c[1]))
{
for i = 0 to 3
{
upper_difenxing_arr[i] = upper_difenxing_arr[i + 1];
}
upper_difenxing_arr[4]=data1.c[1];
}
If(c[2]<c[1] and c<c[1])
{
for i = 0 to 3
{
upper_dingfenxing_arr[i] = upper_dingfenxing_arr[i + 1];
}
upper_dingfenxing_arr[4]=data1.c[1];
}
}
请老师帮我看下如何解决
如果你的数组是global,每次驱动后保证不会清空,那其实可以试试用驱动参数indexes来限定一下,只有某个图层驱动才执行对应的代码
驱动参数可以看看零基础里关于行情驱动onbar的介绍说明,简单来说就是这个indexes里存放了本次参与行情更新驱动的图层编号
谢谢老师,经过修改可以用了。但还有个未来函数的问题。修订后的代码如下:
OnBar(ArrayRef<Integer> indexs)
{
if(GetArraySize(indexs)==2)
{ Range[1:1]
{
If( (c[2]>c[1] and c>c[1]))
{
for i = 0 to 3
{
upper_difenxing_arr[i] = upper_difenxing_arr[i + 1];
}
upper_difenxing_arr[4]=c[1];
}
If(c[2]<c[1] and c<c[1])
{
for i = 0 to 3
{
upper_dingfenxing_arr[i] = upper_dingfenxing_arr[i + 1];
}
upper_dingfenxing_arr[4]=c[1];
}
}
}
if(GetArraySize(indexs)==1)
{
If( (c[2]>c[1] and c>c[1]))
{
for i = 0 to 3
{
difenxing_arr[i] = difenxing_arr[i + 1];
}
difenxing_arr[4]=c[1];
}
If(c[2]<c[1] and c<c[1])
{
for i = 0 to 3
{
dingfenxing_arr[i] = dingfenxing_arr[i + 1];
}
dingfenxing_arr[4]=c[1];
}
但我发现这里有个未来函数的问题,比如index[0]是5min,index[1]是一天,我去定义大级别底分型的时候,其实当天的bar还没走完。但在回测中,当天的bar是在当晚00:00分生成的。有没有办法通过设置,让当天bar对齐15:00,这样避免了未来函数,回测也更准确。
看不懂什么意思,日线bar不是当晚00:00生成的,你是怎么得出这个结论的
历史bar的驱动是按k线一根一根走的,如果你是5min和1日,那么当天每一根5min都要一根一根走过去,对应的日线bar一直是同一根