A:SectionPrevClose()在取系统昨收数据时,特别是在设置高频行情的情况下,执行效率相对于close()等常见指标表现会比较慢。
原因:天软的日线行情数据表格中实际没有存储该字段(sectional_yclose)数据,该数据实际存储在交易明细表中,在提取日线的该字段数据时,是从交易明细数据表中进行查找,所以用户取其它周期行情时也能返回该字段数据。
实际上,对于系统昨收,该数据一天只有一个值。但由于存储在交易明细中,数据量超大,导致大量提取时表现较慢。
优化现状:考虑到该字段数据的重要性,天软对于日线下的该指标的提取进行了效率优化,取数效率与close()等差不多。而高频周期下还保留着历史用法。
注意事项及解决办法:
1、用户需要避免在设置高频周期时对该字段进行大量调用。
2、实际中高频下取该字段意义并不大,结果等同于日线下的该值,所以用户可以将之转换成日线,或在需求合理的情况下考虑用sys_preclose()等方式替代。
优化效率的展示:
示例01:日线下效率的对比
stocks:=getbk("创业板");
setsysparam(pn_cycle(),cy_day());//cy_15m()
Tarr:=MarketTradeDayQk(20220201T,20220220T);
for j:=0 to length(Tarr)-1 do
begin
setsysparam(pn_date(),Tarr[j]);
for i:=0 to length(stocks)-1 do
begin
setsysparam(pn_stock(),stocks[i]);
s:=SectionPrevClose();
c:=close();
c2:=sys_prevclose();
end
end
return 1;
时间消耗:
由运行的时间可以看出,SectionPrevClose()与close、sys_prevclose()花费的时间差不多,效率非常高。
说明SectionPrevClose()在日线情况下是不存在效率问题的。
示例02:高频周期下效率的对比
优化前:取15分钟线下创业板的昨收
stocks:=getbk("创业板");
setsysparam(pn_cycle(),cy_15m());//15分钟线
Tarr:=MarketTradeDayQk(20220201T,20220210T);
for j:=0 to length(Tarr)-1 do
begin
setsysparam(pn_date(),Tarr[j]);
for i:=0 to length(stocks)-1 do
begin
setsysparam(pn_stock(),stocks[i]);
s:=SectionPrevClose();
c:=close();
c2:=sys_prevclose();
end
end
return 1;
时间消耗:
相对于close()的0.04秒,SectionPrevClose()需要48秒才完成,效率非常低。
优化后:
stocks:=getbk("创业板");
setsysparam(pn_cycle(),cy_15m());//15分钟线
Tarr:=MarketTradeDayQk(20220201T,20220210T);
for j:=0 to length(Tarr)-1 do
begin
setsysparam(pn_date(),Tarr[j]);
for i:=0 to length(stocks)-1 do
begin
setsysparam(pn_stock(),stocks[i]);
//设置为日线后提取昨收
s:=Specall(SectionPrevClose(),array(pn_cycle():cy_day()));
c:=close();
c2:=sys_prevclose();
end
end
return 1;
时间消耗:
结论:在优化前后,调用次数相同,且close()等函数所消耗的时间都差不多,都在0.04秒左右的情况下,
而SectionPrevClose()消耗的时间由48秒缩减为0.01秒,效率得到了大大的优化。
即,在高频环境下,临时设置为日线后提取昨收,可以很好地提高SectionPrevClose()的取数效率。