FAQ > 金融建模 > 建模问题 > 其他

Q:如何实现盘中监控    

简述
盘中定时刷新行情数据的实现
  • 说明:SendRunningData、Sleep 的监控应用,与 while do 语句结合构成简单的监控程序应用,实现盘中监控的功能。其结构如下:
    while 条件 do
    Begin
    构造监控数据 Data;
    sendrunningdata(Data);//输出数据
    Sleep(1000*N); //暂停 N 秒
    End;

    应用案例:
    //实时返回选定股票的盘中信息 
    stocks:=array("SH600000","SH600004","SH600009","SH600010","SH600011","SH600015",
    "SH600016","SH600018","SH600019");
    T0:=strtotime('15:01:00'); //收盘时间点
      //盘前处理
    Arr:=select thisrow as '代码',stockname(thisrow) as '名称' from stocks end;
    while timeof(now())<T0 do
    begin//盘中取数
      for i:=0 to length(Arr)-1 do
      begin
        setsysparam(pn_stock(),Arr[i]['代码']);
        Arr[i,'当前价']:=rd(6);
        Arr[i,'5分钟涨幅(%)']:=rd(9);
        Arr[i,'当前成交金额']:=rd(7);
      end
      sendrunningdata(Arr); //返回数据
      sleep(5*1000);    //5秒刷一次
    end
    return '非交易时间段';
    弹出对话框:
      TCDStr:='需要预警时显示的内容,比如:
      AAA:1234
      BBB:2344';
      bstr:="MessageBox('"$TCDStr$"','预警信息',mb_YesNo().| mb_SystemModal());";
      SendToClient("do",bstr,nil,array(),10);
      return 1;
    //显示结果:


    注:由于上述使用的是执行命令但不等待返回结果的do模式,在该种模式下客户机对话框等待并不阻塞服务端程序的运行。

    1、上面这种模式中弹出对话框不会影响主程序继续向下运行。
    2、当主程序中有多次发送客户端事件(如弹出对话框、echo、return等)时,由于客户端事件需要排队处理,因此,当如对话框之类的事件,需要用户进行点击进入下一步,完成事件后,再处理下一条事件。
    因此,此过程中,会产生感觉程序出现了阻塞的理解错误现象。

    另外,对话框弹出后,没有自动关闭等功能,需要用户手动关闭窗口。
    盘中监控-预警方式-弹出对话框案例:
    Function DoYuJInInRD();
    Begin
      //实时返回选定股票的盘中信息
      stocks:=array("SH600000","SH600004","SH600009","SH600010","SH600011","SH600015","SH600016","SH600018","SH600019");
      T0:=strtotime('15:01:00'); //收盘时间点
      //盘前处理
      Arr:=select thisrow as '代码',stockname(thisrow) as '名称' from stocks end;
      while timeof(now())<T0 do
      begin
        for i:=0 to length(Arr)-1 do
        begin
         setsysparam(pn_stock(),Arr[i]['代码']);
         Arr[i,'当前价']:=rd(6);
         Arr[i,'5分钟涨幅(%)']:=RoundTo(rd(9),-3);
         Arr[i,'成交金额']:=rd(7);
        end
    //---预警实现
        // 5分钟涨幅(%)大于1的弹出预警消息
        t:=select ['代码'],['5分钟涨幅(%)'],['成交金额'] from Arr where ['5分钟涨幅(%)']>-0.5 end;
       //编辑显示串
        mst:=mcols(t,1);
        Tstr:='';
        for j:=0 to length(t)-1 do
        begin
          for i:=0 to length(mst)-1 do
           Tstr:=Tstr+mst[i]+':'+tostn(t[j,mst[i]])+' ';
          Tstr+='\r\n';
        end
        if trim(Tstr)<>'' then//执行预警提示
         doMessgeBox(Tstr);
        sendrunningdata(Arr); //返回数据 -程序不结束
        sleep(5*1000);    //5秒刷一次
      end
      return '非交易时间段';
    End;
    function doMessgeBox(TCDStr);//弹出对话框
    begin
    //TCDStr为字符串
       bstr:="MessageBox('"$TCDStr$"','预警信息',mb_YesNo().| mb_SystemModal());";
       SendToClient("do",bstr,nil,array(),10);
    end
    //结果展示