FAQ > 金融建模 > 应用案例 > 指标或功能实现

Q: 天软中如何实现市场的超大单,大单,中单,小单按分钟汇总的成交金额走势图    

简述
本案例中,对于大小单的判定阀值:
1.小单:小于4万元
2.中单:4-20万元
3.大单:20-100万元
4.超大单:大于100万元
本模型选取成交明细中满足条件并按分钟线汇总成交金额数据
  • 个股实现
    说明: 获取个股指定日分钟线大单成交金额(万)数据
    代码:
    Function Stock_LargeOrderTracking(stockid,endt);
    Begin
    {**
      %% @explain(说明)大单跟踪,返回个股指定日大单跟踪的分钟线数据
            包括:小单:单笔交易明细成交金额<4万元
              中单:单笔交易明细成交金额4-20万元
              大单:单笔交易明细成交金额20-100万元
              小单:单笔交易明细成交金额大于100万元
      %% @param(stiockid)(VarChar) 股票代码
      %% @param(endt)(DateT) 截止日
      %% @return(array) 指定日大单跟踪分钟线数据
    **}
      ov:=BackupSystemParameters2();
      //stockid:="SZ000002";
      //endt:=20210309t;
      tradData:=select ['Date'],
              nil as "交易时间",
              HourOf(["date"]) as 'Hour',
              MinuteOf(["date"]) as 'minute',
              SecondOf(["date"]) as 'second',
              ['amount']/10000. as '成交金额(万)'
           from tradetable datekey endt to endt+16/24 of stockid where ['amount']>0 end;
      if not istable(tradData) then return array();
      tradData[:,array('小单','中单','大单','超大单')]:=0;
      compA:=function(v);
      begin
       case v of
         0 to 4:return '小单';
         4 to 20:return '中单';
         20 to 100:return '大单';
         else return '超大单';
       end;
      end;
      compB:=function(h,m,s);
      begin
       if h=9 and m<31 then m:=31;
       else if s>0 then m++;
       if h>=15 and m>=0 then m:=0;
       if m=60 then (h++,m:=0);
       return EncodeTime(h,m,0,0);
      end
      update tradData set
         ["交易时间"]=timetostr(compB.do(['Hour'],['minute'],['second'])),
         [compA.do(['成交金额(万)'])]=['成交金额(万)'] end;
      tradData:=tradData[:,array('Date','交易时间','小单','中单','大单','超大单')];
      tradData:=select selectopt(16) ['交易时间'],sumof(2 to 5) from tradData group by ['交易时间'] end;
      tradData:= select stockid as 'StockID',* from tradData order by ['交易时间'] end;
      if endt <today() then
       return tradData;
      else return TSDN_DataFormatToPig(tradData);
    End;

    说明: 单日分钟线数据的标准化
    代码:
    Function TSDN_DataFormatToPig(tradData);
    Begin
    {**
      %% @explain(说明)衍生正常交易日的分钟线,把数据于分钟线连接对应,返回完整的日分钟线数据
      %% @param(traddata)(array) 分钟线交易数据
      %% @return(array) 标准化的当前完整日分钟线数据
    **}

      ov:=BackupSystemParameters2();
      setsysparam(PN_Cycle(),cy_1m());
      dt:=select timetostr(TimeOf(["date"])) as "交易时间"
          from markettable datekey 20210305.0930t to 20210305.1530t
          of "SZ000001" end;
      Data:= select [2].*,[1].['交易时间'] from dt left join tradData on ([1].['交易时间'] = [2].['交易时间']) end;
      Data[:,'StockID']:=tradData[0,'StockID'];
      v:=tradData[length(tradData)-1,'交易时间'];
      lastTime:=mfind(dt,mcell=v,false)[0,0];
      Data::=ifnil(mcell)?(mrow>lastTime?nil:0):mcell;
      return Data;
    End;

    实现案例: 获取"万科A"在2021-03-09在市交易的大单明细分钟线走势数据
    案列图形:

    市场实现
    说明: 获取板块指定日分钟线大单成交金额(万)数据
    代码
    Function BK_LargeOrderSummary(bkname,endt,No);
    Begin
    {**
      %% @explain(说明)市场指定日大单数据汇总,选择股票市场板块,按分钟线汇总统计,数据量较大使用网格计算
            包括:小单:单笔交易明细成交金额<4万元
              中单:单笔交易明细成交金额4-20万元
              大单:单笔交易明细成交金额20-100万元
              小单:单笔交易明细成交金额大于100万元
      %% @param(bkname)(VarChar) 板块名称
      %% @param(endt)(DateT) 截止日
      %% @param(endt)(No) 网格数(并发数)
      %% @return(array) 市场大单数据汇总
    **}
      //bkname:="中证800";
      //endt:=20210309t;
      //no:=4;
      stockarr:=getbk(bkname);
      r:=array();
      n:=length(stockarr) div no;
      start:=0;
      for i:=0 to no-1 do
      begin
       if i<>no-1 then
         r[i]:=#Stocks_LargeOrderSummary(stockarr[start:start+n-1],endt);
       else
         r[i]:=Stocks_LargeOrderSummary(stockarr[start:],endt);
       start+=n;
      end
      rt:=array();
      for i:=0 to length(r)-1 do
       rt union=r[i];
      rt:= select ["交易时间"],
            sumof(["超大单"]) as "超大单",
            sumof(["大单"]) as "大单",
            sumof(["中单"]) as "中单",
            sumof(["小单"]) as "小单"
        from rt group by ["交易时间"] order by ["交易时间"] end;
      sd:=today();
      tt:=timetostr(TimeOf(now()));
      if endt=sd then
      begin
       update rt set ["超大单"]=nil where ["交易时间"]>=tt and ["超大单"]=0 end;
       update rt set ["大单"]=nil  where ["交易时间"]>=tt and ["大单"]=0 end;
       update rt set ["中单"]=nil  where ["交易时间"]>=tt and ["中单"]=0 end;
       update rt set ["小单"]=nil  where ["交易时间"]>=tt and ["小单"]=0 end;
      end
      return rt;
    End;

    function Stocks_LargeOrderSummary(stockarr,endt);
    begin
      rt:=array();
      for i:= 0 to length(stockarr)-1 do
      begin
       rt union= Stock_LargeOrderTracking(stockarr[i],endt);
      end
      return rt;
    end

    实现案例: 获取中证800在2021-03-09在市交易的大单明细分钟线走势数据
    案例图形:

    附件函数
    个股:
    附件:Stock_LargeOrderTracking.tslfunc
    时间标准化:
    附件:TSDN_DataFormatToPig.tslfunc
    市场:
    附件:BK_LargeOrderSummary.tslfunc