在小周期通过CloseD直接去日线数据为什么不行呢?

老师,我想在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));

}

OpenD,CloseD
CloseD回溯
怎么跨周期使用数据计算呢
Log出来的那容去哪里看呢?
日线周期 CLOSEKLINE
5min调用日线,多周期该如何调用呢?
closed
如何对跨周期的策略进行批量的回测呢?
使用多周期数据做策略时,对小级别K线操作不太理解
Bar 的datetime数据为什么不能像High Low这类数据直接引用呢?

谢谢两位老师,样例代码也挺好的。感谢。

最后我感觉这么处理还是有点复杂,直接使用数据订阅,用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代码反而会更加简单。另外使用多图层,跨周期这些方法既省空间也比较简单。

标准答案