如何在1分钟K线上获取月K线的开盘价?
楼上给了三种标准答案了
我能想到的有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));
}