FAQ > 金融建模 > 数据提取 > 行情数据提取

Q:仿真模式pn_viewpoint的正确使用方式    

  • 说明: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