老师,我想在1分钟线周期里面手工取日线周期,代码如下,但是结果都是0,请问这是为何?谢谢老师。
Array<Numeric> arrClose20;
Integer i;
For i = 0 To 19
{
If (BarStatus==2) Print(\"前\"+Text(i)+\"天Close=\"+Text(CloseD(i)));
ArrayInsert(arrClose20, i, CloseD(i));
}
谢谢两位老师,样例代码也挺好的。感谢。
最后我感觉这么处理还是有点复杂,直接使用数据订阅,用data1来实现了,另外花了一个plot的图,把data1想显示的结果放到了那里,也不用担心串。
不是不行,而是使用CloseD获取日线收盘价有很多前提条件:
(1)首先要有足够多的数据,以你代码的案例来说,至少要有20天以上的小周期数据,才能取到20天的日线收盘价,比较浪费空间。
(2)CloseD是序列函数,正是因为序列函数,所以我一般不会推荐使用CloseD作为获取日线收盘价的原因之二,你的代码中【If (BarStatus==2)】不能保证每根Bar都会执行CloseD,所以会导致序列类型的数据处理异常。
因此修改代码如下:
Params
Integer Days(20);
Vars
Global Array<Numeric> arrClose20;
Events
OnInit(){
String tSymbol = \"rb888.SHFE\";
TimeStamp startDate= PreTradingDay(tSymbol, CurrentDate, Days);
SubscribeBar(tSymbol, \"1m\", startDate, 0);
}
OnBar(ArrayRef<Integer> indexs){
Integer i;
PrintClear;
ArrayClear(arrClose20);
For i = 0 To Days - 1{
Print(\"前\"+Text(i)+\"天Close=\"+Text(CloseD(i)));
ArrayPushBack(arrClose20, CloseD(i));
}
Print(TextArray(arrClose20));
}
但是编译会有警告提示你,慎用这类序列类型的函数,虽然可以使用,但是会有隐患。
一般强迫症的人会修改一下代码,让警告消失,下面的进一步修改:
Params
Integer Days(20);
Vars
Global Array<Numeric> arrClose20;
Events
OnInit(){
String tSymbol = \"rb888.SHFE\";
TimeStamp startDate= PreTradingDay(tSymbol, CurrentDate, Days);
SubscribeBar(tSymbol, \"1m\", startDate, 0);
}
OnBarOpen(ArrayRef<Integer> indexs){
If(CurrentBar == 0 || TrueDate(0) != TrueDate(1)) ArrayInsert(arrClose20, 0, Open);
If(GetArraySize(arrClose20) > Days) ArrayErase(arrClose20, GetArraySize(arrClose20) - 1, 1);
}
OnBar(ArrayRef<Integer> indexs){
Integer i;
Numeric TodayClose = CloseD(0);
If(Time == 0.145900) arrClose20[0] = TodayClose;
If(BarStatus != 2) Return;
PrintClear;
For i = 0 To Days - 1{
If(i == 0)
If(Time == 0.145900) Print(\"今天 Close = \" + Text(arrClose20[i]));
Else Print(\"今天 Open = \" + Text(arrClose20[i]));
Else Print(\"前\" + Text(i) + \"天 Close = \" + Text(arrClose20[i]));
}
Print(TextArray(arrClose20));
}
改完之后,我发现硬是要使用CloseD的意义不大,上面代码甚至直接平替【Close】和【CloseD】效果一样,所以单纯讲,这个案例,其实不用CloseD代码反而会更加简单。另外使用多图层,跨周期这些方法既省空间也比较简单。
标准答案