如何在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)); }
楼上给了三种标准答案了
我能想到的有3种方法可以实现:
(1)简单易懂,但是需要订阅至少超过1个月以上的1分钟周期的K线数量,所以比较浪费空间。
(2)要跨周期调用,优点是省空间,用多少订阅多少,但是技术上要求掌握跨周期的机制,并且能优化处理各种时间对齐的问题。
(3)单独写一个保存月线开盘价的程序,并每月开盘后执行1次,将月线开盘价保存到数据中心的用户自定义数据中,然后1分钟策略中直接读取调用即可。
前2种方法的测试代码如下,专门选了2个品种,一个有夜盘,一个只有日盘,测试一下:
楼上给了三种标准答案了