全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
如何在1分钟K线上获取月K线的开盘价?
2024-06-01 08:18

如何在1分钟K线上获取月K线的开盘价?

Phoenix129

我能想到的有3种方法可以实现:

(1)简单易懂,但是需要订阅至少超过1个月以上的1分钟周期的K线数量,所以比较浪费空间。

(2)要跨周期调用,优点是省空间,用多少订阅多少,但是技术上要求掌握跨周期的机制,并且能优化处理各种时间对齐的问题。

(3)单独写一个保存月线开盘价的程序,并每月开盘后执行1次,将月线开盘价保存到数据中心的用户自定义数据中,然后1分钟策略中直接读取调用即可。

前2种方法的测试代码如下,专门选了2个品种,一个有夜盘,一个只有日盘,测试一下:

Params
	Enum<String> Contract([\"苹果\", \"白银\"]);
	Enum<String> Method([\"方法1\", \"方法2\"]); 
	//方法1:单图层:1分钟数据源,缺点:费空间需要加载超过1个月以上的1分钟Bar数据量 优点就是简单易懂
	//方法2:有2个图层的数据源,图层0加载1分钟周期数据源,图层1加载1月周期数据源,优点是省空间,缺点就是跨周期调用,需要时间对齐的能力

Vars
	Series<Numeric> MonthlyOpen;
	
Events
	OnInit(){
		String tmpSymbol;
		TimeStamp BeginDate;
		PrintClear;
		
		If(Contract == \"苹果\") tmpSymbol = \"AP888.CZCE\";
		Else If(Contract == \"白银\") tmpSymbol = \"ag888.SHFE\";
		
		If(Method == \"方法1\"){
			If(IntPart(CurrentDate / 100) - IntPart(CurrentDate / 10000) * 100 == 1){
				BeginDate = (IntPart(CurrentDate / 10000) - 1) * 10000 + 1201;
			}Else{
				BeginDate = (IntPart(CurrentDate / 100) - 1) * 100 + 1;
			}
			SubscribeBar(tmpSymbol, \"1m\", PreTradingDay(tmpSymbol, BeginDate));
		}Else If(Method == \"方法2\"){
			SubscribeBarCounts(tmpSymbol, \"1m\", 1000);
			SubscribeBarCounts(tmpSymbol, \"1mon\", 3);
		}
	}
	
	OnBarOpen(ArrayRef<Integer> indexs){
		If(Method == \"方法1\"){
			If(TrueDate(1) != TrueDate(0)){
				If(IntPart(TrueDate(1) / 100) != IntPart(TrueDate(0) / 100)){
					MonthlyOpen = Open;
				}
			}
		}Else If(Method == \"方法2\"){
			If(IntPart(TrueDate(0) / 100) == IntPart(Data1.Date / 100)) MonthlyOpen = Data1.Open;
		}
	}
	
	OnBar(ArrayRef<Integer> indexs){
		If(MonthlyOpen == 0) Return;
		If(MonthlyOpen == MonthlyOpen[1] && Date + Time != Date[1] + Time[1]) Return;
		
		Print(\"=============\" + DateTimeToString(Date + Time) + \"(1分钟Bar的时间)=============\");
		Print(\"读取月线开盘价 = \" + Text(MonthlyOpen));
	}
2024-06-01 15:17
kyover

楼上给了三种标准答案了

2024-06-03 08:43
您未登录,请先 登录注册 后发表评论
顶部