说明:pn_viewpoint的主要用途是:对于特殊时点的周期,采用查找交易明细来模拟当时的值,例如历史盘中交易中的日线,月线,周线等等。
它的原理是从交易明细中找数据,所以,对于取数而言,它是存在效率隐患的,我们要在需要它的时候使用,不需要它的时候避免用。
这里我们做一个效率对比的测试,执行下面一段代码,同时在不设置pn_viewpoint与设置pn_viewpoint时的一个运行时长的表现:
Function NoName244();
Begin
//不设置pn_viewpoint()
t1:=getd();
//设置pn_viewpoint()
setsysparam(pn_viewpoint(),20200915.1030T);
//->取消用:setsysparam(pn_viewpoint(),0);
t2:=getd();
return array('不设置Viewpoint':t1,'设置Viewpoint':t2);
End;
function getd();
begin
stocks:=getbk('上证50')[0:9];
setsysparam(pn_date(),20200915T);
setsysparam(pn_cycle(),cy_day());
mtic;
for j:=0 to 999 do
begin
for i:=0 to length(stocks)-1 do
begin
c:=spec(close(),stocks[i]);
v:=spec(vol(),stocks[i]);
end;
end;
return mtoc;
end
//运行结果:
由此可看出,在设置pn_viewpoint()与不设置pn_viewpoint()时取行情数据时,花费时间要多出181倍。其主要原因是,不设置该系统参数时,只需要从日线中找数据,而设置该参数时,则需要从当天的交易明细数据中找数据,所以,当取数次数较为频繁时,我们应避免设置pn_viewpoint()后取行情数据的用法。
那如果我就是想取20200915日这一天截止到10点半的成交价与成交量,要怎么实现呢?
此时我们可以将上面取数的代码变更为如下方式,也可提取到当天截止到这个时点的数据结果,所费时长大约为0.15秒,具体变更如下:
Function NoName245();
Begin
t2:=getd();
return t2;
End;
function getd();
begin
stocks:=getbk('上证50')[0:9];
r:=array();
setsysparam(pn_date(),20200915.1030T);//设置当前时间为预想时间
setsysparam(pn_cycle(),cy_30m());
//设置当前周期为半小时线,可刚好取到10点半这个时点,若是其他时点,可设置更高频的
mtic;
for j:=0 to 999 do
begin
for i:=0 to length(stocks)-1 do
begin
c:=spec(close(),stocks[i]);//最后成交量
v:=spec(sectionvol(),stocks[i]);//截止到当前时间点的成交量
r[i]:=array(stocks[i],c,v);
end;
end;
echo mtoc;
return r;
end