60 KiB
天软 pyTSL 接口使用说明
文档类型:模块 API 事实页 是否可直接用于生成代码:是,但真实账号、密码、服务地址、配置文件路径和权限范围必须来自项目上下文 遇到不确定时:index.md、项目自身部署文档、官方 pyTSL 接口文档
本页整理 pyTSL 官方 Python SDK 的可调用接口。它负责告诉智能体“pyTSL 有哪些类、函数、参数和返回结构”,不负责提供真实凭证、项目账号来源、服务权限或业务数据口径。
智能体 pyTSL 决策规则
- 用户要“用 Python 调 TSL / 执行 TSL 代码 / 调天软函数 / 查行情 / 并发或异步取数”时,优先使用本页。
- 用户只是要执行一段 TSL 并马上拿结果,默认使用
pyTSL.Client.exec()。 - 用户要调用服务器上已有 TSL 函数,默认使用
pyTSL.Client.call()。 - 用户要按证券、周期、开始时间、结束时间取标准行情字段,默认使用
pyTSL.Client.query()。 - 用户要一次性提交很多独立任务,先考虑
pyTSL.Batch;不要把大量循环直接写成频繁登录、退出。 - 用户明确要求 asyncio,才使用
pyTSL.AsyncClient或pyTSL.async_util。 - 不要发明真实账号、密码、服务地址、代理、配置文件路径、服务节点、字段名或业务函数名。
- 不要把登录脚本、临时验证脚本或私有凭证写进生成代码;示例只能使用占位值或从项目配置读取。
安装与支持范围
包与导入
| 项目 | 事实 |
|---|---|
| 安装包名 | tspytsl |
| 导入模块名 | pyTSL |
| 在线安装 | pip install tspytsl |
| 升级 | pip install tspytsl -U |
| 离线安装 | 下载对应 .whl 后执行 pip install 文件名.whl |
| 手动安装 | 解压对应平台的 .pyd 或 .so,放入 Python 的 site-packages 或项目目录 |
Python 与平台
- pyTSL 支持 Python 3.6+。
- 官方文档截至 2025-10-13 列出 Python 3.6 到 3.14 的 Windows、Linux x86_64、Linux arm64、MacOS x86_64 支持。
- MacOS arm64 从 Python 3.8 到 3.14 支持,Python 3.6 和 3.7 不支持。
- Windows 需要确认已安装 VS2019 C++ 运行时库;其他系统不需要这一步。
最小同步链路
优先写成“一次登录,多次交互,最后退出”。logout() 后再次调用 Client 方法可能触发自动重新登录,频繁登录退出可能占用多个登录数。
import pyTSL
from datetime import datetime
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
try:
if c.login() == 0:
raise RuntimeError(c.last_error())
r = c.exec("return close();", stock="SZ000002", time=datetime(2024, 7, 30))
if r.error():
raise RuntimeError(r.message())
value = r.value()
finally:
c.logout()
pyTSL.Client
同步客户端。构造一个 Client 会占用一个登录数。
构造函数:账号参数方式
签名:
pyTSL.Client(user, password, ip, port, proxy_ip=None, proxy_port=None, proxy_user=None, proxy_password=None)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | user |
是 | str |
天软账号 |
| 2 | password |
是 | str |
天软账号密码;支持用客户端工具生成的加密密码字符串 |
| 3 | ip |
是 | str |
天软服务器机群地址 |
| 4 | port |
是 | int |
天软服务器访问端口 |
| 5 | proxy_ip |
否 | str |
代理服务器地址 |
| 6 | proxy_port |
否 | int |
代理服务器端口 |
| 7 | proxy_user |
否 | str |
代理服务器验证账号 |
| 8 | proxy_password |
否 | str |
代理服务器验证密码 |
常见服务器:
| 服务器 | ip |
port |
默认服务节点 |
|---|---|---|---|
| 深圳服务器 | "tsl.tinysoft.com.cn" |
443 或 444 |
"正式版" |
| 武汉服务器 | "wh.tinysoft.com.cn" |
443 或 444 |
"Default Service" |
| 深圳新节点服务器 | "sznew.tinysoft.com.cn" |
4433 |
"Default Service" |
构造函数:ini 文件方式
签名:
pyTSL.Client(ini_file)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | ini_file |
是 | str |
连接服务器信息 .ini 文件的绝对路径 |
ini 文件字段:
user=
password=
ip=
port=
proxy_user=
proxy_password=
proxy_ip=
proxy_port=
路径含中文并报找不到文件时,可把路径按 GBK 编码后传入。
Client 方法总表
| 方法 | 签名 | 返回 | 用途 |
|---|---|---|---|
login |
login() |
bool |
登录天软服务器;成功 1,失败 0 |
last_error |
last_error() |
list |
最近一次错误,结构为 [错误代码, 错误信息] |
logout |
logout() |
int |
断开连接;成功 0 |
exec |
exec(code, **kwargs) |
TSResultValue |
执行 TSL 代码串 |
call |
call(funcname, *args, **kwargs) |
TSResultValue |
调用 TSL 函数 |
query |
query(**kwargs) |
TSResultValue |
提取行情数据 |
list_bgrun |
list_bgrun() |
list |
列出委托执行任务 |
stop_bgrun |
stop_bgrun(handle) |
int |
停止指定委托执行任务;成功 1 |
admin |
admin(**kwargs) |
str |
执行天软客户端任务管理命令 |
set_callback |
set_callback(function) |
未说明 | 设置 rdo2 回调函数 |
default_service |
default_service(service) |
str |
设置或返回默认服务节点 |
server_list |
server_list() |
list |
返回服务节点列表 |
download_list |
download_list(type, timeout=0) |
list |
下载指定类型列表 |
download |
download(type, key, ver=0, timeout=0) |
list |
下载指定关键字内容 |
upload |
upload(type, key, data, timeout=0) |
list |
上传数据至指定关键字 |
remove |
remove(type, key, timeout=0) |
list |
删除指定关键字内容 |
is_logined |
is_logined() |
bool |
已登录返回 1,未登录返回 0 |
is_closed |
is_closed() |
bool |
已断开返回 1,未断开返回 0 |
exec(code, **kwargs)
执行 TSL 代码串。结果通过 TSResultValue 读取。
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | code |
是 | str |
要执行的 TSL 代码串 |
| 2 | **kwargs |
否 | 见下表 | 执行上下文属性 |
call(funcname, *args, **kwargs)
调用 TSL 函数。*args 会自动转换常见 Python 类型到 TSL 类型。
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | funcname |
是 | str |
函数名 |
| 2 | *args |
否 | float / int / bool / str / bytes / list / dict / tuple / pandas.DataFrame / numpy.ndarray / 日期时间类型 |
传给 TSL 函数的位置参数 |
| 3 | **kwargs |
否 | 见下表 | 执行上下文属性,可通过 code 传入临时函数定义 |
Python 到 TSL 的自动转换:
| Python 类型 | TSL 类型 |
|---|---|
float / numpy.float32 / numpy.float64 / datetime / numpy.datetime64 |
real / tdatetime |
bool / int / numpy.int32 / numpy.int64 |
int |
str / bytes |
str |
list / dict / tuple / pandas.DataFrame / numpy.ndarray |
array |
exec / call 共享 kwargs
| 参数名 | 必填 | 接收类型 | 默认值 | 说明 |
|---|---|---|---|---|
stock |
否 | str |
None |
当前股票代码,如 "SZ000002" |
cycle |
否 | str |
"日线" |
当前周期 |
time |
否 | datetime / int / float / str |
今天 | 当前时间,如 datetime(2019, 10, 1)、43739.0、20191001、"2019-10-01 14:03:01" |
rate |
否 | int |
0 |
复权方式:0 不复权,1 比例复权,2 复杂复权 |
rateday |
否 | datetime / int / float / str |
0 |
复权基准日:0 最后交易日,-1 上市日,其他值为指定基准日 |
precision |
否 | int |
-1 |
浮点数精度 |
viewpoint |
否 | datetime / int / float / str |
0 |
仿真时点 |
code |
否 | str |
None |
临时定义函数代码段,不必先保存到服务器 |
service |
否 | str |
由登录服务器决定 | 指定执行服务节点 |
timeout |
否 | int |
None |
超时,单位毫秒;None 表示无超时时限 |
bgrun |
否 | int |
0 |
委托执行;1 表示委托执行 |
resultname |
否 | str |
None |
仅 exec 支持;bgrun=1 时用于指定委托保存的结果集名称 |
reportmode |
否 | int |
-1 |
报表数据规则 |
emptymode |
否 | int |
0 |
空记录模式 |
query(**kwargs)
提取行情数据。适合标准证券、周期、时间区间、字段查询。
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | **kwargs |
是 | 见下表 | 查询属性,必须包含 stock、cycle、begin_time、end_time |
| 参数名 | 必填 | 接收类型 | 默认值 | 说明 |
|---|---|---|---|---|
stock |
是 | str / 一维数组 |
None |
当前股票代码;可指定多只股票 |
cycle |
是 | str |
"日线" |
当前周期 |
begin_time |
是 | datetime / int / float / str |
None |
数据开始时间 |
end_time |
是 | datetime / int / float / str |
None |
数据结束时间 |
fields |
否 | str / tuple / list |
所有字段 | 查询字段;字符串用逗号分隔 |
rate |
否 | int |
0 |
复权方式:0 不复权,1 比例复权,2 复杂复权 |
rateday |
否 | datetime / int / float / str |
0 |
复权基准日 |
precision |
否 | int |
-1 |
浮点数精度 |
viewpoint |
否 | datetime / int / float / str |
0 |
仿真时点 |
service |
否 | str |
由登录服务器决定 | 指定执行服务节点 |
timeout |
否 | int |
None |
超时,单位毫秒 |
cyclefilter |
否 | int |
0 |
周期过滤器以及集合竞价分离器 |
委托、任务管理和服务节点方法
list_bgrun()
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 无 | 无 | 否 | 无 | 不接收参数 |
返回 ["+OK", [委托任务1], ...]。委托任务结构为 [handle, 执行的函数名, 开始执行时间, 已运行时间]。
stop_bgrun(handle)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | handle |
是 | float |
委托任务编号 |
返回整数,成功为 1。
admin(**kwargs)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | **kwargs |
是 | str |
天软客户端任务管理命令,如 "oa"、"ou" |
返回对应指令的查询信息。
set_callback(function)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | function |
是 | Python 可调用对象 | 设置 rdo2 回调函数 |
rdo2 callback(...) 调用时会回到 Python 函数;不要把已经通过 register_proc 注册过的函数再当作该回调。
default_service(service)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | service |
否 | str |
为空时返回当前服务节点;非空时设置当前服务节点 |
返回字符串,内容为服务节点。
server_list()
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 无 | 无 | 否 | 无 | 不接收参数 |
返回服务节点列表。
下载、上传和删除
类型取值
| 类型值 | 可用于 | 说明 |
|---|---|---|
0x2001 |
download_list / download |
系统板块 |
0x2002 |
download_list / download / upload / remove |
用户板块 |
0x5001 |
download_list / download |
系统基本面表描述 |
0x6001 |
download_list / download / upload / remove |
用户函数 |
0x6002 |
download_list / download |
共享函数 |
0x6003 |
download_list / download |
系统公用函数 |
0x6004 |
download_list / download |
系统函数 |
0x8001 |
download_list / download / upload / remove |
用户数据表 |
download_list(type, timeout=0)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | type |
是 | int |
指定类型 |
| 2 | timeout |
否 | int |
超时,单位毫秒;默认 0 表示无超时限制 |
返回长度为 2 的列表。无错误返回 [0, 结果列表],有错误返回 [错误代码, 错误信息]。结果列表中的单项结构为 [关键字, 版本, 修改时间]。
download(type, key, ver=0, timeout=0)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | type |
是 | int |
指定类型 |
| 2 | key |
是 | str |
关键字,如函数名、板块名 |
| 3 | ver |
否 | int |
关键字版本;默认 0 表示最新版本 |
| 4 | timeout |
否 | int |
超时,单位毫秒;默认 0 表示无超时限制 |
无错误返回 [0, 结果],有错误返回 [错误代码, 错误信息]。结果结构包含:
| 键 | 说明 |
|---|---|
"data" |
关键字内容,TSL 流格式,可用 pyTSL.DecodeStream() 转换 |
"LastModified" |
版本 |
"LastTime" |
修改时间 |
upload(type, key, data, timeout=0)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | type |
是 | int |
只支持 0x2002、0x6001、0x8001 |
| 2 | key |
是 | str |
关键字,如函数名、板块名、用户数据名 |
| 3 | data |
是 | Any |
上传至关键字的数据 |
| 4 | timeout |
否 | int |
超时,单位毫秒;默认 0 表示无超时限制 |
无错误返回 [0, 结果],有错误返回 [错误代码, 错误信息]。
remove(type, key, timeout=0)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | type |
是 | int |
只支持 0x2002、0x6001、0x8001 |
| 2 | key |
是 | str |
关键字,如函数名、用户数据名 |
| 3 | timeout |
否 | int |
超时,单位毫秒;默认 0 表示无超时限制 |
无错误返回 [0, 结果],有错误返回 [错误代码, 错误信息]。
pyTSL.AsyncClient
异步客户端,适用于 Python asyncio。与 Client 一样会占用登录数;异步任务数量受账号并发数限制,普通账号常见并发数为 5,应保留资源。
构造方式同 Client:
pyTSL.AsyncClient("user", "password", "tsl.tinysoft.com.cn", 443)
pyTSL.AsyncClient("E:\\my.ini")
也支持空构造后复用已有 Client:
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
ac = pyTSL.AsyncClient()
ac.c = c
| 方法 | 签名 | 返回 | 参数来源 |
|---|---|---|---|
login |
login() |
bool |
无参数;成功 1,失败 0 |
logout |
logout() |
int |
无参数;成功 0 |
exec |
exec(code, **kwargs) |
TSResultValue |
同 Client.exec |
call |
call(funcname, *args, **kwargs) |
TSResultValue |
同 Client.call |
query |
query(**kwargs) |
TSResultValue |
同 Client.query |
admin |
admin(**kwargs) |
str |
同 Client.admin |
download_list |
download_list(type, timeout=0) |
list |
同 Client.download_list |
download |
download(type, key, ver=0, timeout=0) |
list |
同 Client.download |
upload |
upload(type, key, data, timeout=0) |
list |
同 Client.upload |
remove |
remove(type, key, timeout=0) |
list |
同 Client.remove |
task_list |
task_list() |
list |
返回异步任务列表 |
task_cancel |
task_cancel(task) |
int |
取消异步任务;成功 1,失败 0 |
最小异步示例:
import asyncio
import pyTSL
from datetime import datetime
async def main():
c = pyTSL.AsyncClient("user", "password", "tsl.tinysoft.com.cn", 443)
try:
if await c.login() == 0:
raise RuntimeError("login failed")
r = await c.exec("return close();", stock="SZ000002", time=datetime(2024, 7, 30))
if r.error():
raise RuntimeError(r.message())
return r.value()
finally:
await c.logout()
value = asyncio.run(main())
pyTSL.async_util
async_util 把普通 Client 的操作包装为可 await 的函数。所有函数第一个参数都是 pyTSL.Client 实例。
| 函数 | 签名 | 返回 | 对应同步方法 |
|---|---|---|---|
async_login |
async_login(c) |
bool |
c.login() |
async_logout |
async_logout(c) |
int |
c.logout() |
async_exec |
async_exec(c, code, **kwargs) |
TSResultValue |
c.exec(...) |
async_call |
async_call(c, funcname, *args, **kwargs) |
TSResultValue |
c.call(...) |
async_query |
async_query(c, **kwargs) |
TSResultValue |
c.query(...) |
async_admin |
async_admin(c, **kwargs) |
str |
c.admin(...) |
async_download_list |
async_download_list(c, type, timeout=0) |
list |
c.download_list(...) |
async_download |
async_download(c, type, key, ver=0, timeout=0) |
list |
c.download(...) |
async_upload |
async_upload(c, type, key, data, timeout=0) |
list |
c.upload(...) |
async_remove |
async_remove(c, type, key, timeout=0) |
list |
c.remove(...) |
pyTSL 全局方法
DatetimeToDouble(datetime, timezone=8)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | datetime |
是 | datetime.date / datetime.datetime |
Python 日期或日期时间 |
| 2 | timezone |
否 | int |
时区,默认 8,即北京时间 |
返回 TSL 的时间类型 TDateTime,精度到毫秒。
DoubleToDatetime(t)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | t |
是 | TDateTime / float |
TSL 时间类型 |
返回 Python datetime,精度到毫秒。
DataFrameDiff(df1, df2)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | df1 |
是 | pandas.DataFrame |
第一个 DataFrame,结构需与 df2 一致 |
| 2 | df2 |
是 | pandas.DataFrame |
第二个 DataFrame,结构需与 df1 一致 |
返回两个 DataFrame 的不同数据以及行列位置。
EncodeStream(obj)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | obj |
是 | Python 变量 | 要转换的 Python 对象 |
返回 TSL 流格式。
DecodeStream(bytes, parse_date=False)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | bytes |
是 | TSL 流格式 | 要解码的 TSL 流 |
| 2 | parse_date |
否 | bool / list / tuple |
是否把日期字段转成 Python datetime |
parse_date 取值:
| 取值 | 说明 |
|---|---|
False |
默认值,不转换,TSL TDateTime 保持实数 |
True |
将 TSL TDateTime 或日期字符串转换为 Python datetime |
["date"] / ("date",) |
只转换指定字段 |
返回 Python 变量。
register_proc(funcname1, funcname2)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | funcname1 |
是 | str |
TSL 本地调用时使用的名称 |
| 2 | funcname2 |
是 | Python 可调用对象 | Python 中定义的函数 |
将 Python 函数注册为天软函数,可在交互语句中用 rdo2 调用。importfile 和 exportfile 已有默认实现,不要注册同名函数。
DataFrameToTSArray(DataFrame)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | DataFrame |
是 | pandas.DataFrame |
要转换的 DataFrame |
返回 TSL 的 array 数据结构。Client.call() 传入 DataFrame 时也会自动转换。
start_network_threads(n)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | n |
是 | int |
额外启动的网络 IO 处理线程数 |
返回 None。pyTSL 默认有 1 个线程处理网络 IO;多连接场景可以增加线程。
pyTSL.Batch
用于并发执行多个天软任务,只占用一个登录数。并发数受账号资源限制,不是越大越好;普通账号常见并发数为 5,建议保守设置。
构造函数
签名:
pyTSL.Batch(parallel=5, reconnect=0)
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | parallel |
否 | int |
并行任务数,默认 5 |
| 2 | reconnect |
否 | int |
是否重新连接;0 不重新连接,1 重新连接,默认 0 |
Batch 方法
| 方法 | 签名 | 返回 | 说明 |
|---|---|---|---|
exec |
exec(client, code, **kwargs) |
list |
并发执行 TSL 代码串 |
call |
call(client, functionname, *args, **kwargs) |
list |
并发调用 TSL 函数 |
query |
query(client, **kwargs) |
list |
并发查询行情数据 |
__len__ |
__len__() |
int |
通过 len(iter(batch)) 返回迭代器中剩余元素个数 |
Batch.exec() 参数:
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | client |
是 | pyTSL.Client |
已构造的客户端实例 |
| 2 | code |
是 | str |
TSL 代码串 |
| 3 | **kwargs |
否 | 见 Client.exec |
不支持委托执行;额外支持 key |
Batch.call() 参数:
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | client |
是 | pyTSL.Client |
已构造的客户端实例 |
| 2 | functionname |
是 | str |
TSL 函数名 |
| 3 | *args |
否 | 见 Client.call |
传给 TSL 函数的位置参数 |
| 4 | **kwargs |
否 | 见 Client.call |
不支持委托执行;额外支持 key |
Batch.query() 参数:
| 参数位置 | 参数名 | 必填 | 接收类型 | 说明 |
|---|---|---|---|---|
| 1 | client |
是 | pyTSL.Client |
已构造的客户端实例 |
| 2 | **kwargs |
是 | 见 Client.query |
不支持委托执行;额外支持 key |
key 参数:
| 参数名 | 必填 | 接收类型 | 默认值 | 说明 |
|---|---|---|---|---|
key |
否 | str |
"" |
标识每个任务;也可通过返回的 Task.key(str) 设置 |
返回结构:
| 情况 | 返回 |
|---|---|
| 提交成功 | [1, Task对象] |
| 提交失败 | [0, 错误信息字符串] |
结果读取:
for r in iter(batch):
print(r.key(), r.value())
遍历时每个 r 是 TSResultValue。
pyTSL.Task
Batch 执行任务的标识。
| 方法 | 签名 | 返回 | 说明 |
|---|---|---|---|
id |
id() |
int |
返回任务 ID |
key |
key(str=None) |
str |
有参数时设置关键字;无参数时返回当前关键字 |
TSResultValue
Client.exec()、Client.call()、Client.query()、异步方法和 Batch 迭代结果都会返回或产出 TSResultValue。
| 方法 | 签名 | 返回 | 说明 |
|---|---|---|---|
error |
error() |
int |
0 表示无错误,非 0 表示出错 |
message |
message() |
str |
有错误时返回错误信息,无错误时为空 |
value |
value(parse_date=False) |
list / 标量 / 对象 |
返回结果值 |
dataframe |
dataframe() |
pandas.DataFrame |
输出 DataFrame;相当于把 value() 转表 |
stream |
stream() |
TSL 流格式 | 返回 TSL 流格式结果 |
stn |
stn() |
str |
返回 TSL STN 格式结果 |
key |
key() |
str |
返回任务关键字,配合 Batch 使用 |
cancelled |
cancelled() |
bool |
返回任务是否被取消 |
value(parse_date=...):
| 取值 | 说明 |
|---|---|
False |
默认值,不转换日期,TSL TDateTime 保持实数 |
True |
将一维数组或单个值中的 TSL 日期时间、日期字符串转换为 Python datetime;query() 的默认行为是转换日期 |
["date1", "date2"] / ("date1", "date2") |
对二维数组或表格中的指定日期字段做转换 |
推荐错误处理:
r = c.exec("return 1 + 1;")
if r.error():
raise RuntimeError(r.message())
value = r.value()
pyTSL.Const
常量模块包含周期、行情字段、文件导入导出类型和文件读写类型。导入方式:
from pyTSL.Const import *
周期常量
| 常量 | 对应值 |
|---|---|
cy_month |
"月线" |
cy_day |
"日线" |
cy_week |
"周线" |
cy_quarter |
"季线" |
cy_halfyear |
"半年线" |
cy_1m |
"1分钟线" |
cy_2m |
"2分钟线" |
cy_3m |
"3分钟线" |
cy_5m |
"5分钟线" |
cy_10m |
"10分钟线" |
cy_15m |
"15分钟线" |
cy_20m |
"20分钟线" |
cy_30m |
"30分钟线" |
cy_40m |
"40分钟线" |
cy_60m |
"60分钟线" |
cy_120m |
"120分钟线" |
cy_detail |
"成交明细" |
cy_halfs |
"半秒线" |
cy_1s |
"1秒线" |
cy_2s |
"2秒线" |
cy_3s |
"3秒线" |
cy_4s |
"4秒线" |
cy_5s |
"5秒线" |
cy_6s |
"6秒线" |
cy_10s |
"10秒线" |
cy_12s |
"12秒线" |
cy_15s |
"15秒线" |
cy_20s |
"20秒线" |
cy_30s |
"30秒线" |
cy_f30m |
"期货30分钟线" |
cy_f60m |
"期货60分钟线" |
行情字段常量
| 常量 | 字段值 | 说明 |
|---|---|---|
STOCKID |
"StockID" |
股票代码 |
STOCKNAME |
"StockName" |
股票名称 |
DATE |
"date" |
当前时间 |
PRICE |
"price" |
价格 |
CLOSE |
"close" |
收盘价 |
OPEN |
"open" |
开盘价 |
HIGH |
"high" |
最高价 |
LOW |
"low" |
最低价 |
VOL |
"vol" |
成交量 |
AMOUNT |
"amount" |
成交金额 |
CJBS |
"cjbs" |
成交笔数 |
YCLOSE |
"yclose" |
上次价 |
SYL1 |
"syl1" |
市盈率 1 |
SYL2 |
"syl2" |
市盈率 2 |
BUY1 |
"buy1" |
买一价 |
BUY2 |
"buy2" |
买二价 |
BUY3 |
"buy3" |
买三价 |
BUY4 |
"buy4" |
买四价 |
BUY5 |
"buy5" |
买五价 |
SALE1 |
"sale1" |
卖一价 |
SALE2 |
"sale2" |
卖二价 |
SALE3 |
"sale3" |
卖三价 |
SALE4 |
"sale4" |
卖四价 |
SALE5 |
"sale5" |
卖五价 |
BC1 |
"bc1" |
买一量 |
BC2 |
"bc2" |
买二量 |
BC3 |
"bc3" |
买三量 |
BC4 |
"bc4" |
买四量 |
BC5 |
"bc5" |
买五量 |
SC1 |
"sc1" |
卖一量 |
SC2 |
"sc2" |
卖二量 |
SC3 |
"sc3" |
卖三量 |
SC4 |
"sc4" |
卖四量 |
SC5 |
"sc5" |
卖五量 |
WB |
"wb" |
委比 |
LB |
"lb" |
量比 |
ZMM |
"zmm" |
买卖标识 |
BUY_VOL |
"buy_vol" |
主买量 |
BUY_AMOUNT |
"buy_amount" |
主买金额 |
SALE_VOL |
"sale_vol" |
主卖量 |
SALE_AMOUNT |
"sale_amount" |
主卖金额 |
W_BUY |
"w_buy" |
委买 |
W_SALE |
"w_sale" |
委卖 |
SECTIONAL_BUY_VOL |
"sectional_buy_vol" |
时点当日累计主买量 |
SECTIONAL_BUY_AMOUNT |
"sectional_buy_amount" |
时点当日累计主买金额 |
SECTIONAL_SALE_VOL |
"sectional_sale_vol" |
时点当日累计主卖量 |
SECTIONAL_SALE_AMOUNT |
"sectional_sale_amount" |
时点当日累计主卖金额 |
SECTIONAL_W_BUY |
"sectional_w_buy" |
时点当日累计委买 |
SECTIONAL_W_SALE |
"sectional_w_sale" |
时点当日累计委卖 |
SECTIONAL_YCLOSE |
"sectional_yclose" |
前日收盘 |
SECTIONAL_OPEN |
"sectional_open" |
时点当日开盘 |
SECTIONAL_HIGH |
"sectional_high" |
时点当日最高 |
SECTIONAL_LOW |
"sectional_low" |
时点当日最低 |
SECTIONAL_VOL |
"sectional_vol" |
时点当日累计成交量 |
SECTIONAL_AMOUNT |
"sectional_amount" |
时点当日累计成交金额 |
SECTIONAL_CJBS |
"sectional_cjbs" |
时点当日累计成交笔数 |
SECTIONAL_WB |
"sectional_wb" |
时点当日累计委比 |
文件导入导出类型常量
| 常量 | 值 | 说明 |
|---|---|---|
ftCSV |
0 |
逗号分割文件类型 |
ftXLS |
1 |
Excel 文件类型 |
ftStream |
2 |
天软对象流文件类型 |
ftString |
3 |
天软对象字符串文件类型 |
ftADO |
4 |
ADO 文件类型 |
ftXML |
5 |
XML 文件类型 |
ftXLS2 |
6 |
支持多表头的 Excel 文件类型 |
ftXLS3 |
7 |
Excel 文件类型 |
ftDBF |
8 |
DBF 文件类型 |
文件读写类型常量
| 常量 | 值 | 说明 |
|---|---|---|
rwByte |
0 |
字节流读写类型 |
rwInt |
1 |
整数流读写类型 |
rwReal |
2 |
实数流读写类型 |
rwStr |
3 |
字符串流读写类型 |
rwObj |
4 |
对象流读写类型 |
rwRaw |
5 |
原始读写类型 |
rwBinary |
6 |
二进制读写类型 |
query 周期与字段
周期字符串
| 分类 | 可用值 |
|---|---|
| 低频 | "日线"、"周线"、"月线"、"季线"、"半年线"、"年线" |
| 高频 | "1分钟线"、"2分钟线"、"3分钟线"、"5分钟线"、"10分钟线"、"15分钟线"、"20分钟线"、"30分钟线"、"40分钟线"、"60分钟线"、"120分钟线" |
| 超高频 | "成交明细"、"半秒线"、"1秒线"、"2秒线"、"3秒线"、"4秒线"、"5秒线"、"6秒线"、"10秒线"、"12秒线"、"15秒线"、"20秒线"、"30秒线" |
| 其他 | "任意周期"、"期货30分钟线"、"期货60分钟线" |
低频字段
| 字段 | 数据类型 | 名称 | 说明 |
|---|---|---|---|
StockID |
string |
代码 | 股票 ID |
StockName |
string |
名称 | 股票名称 |
date |
datetime |
日期 | 当前时间 |
price |
real |
最新价 | 该周期内最后一笔成交价 |
open |
real |
开盘价 | 交易所公布的开盘价 |
close |
real |
收盘价 | 交易所公布的收盘价 |
high |
real |
最高价 | 周期内最高价 |
low |
real |
最低价 | 周期内最低价 |
vol |
real |
成交量 | 周期内成交量;股票单位为股,基金单位为份,期货和期权单位为合约数量 |
amount |
real |
成交金额 | 周期内成交金额 |
cjbs |
real |
成交笔数 | 股票为成交笔数;期货/期权可表示持仓变动量,日线表示当日持仓量 |
yclose |
real |
系统昨收 | 交易所发布的考虑分红送股后的价格 |
syl1 |
real |
市盈率 1 | 期货/期权日线表示当日结算价;其他通常为 0 |
syl2 |
real |
市盈率 2 | 期货/期权表示昨日结算价;ETF/LOF 表示时点净值;其他通常为 0 |
高频与 Level1 字段
| 字段 | 数据类型 | 名称 | 说明 |
|---|---|---|---|
StockID |
string |
代码 | 股票 ID |
StockName |
string |
名称 | 股票名称 |
date |
datetime |
时间 | 当前时间 |
price |
real |
价格 | 交易明细为该时间点最后一笔成交价;其他为该周期最后一笔成交价 |
vol |
real |
成交量 | 周期内成交量;分钟周期表示该分钟成交量,不是开盘累计 |
amount |
real |
成交金额 | 周期内成交金额;分钟周期表示该分钟成交金额 |
cjbs |
real |
成交笔数 | 股票为成交笔数;期货/期权为周期内持仓变动量 |
yclose |
real |
上次价 | 上一周期的收盘价 |
syl1 |
real |
市盈率 1 | 期货/期权分钟线或秒线中,当日结算价存储在当日最后成交记录中;其他通常为 0 |
syl2 |
real |
市盈率 2 | 期货/期权为昨日结算价;ETF/LOF 为时点净值;其他通常为 0 |
buy1 至 buy5 |
real |
买一价至买五价 | 期货没有 buy2 至 buy5 |
sale1 至 sale5 |
real |
卖一价至卖五价 | 期货没有 sale2 至 sale5 |
bc1 至 bc5 |
int |
买一量至买五量 | 对应价位的委买量 |
sc1 至 sc5 |
int |
卖一量至卖五量 | 对应价位的委卖量 |
wb |
real |
委比 | 公式为委买/委卖 |
lb |
int |
量比 | 秒线取交易明细最后一笔;1 分钟线按过去 5 日均量和当日累计开市时间计算;其他分钟线取周期内最后一分钟 |
zmm |
int |
买卖标识 | 交易明细中 1 主买,2 主卖,3 集合竞价/涨停/跌停等;非交易明细无意义 |
buy_vol |
real |
主买量 | 主买成交量加买卖标识为 3 的成交量一半 |
buy_amount |
real |
主买金额 | 主买成交金额加买卖标识为 3 的成交金额一半 |
sale_vol |
real |
主卖量 | 主卖成交量加买卖标识为 3 的成交量一半 |
sale_amount |
real |
主卖金额 | 主卖成交金额加买卖标识为 3 的成交金额一半 |
w_buy |
real |
委买 | 一个周期内的委买量 |
w_sale |
real |
委卖 | 一个周期内的委卖量 |
sectional_buy_vol |
real |
时点当日累计主买量 | 从开盘到当前时间的主买量之和 |
sectional_buy_amount |
real |
时点当日累计主买金额 | 从开盘到当前时间的主买金额之和 |
sectional_sale_vol |
real |
时点当日累计主卖量 | 从开盘到当前时间的主卖量之和 |
sectional_sale_amount |
real |
时点当日累计主卖金额 | 从开盘到当前时间的主卖金额之和 |
sectional_w_buy |
real |
时点当日累计委买 | 从开盘到当前时间的委买量之和 |
sectional_w_sale |
real |
时点当日累计委卖 | 从开盘到当前时间的委卖量之和 |
sectional_yclose |
real |
前日收盘 | 上一交易日收盘价,与 yclose 的“上一周期收盘价”不同 |
sectional_open |
real |
时点当日开盘 | 今天开盘价 |
sectional_high |
real |
时点当日最高 | 从开盘到当前时间的最高价 |
sectional_low |
real |
时点当日最低 | 从开盘到当前时间的最低价 |
sectional_vol |
real |
时点当日累计成交量 | 从开盘到当前时间成交量之和 |
sectional_amount |
real |
时点当日累计成交金额 | 从开盘到当前时间成交金额之和 |
sectional_cjbs |
int |
时点当日累计成交笔数 | 股票为成交笔数;股指期货/期权可表示市场现有持仓量 |
sectional_wb |
real |
时点当日累计委比 | 当日累计委买/当日累计委卖 |
数据类型转换规则
| TSL | Python | TSL 转 Python | Python 转 TSL |
|---|---|---|---|
| 数值型 | float / int |
自动转换 | 自动转换 |
| 字符串 | str |
自动转换 | 自动转换 |
| 布尔型 | bool / int |
自动转换 | 自动转换为整数语义 |
| 日期时间实数 | datetime |
pyTSL.DoubleToDatetime() |
pyTSL.DatetimeToDouble() |
array |
pandas.DataFrame |
TSResultValue.dataframe() |
pyTSL.DataFrameToTSArray() |
| TSL 流 | Python 变量 | pyTSL.DecodeStream() |
pyTSL.EncodeStream() |
TSL 日期时间是一个实数,例如 20240730.145533T 对应日期和时间;Client.call() 中的日期时间参数可直接传 Python datetime,pyTSL 会自动转换。
pyTSLPy 兼容模块
pyTSLPy 是用 pyTSL 实现旧版 TSLPy3.pyd 功能的兼容模块。安装命令:
pip install pyTSLPy
迁移入口:
import pyTSLPy as ts
支持情况:
| 旧接口 | 支持情况 | 说明 |
|---|---|---|
DefaultConnectAndLogin |
支持 | 通过配置文件登录 |
ConnectServer |
支持 | 连接服务器 |
LoginServer |
支持 | 登录用户 |
Disconnect |
支持 | 断开连接 |
Logined |
支持 | 判断是否连接 |
SetService |
支持 | 设置服务器类型 |
GetService |
支持 | 获得服务器类型 |
RemoteExecute |
不完全支持 | 不支持本地交互 |
RemoteCallFunc |
不完全支持 | 不支持本地交互 |
EncodeDate / EncodeTime / EncodeDateTime |
支持 | 在 Python 中构造 TSL 日期、时间、日期时间 |
DecodeDate / DecodeTime / DecodeDateTime |
支持 | 将 TSL 日期、时间、日期时间转换到 Python 数组 |
SetComputeBitsOption / GetComputeBitsOption |
暂不支持 | 计算服务器位数相关 |
SetSysParam / GetSysParam |
暂不支持 | 系统参数相关 |
如果旧代码使用本地交互函数,pyTSLPy 只直接支持 ExportFile 和 ImportFile;其他本地交互函数应通过 pyTSL.register_proc() 注册。
常见风险
import pyTSL失败并提示找不到模块时,Windows 先确认 VC 运行库。- 旧版本出现字符串对象分配错误时,先升级 pyTSL。
- MacOS 导入报签名或权限问题时,需要按系统权限策略放开对应模块。
Client(ini_file)路径含中文时,可传入 GBK 编码后的路径。logout()后再次执行Client方法可能自动重新登录;生成长期任务时遵循一次登录、多次交互。- pyTSL 返回值编码为 UTF-8,不需要再手动从 GBK 转码。
- 使用代理时,代理需要支持 HTTP CONNECT;只支持应用层代理的环境需要使用官方协议网关方案。
- Linux 旧版本在子进程场景可能出现网络线程初始化问题;应使用较新 pyTSL。
- 非中国时区下日期时间转换有偏差时,使用
DatetimeToDouble(datetime, timezone)显式指定时区。
常用示例
执行 TSL 代码串
import pyTSL
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
try:
if c.login() == 0:
raise RuntimeError(c.last_error())
r = c.exec("return 1 + 1;")
if r.error():
raise RuntimeError(r.message())
print(r.value())
finally:
c.logout()
查询行情并转 DataFrame
import pyTSL
from datetime import datetime
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
try:
if c.login() == 0:
raise RuntimeError(c.last_error())
r = c.query(
stock=["SZ000001", "SZ000002"],
cycle="日线",
begin_time=datetime(2020, 1, 1),
end_time=datetime(2020, 3, 20),
fields="StockID,StockName,date,close",
)
if r.error():
raise RuntimeError(r.message())
df = r.dataframe()
finally:
c.logout()
通过 code 临时定义并调用 TSL 函数
import pyTSL
from datetime import date
tsl_code = """
function getValue(begt, endt);
begin
n := tradeDays(begt, endt);
return nday(n, "date", dateToStr(spTime()), "close", close(), "vol", vol(), "amount", amount());
end;
"""
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
try:
if c.login() == 0:
raise RuntimeError(c.last_error())
r = c.call("getValue", date(2019, 4, 10), date(2019, 4, 18), code=tsl_code, stock="SH000001", cycle="日线")
if r.error():
raise RuntimeError(r.message())
df = r.dataframe()
finally:
c.logout()
并发任务
import pyTSL
c = pyTSL.Client("user", "password", "tsl.tinysoft.com.cn", 443)
try:
if c.login() == 0:
raise RuntimeError(c.last_error())
batch = pyTSL.Batch(3, 0)
for stock in ["SH600028", "SH600030", "SH600036"]:
ok, task = batch.exec(c, "return stockMarketValue(20240410T);", stock=stock, key=stock)
if ok == 0:
print(task)
for r in iter(batch):
if r.error():
print(r.key(), r.message())
else:
print(r.key(), r.value())
finally:
c.logout()