老师好,
遇到一个多图层的问题,在程序中有两个图层,data0 是一分钟,显示数据量为1000,data1是tick,我想在data0里面计算kd值,然后再结合tick里面的计算结果来使用。问题是,在程序开始运动的时候,kd值没有问题(下图,左边是一个参考图),大概过了两分钟后,kd值开始不一致了(图3),kd 的计算方法是参考例子(图4),我怀疑是多图层使用上的问题,请帮忙解答一下,多谢了
我发现如果把 tick数据去掉(SubscribeBar(Symbol, \\\"tick\\\", SystemDateTime);),换成其他周期,计算结果就没有问题。只要加上tick的数据,计算数值就在1分钟后开始减小。老师能复现这个问题吗?
Params
//此处添加参数
Numeric Length_kd(5); //KD周期
Numeric SlowLength_kd(2); //KD慢线
Numeric SmoothLength_kd(2); //KD平滑周期
Numeric kd_upper(80); //KD上沿
Numeric kd_middle(50); //KD中线
Numeric kd_lower(20); //KD下沿
Vars
//此处添加变量
//---kd
Series<Numeric> HighestValue_kd;
Series<Numeric> LowestValue_kd;
Series<Numeric> KValue_kd;
Numeric SumHLValue_kd;
Numeric SumCLValue_kd;
Series<Numeric> DValue_kd;
Numeric KD_LongShort(0); //KD看多看空指标 0:没有方向,1:看多,2:看空
Tick my_tick;
Defs
//此处添加公式函数
Events
//此处实现事件函数
//初始化事件函数,策略运行期间,首先运行且只有一次
OnInit()
{
SubscribeBar(Symbol, \"tick\", SystemDateTime);
}
//Bar更新事件函数,参数indexs表示变化的数据源图层ID数组
OnBar(ArrayRef<Integer> indexs)
{
Range[0:0] //在 1 分钟图上
{
//---计算KD,得出看多看空方向
HighestValue_kd = HighestFC(High, Length_kd);
LowestValue_kd = LowestFC(Low, Length_kd);
SumHLValue_kd = SummationFC(HighestValue_kd - LowestValue_kd, SlowLength_kd);
SumCLValue_kd = SummationFC(Close - LowestValue_kd, SlowLength_kd);
If(SumHLValue_kd <> 0)
{
KValue_kd = SumCLValue_kd / SumHLValue_kd*100;
}Else
{
KValue_kd = 0;
}
//DValue_kd = AverageFC(KValue_kd,SmoothLength_kd);
Commentary(\"K=\"+Text(KValue_kd));
//Print(\"D=\"+Text(DValue_kd));
//if(KValue_kd[0] > kd_lower && CrossOver(KValue_kd[1],kd_lower))
if(KValue_kd[0] <= kd_lower)
{
KD_LongShort =1; //kd看多
//}Else If(KValue_kd[0] < kd_upper && CrossUnder(KValue_kd[1],kd_upper))
}Else If(KValue_kd[0] >= kd_upper)
{
KD_LongShort =2; // kd看空
}Else{
KD_LongShort =0; // kd无方向
}
}
Range[1:1] //在tick图上
{
GetTick(my_tick); //获取tick数据
Print(\"提示:K=\"+Text(data0.KValue_kd));
}
}
下面是代码,老师帮忙看看是什么原因造成kd值不一样的?
麻烦代码用复制的方法,我们复现一下