FAQ > 金融建模 > 应用案例 > 图形实现

Q:时间轴|数据点不对等的情况下,K线与折线组合图形的实现    

【简述】天软组合图形要求单个图形的横轴点数是一致的。
所以当要实现数据点不对等的图形进行组合时,需要将时间补齐才行。
一般我们的处理方法是:
   当画连续性图线时,比如折线图,就需要补齐每个点的数据值
   当画非连续性图形时,比如标记等,不画图的地方给数值nil

所以,在本需求中,我们需要补足折线上的数据点才可以。折线上数据点的补充,我们可以通过下边方法实现:
在只有线段的起点和终点,或者折线图拐点的情况下,通过计算线段斜率,得到线段上每个点的坐标,即折线图数组数据。把折线图和K线图在天软终端上一起绘制。
  • 实现
      使用价格分段算法对历史K线分割,得到每个分割点的日期时间和价格,用这个数据作为拐点,在K线图上绘制出折线图。
      在天软终端上绘制折线图需要给出线段上每个点的坐标,下面的范例在仅有折线图拐点的情况下,以相邻的两个拐点作为线段的起点和终点,通过计算线段的斜率,得到每个点的坐标。
      其中价格分段算法参见:FAQ:2021-02-02-应用专题-价格分段:常见价格分段算法及其实现

    Function linechart();
    Begin

      //对历史K线图分段,提取每段图形之间的拐点
      Setsysparam(pn_Stock(),"SZ000002");
      Setsysparam(Pn_Cycle(),cy_day());
      begt:=20200801T;
      Endt:=20200930T;
      PriceDivide:=StockPriceDivideByKLine(begt,Endt,0);

      //提取绘制K线图所需的数据
      setsysparam(pn_date(),Endt);
      setsysparam(pn_nday(),tradedays(begt,endt));
      t1:=NDay2(
              gfopen(),  Open() ,
              gfclose(), close(),
              gfhigh(),  high(),
              gflow(),   low(),
              gftime(),  sp_time(),
              gfColor(), IfThen3(Close(),Open(),ClRed(),clYellow(),ClLime()),
              gffill(),ifThen3(Close(), Open(), flClear(), flSolid(),flSolid())
             );

      //K线图数据与分段拐点数据合并
      t2:=select [1].['time'],[2].['价格'] from t1 left join PriceDivide
            on [1].['time']=[2].['截止日'] end;

      //填充拐点之间的价格数据,用于绘制折线图
      datafill(t2,'价格');
      t2:=select datetimetostr(['time']) as 'time',['价格'] from t2 end;

      //图形绘制
      g1:=graph(gtKline(),'KLine',t1);
      g2:=graph(gtline(),'价格',t2,gfColor(),clYellow());
      return graphgroup(g2,g1);
    end

    function datafill(table,colname)
    begin
    {
      以相邻的两个拐点作为线段的起点和终点,通过计算线段的斜率得到
      线段上每个点的坐标(这个范例的坐标为每个时间点对应的价格);
    }
      last1:=-1;
      for i:=0 to length(table)-1 do
      begin
        if ifnil(table[i][colname]) then continue;
        if last1=-1 then
        begin
          last1:=i;
          continue;
        end
        //计算斜率
        table[last1:i,'k']:=(table[i][colname]-table[last1][colname])/(i-last1);
        table[last1:i,'y0']:=table[last1][colname];
        table[last1:i,'x0']:=last1;
        last1:=i;
      end;
      //计算线段上每个时间点对应的价格
      update table set [colname]=(['k']*(thisrowindex-['x0'])+['y0'])
        where ifnil([colname]) and not ifnil(['x0']) end;
    end

    返回结果: