FAQ > 金融建模 > 第三方交互 > TS-OPI

Q:TSL&OPI方式调用示例:行情订阅    

  • A:本页中主要展示开发者用户通过OPI接口进行行情订阅的实现示例,即使用URI:/Service/Subscription/
    天软通过InternetRequest函数发送数据到服务器进行请求。
    【数据格式】json串,{"Type":1,"IDs":["SZ000001","SH000300"],"SUBs":["date_s","price",...]}
    Type为1表明是行情订阅,IDs字段是订阅的券的ID数组,SUBs字段是订阅的行情数据字段,例如date_s是日期的字符串格式,price是价格。
    下面分别展示普通http请求方式订阅实现SSE(长连接)模式订阅行情、以及订阅结果的解析
    范例01:Tsl中进行行情订阅并通过分段模式进行输出
    代码实现如下:
    //--------开发用户行情订阅:/Service/Subscription/---------------
    url:='https://opi.tinysoft.com.cn/Service/Subscription/'; 
    tbody:=array("Type":1,"IDs":("SH600519","SZ000002"),"SUBs":("date_s","price"));
    body:=ExportJsonString(tbody);
    //TS-BOUNDARY设置分割符
    headArr:=array("Connection: keep-alive","Content-Type: application/json","JSON-Encode: gbk","TS-BOUNDARY: end");
    header:=array2str(headArr,"\r\n");
    sid:=CreateHttpSession();
    sethttpMode(sid,1);//设置chunked模式(分段模式),分段输出模式
    echo "\r\n";
    tuser:="user"; //用户账号
    tpassw:="password"; //用户密码
    while timeof(now())<strtotime("15:30:00") do
    begin
     r:=InternetRequest(sid,url,"",header,body,tuser,tpassw,0,res,resp,30000);
     echo "->r:",r,"->resp:",resp,"->res:",res,"->",roundto(length(res)/1024/1024,2),"\r\n";
    end;
    DestroyHttpSession(sid);//销毁该会话
    return ;
    订阅结果:


    范例02:行情订阅-SSE模式(长连接)
    从2026-05-08发布的平台版本开始,行情订阅支持SSE模式,如果启用SSE模式,则需要在请求的HEADER里加入Accept: text/event-stream。
    注:SSE模式中不支持指定TS-BOUNDARY
    //开发者账号(平台用户)
    //********************Subscription:/Service/Subscription/********************************
    url:='https://opi.tinysoft.com.cn/Service/Subscription/'; //
    tbody:=array("Type":1,"IDs":("SH600519","SZ000002"),"SUBs":("date_s","price"));
    body:=ExportJsonString(tbody);
    //SSE模式---不支持TS-BOUNDARY: end
    headArr:=array("Connection: keep-alive","Content-Type: application/json","JSON-Encode: gbk","Accept: text/event-stream");
    header:=array2str(headArr,"\r\n");
    sid:=CreateHttpSession();
    sethttpMode(sid,1);//设置chunked模式(分段模式),分段输出模式
    tuser:="user"; //用户账号
    tpassw:="password"; //用户密码

    while timeof(now())<strtotime("15:30:00") do
    begin
      r:=InternetRequest(sid,url,"",header,body,tuser,tpassw,0,res,resp,30000);//超时请求连接会中断
      echo "->r:",r,"->resp:",resp,"->res:",res,"\r\n";
    end;
    DestroyHttpSession(sid);//销毁该会话
    return ;

    订阅结果截图:


    示例3:两种订阅请求方式结果串的解析
    通过上面的示例结果展示,可以看出来订阅到的数据res的数据结构是不一样的。
    1、对于普通请求方式(即范例1)的结果,我们可以通过去掉TS-BOUNDARY指定的分割符之后,直接将json串转换成天软数组,即可增加转换逻辑如下:
    subData:=Importjsonstring(res[1:(length(res)-3)]);//去掉Boundary串"end"

    生成结构如下,其中subData["CmdData"]即为订阅到的行情数据表格。
    array("CmdType":"Quotations","CmdData":
    (
    ("ID":"SH600519","date_s":"2026-06-05 11:11:14","price":1271.52),
    ("ID":"SZ000002","date_s":"2026-06-05 11:11:15","price":3.26)))

    2、SSE模式请求下,接收到的结果中除了订阅到的行情数据外,还包括比如事件类型等数据。
    数据结构相对普通请求稍微复杂一点,具体处理方式可参考:FAQ:Q:TSL&OPI-SSE模式请求结果的解析