使用说明
(天软维护的pyTSL的文档可以访问:http://www.tinysoft.com.cn/tsdn/helpdoc/index.tsl?itemid=17395 )
范例
需要导入pyTSL,创建Client类,登录,执行代码,查看结果。
import pyTSL
c = pyTSL.Client("user", "password", "tsl.tinysoft.com", 443)
c.login()
r = c.exec('''return "测试"; ''')
print(r.value())
pyTSL可以对调用参数的datetime类型自动转换成TSL的时间类型:
from datetime import datetime
code='''
function get_data(begT, endT);
begin
return select * from markettable datekey begT to endT of DefaultStockID() end;
end;
'''
r = c.call('get_data', datetime(2019,1,1), datetime.now(), stock="SZ000001", cycle="日线", code=code);
print(r.value())
# r.value() 方法可以指定需要转换成datetime类型的字段,例如:
print(r.value(parse_date=['date']))
pyTSL提供了TSL的时间类型和python的datetime类型的转换方法:
DatetimeToDouble 转换datetime类型到TSL的时间类型
DoubleToDatetime 转换TSL的时间类型到datetime类型
可以利用这些方法把上面获得的数据进行转换,例如转到pandas的DataFarme:
import pandas as pd
df=pd.DataFrame(data=r.value())
df['date'] = df['date'].apply(lambda x: pyTSL.DoubleToDatetime(x))
df.index = df['date']
print(df.head())
# pyTSL也提供了把返回结果直接转成DataFrame的方法
df = r.dataframe()
pyTSL.Client说明
构造函数
Client(user, password, ip, port)
Client(user, password, ip, port, proxy_ip, proxy_port)
Client(user, password, ip, port, proxy_ip, proxy_port, proxy_user, proxy_password)
Client(ini_file)
Client(url, user, password, proxy_ip, proxy_port, proxy_user, proxy_password)
ini文件可以配置相关的登录信息
my.ini: user= password= ip= port= ;;; 如果需要代理请配置以下选项: [proxy] ip= port= user= password=password 可以是加密的,请用天软客户端安装目录下的CONNECTMAN.exe来对密码进行加密。
url模式是通过HTTP协议转TSL网络协议的网关进行转发,可以让只支持纯HTTP协议的代理服务器也同样可以使用TSL的完整功能,例如7层协议的代理服务器。
# 目前网关部署在http://gw.py3k.cn c = pyTSL.Client('http://gw.py3k.cn', user, password, proxy_ip, proxy_port, proxy_user, proxy_password) # 默认是转发到天软深圳服务器,如果要指定转发到武汉服务器,可以这样指定URL: c = pyTSL.Client('wh+http://gw.py3k.cn', user, password, proxy_ip, proxy_port, proxy_user, proxy_password) # 如果不需要代理服务器或者代理服务不需要认证,只需要把相关的参数置空即可,例如: c = pyTSL.Client('http://gw.py3k.cn', user, password, "", 0, "", "")
login
- 返回1表示登录成功,否则会返回错误信息。
login()
logout
- 注销。
logout()
last_error
- 返回错误信息。
last_error() 返回格式:[错误代码, 错误信息] 没有错误的话错误代码是0。
exec
- 执行任意代码,返回结果。
exec(code, **kwargs)
可选的kwargs包含:service 指定执行的服务节点,例如”正式版”。
timeout 设置超时,整数类型,毫秒精度。
bgrun 设置委托执行,整数类型,1是委托执行。
stock 设置当前股票代码,字符串类型。
cycle 设置当前周期,字符串类型。
time 设置当前时间,datetime类型或者整数类型(例如20191001)或者字符串(例如’2019-10-01 14:03:01’)。
rate 设置除权方式,整数类型。
rateday 设置除权基准日,datetime类型或者整数类型(例如20191001)或者字符串(例如’2019-10-01 14:03:01’), 也可以0为最后交易日为基准日,-1为上市日为基准日。
precision 浮点数精度,整数类型。
viewpoint 设置viewpoint,datetime类型或者整数类型(例如20191001)或者字符串(例如’2019-10-01 14:03:01’)。
service 指定执行的服务节点,例如”正式版”。
reportmode 报表数据规则,整数类型。
emptymode 空记录模式,整数类型。
resultname 委托结果保存用户表名
call
- 调用函数并返回结果。
call(funcname, *args, **kwargs)
args可以自动转换这些python的数据类型到TSL的数据类型:bool
int
float
str 和 bytes
tuple
list
dict
datetime
numpy.int32, numpy.int64
numpy.float32, numpy.float64
numpy.datetime64
numpy.ndarray
pandas.DataFrame
可选的kwargs包含:
stock 设置当前股票代码,字符串类型。
cycle 设置当前周期,字符串类型。
time 设置当前时间,datetime类型或者整数类型(例如20191001)或者字符串(例如’2019-10-01 14:03:01’)。
rate 设置除权方式,整数类型。
rateday 设置除权基准日,datetime类型或者整数类型(例如20191001)或者字符串(例如’2019-10-01 14:03:01’), 也可以0为最后交易日为基准日,-1为上市日为基准日。
precision 浮点数精度,整数类型。
viewpoint 设置viewpoint,datetime类型或者整数类型(例如20191001)或者字符串(例如’2019-10-01 14:03:01’)。
code 定义函数代码段,这样不用把函数保存到服务器上就可以直接调用。
service 指定执行的服务节点,例如”正式版”。
timeout 设置超时,整数类型,毫秒精度。
bgrun 设置委托执行,整数类型,1是委托执行。
reportmode 报表数据规则,整数类型。
emptymode 空记录模式,整数类型。
query
- 查询数据。
query(**kwargs)
必须的kwargs包含:stock 设置当前股票代码,字符串类型或者列表类型,可以指定多只股票。
cycle 设置当前周期,字符串类型。
begin_time 设置数据开始时间,datetime类型或者整数类型(例如20191001)或者字符串(例如’2019-10-01 14:03:01’)。
end_time 设置数据结束时间,datetime类型或者整数类型(例如20191001)或者字符串(例如’2019-10-01 14:03:01’)。
可选的kwargs包含:
rate 设置除权方式,整数类型。
rateday 设置除权基准日,datetime类型。
precision 浮点数精度,整数类型。
viewpoint 设置viewpoint,datetime类型。
service 指定执行的服务节点,例如”正式版”。
timeout 设置超时,整数类型,毫秒精度。
fields 返回字段列表。可以是字符串类型,用”,”分割,例如:”date,close”。也可以是list或者tuple,例如[“date”,”close”]。
list_bgrun
- 列出所有委托执行。
list_bgrun() 返回格式 [ “+OK”, [委托任务1], …] 委托任务格式 [handle,执行的函数名,开始执行时间,已运行时间]
stop_bgrun
- 停止指定的委托执行任务。
stop_bgrun(handle)
admin
- 执行admin命令。
admin(cmd)
set_callback
- 设置rdo2的回调函数。
set_callback(function) 例如:
def rdo(*args): print(*args) return 1 c.set_callback(rdo) r = c.exec('''a := rdo2 mypycallback('ok'); echo a;'''); # rdo会被调用,打印出 mypycallback "ok"
default_service
- 指定、返回默认执行的服务节点。
default_service(service) 如果不带参数就返回当前的默认设置,否则进行设置。
server_list
- 返回服务节点列表。
server_list()
异步方法 (版本1.6新增)
async_login
async_login()
: 异步登录
返回值: awaitable
async_logout
async_logout()
: 异步注销
返回值: awaitable
async_exec
async_exec(*args, **kwargs)
: 异步执行
参数参见exec。
返回值: awaitable
async_call
async_call(*args, **kwargs)
: 异步调用函数
参数参见call。
返回值: awaitable
async_query
async_query(*args, **kwargs)
: 异步查询
参数参见query。
返回值: awaitable
async_admin
async_admin(*args, **kwargs)
: 异步执行管理命令
参数参见admin。
返回值: awaitable
async_download_list
async_download_list(type, timeout)
: 异步下载指定类型的数据列表
参数参见download_list。
返回值: awaitable
async_download
async_download(type, key, crc, timeout)
: 异步下载指定的数据
参数参见download。
返回值: awaitable
async_upload
async_upload(type, key, data, timeout)
: 异步上传指定的数据
参数参见upload。
返回值: awaitable
async_remove
async_remove(type, key, timeout)
: 异步删除指定的数据
参数参见remove。
返回值: awaitable
task_list
task_list()
: 返回异步任务列表
返回值: list
task_cancel
task_cancel(task)
: 取消异步任务
返回值: 0 或者 1
is_logined
is_logined()
:检查是否已经登录
返回值:
值 |
说明 |
---|---|
0 |
未登录 |
1 |
已登录 |
is_closed
is_closed()
:检查连接是否已经关闭
返回值:
值 |
说明 |
---|---|
0 |
未断开 |
1 |
已断开 |
download_list
download_list(type, timeout = 0)
按指定的类型下载列表。
参数 |
说明 |
---|---|
type |
类型,整数类型 |
timeout |
超时,毫秒精度,默认是0(不超时) |
类型值 |
说明 |
---|---|
0x2001 |
系统板块 |
0x2002 |
用户板块 |
0x5001 |
系统基本面表描述 |
0x6001 |
用户函数 |
0x6002 |
共享函数 |
0x6003 |
系统公用函数 |
0x6004 |
系统函数 |
0x8001 |
用户数据表 |
返回值: 列表类型。
如果有错误返回
[错误代码, 错误信息]
如果没有错误,返回
[0, 结果列表]
例子:
# 下载用户函数列表
err, vec = c.download_list(0x6001)
assert err == 0
print(vec)
结果列表子项说明:
下标 |
说明 |
---|---|
0 |
关键字 |
1 |
版本 |
2 |
修改时间 |
例如 ['H_J_CallBack', -990682501, datetime.datetime(2024, 7, 4, 13, 38, 13)]
。
download
download(type, key, ver = 0, timeout = 0)
下载指定关键字的内容。
参数 |
说明 |
---|---|
type |
类型,整数类型 |
key |
关键字 |
ver |
版本,指定0要最新的版本 |
timeout |
超时,毫秒精度,默认是0(不超时) |
返回值: 列表类型。
如果有错误返回
[错误代码, 错误信息]
如果没有错误,返回
[0, 结果]
例子:
# 下载'H_J_CallBack'用户函数
err, v = c.download(0x6001, 'H_J_CallBack', 0)
assert err == 0
f = pyTSL.DecodeStream(v["data"])
print(f)
v
:
{
'data': b'\x05\x08 ....',
'LastModified': -990682501,
'LastTime': datetime.datetime(2024, 7, 4, 13, 38, 13)
}
upload
upload(type, key, data, timeout=0)
上传数据到指定的关键字。
参数 |
说明 |
---|---|
type |
类型,整数类型 |
key |
关键字 |
data |
数据 |
timeout |
超时,毫秒精度,默认是0(不超时) |
返回值: 列表类型。
如果有错误返回
[错误代码, 错误信息]
如果没有错误,返回
[0, 结果]
# 上传'H_J_CallBack'用户函数
err, msg = c.upload(0x6001, 'H_J_CallBack', f)
assert err == 0
remove
remove(type, key, timeout=0)
删除指定的关键字。
参数 |
说明 |
---|---|
type |
类型,整数类型 |
key |
关键字 |
timeout |
超时,毫秒精度,默认是0(不超时) |
返回值: 列表类型。
如果有错误返回
[错误代码, 错误信息]
如果没有错误,返回
[0, 结果]
# 删除'H_J_CallBack'用户函数
err, rs = c.(0x6001, 'H_J_CallBack')
assert err == 0
AsyncClient类
异步Client类,Client类的异步功能的包装,方便使用await语法。(版本1.6新增)
构造方法
同Client,例如: c = pyTSL.AsyncClient(user, password, host, port)
可以用空构造,然后可以设置已构造的Client到 self.c
。例如:
c = pyTSL.Client(user, password, host, port)
ac = pyTSL.AsyncClient()
ac.c = c # 使用已有的Client连接
assert await ac.login()
login
login()
:异步登录
返回值: awaitable
例子:
ac = pyTSL.AsyncClient(user, password, host, port)
assert await ac.login()
logout
login()
:异步注销
返回值: awaitable
例子:
await ac.logout()
exec
exec(*args, **kwargs)
: 异步执行
参数同Client.exec。
返回值: awaitable
例子:
r = await ac.exec(code)
print(r.value())
call
call(*args, **kwargs)
: 异步调用
参数同Client.call。
返回值: awaitable
例子:
r = await ac.call(func, arg1, arg2)
print(r.value())
query
query(*args, **kwargs)
: 异步查询
参数同Client.query。
返回值: awaitable
例子:
r = await ac.query(stock='SZ000001', fields="date,close", cycle="周线", begin_time=dt.datetime(2019,1,1), end_time=dt.datetime.now())
print(r.value())
admin
admin(*args, **kwargs)
: 异步执行管理命令
参数同Client.admin。
返回值: awaitable
例子:
r = await ac.admin("ou")
print(r.value())
download_list
download_list(type)
: 异步下载指定类型的数据列表
参数同Client.download_list。
返回值: awaitable
例子:
r = await ac.download_list(0x6001) # 用户函数
print(r.value())
download
download(*args, **kwargs)
: 异步下载指定的数据
参数同Client.download。
返回值: awaitable
例子:
r = await ac.download(0x6001, "MyFunction", 0) # 用户函数 MyFunction
print(r.value())
upload
upload(*args, **kwargs)
: 异步上传
参数同Client.upload。
返回值: awaitable
例子:
f = {...}
r = await ac.upload(0x6001, "MyFunction", f)
print(r.value())
remove
remove(*args, **kwargs)
: 异步删除
参数同Client.remove。
返回值: awaitable
例子:
r = await ac.remove(0x6001, "MyFunction")
print(r.value())
TSResultValue类
返回结果类。
error() 返回0表示没有错误,否则出错了。
message() 返回相应错误信息。
- value(parse_date=False) 返回结果
参数parse_date 如果是True,将把数据转成datetime类型;
如果是字符串列表,将把字典类型中的这些字段转成datetime类型, 例如[‘date’]。
- dataframe() 返回pandas的DataFrame对象,需要先安装pandas。
会自动转换’date’字段到datetime类型并设置为索引字段。
stream() 返回TSL的流格式数据
stn() 返回TSL的STN格式数据
key() 返回任务关键字信息,配合Btatch类使用
cancelled() 返回任务是否被取消。(版本1.6新增)
Batch类
用于调度一系列函数执行。
构造函数
Batch(parallel, reconnect)
参数parallel指定并行执行的函数个数,和用户允许的并发任务数相关,默认值是5。
参数reconnect指定是否重新连接,0代表不重新连接, 1代表是重新连接。默认值是0。
exec
- 调度执行任意代码。
exec(client, code, **kwargs)
参数client是Client实例
其他参数请参考Client的exec方法 (注意:不能设置为委托执行。)
kwargs多一个key参数来设置关键字信息。
返回值: [1, Task类] 或者 [0, 错误信息]
call
- 调度调用函数。
call(client,funcname, *args, **kwargs)
参数client是Client实例
其他参数请参考Client的call方法 (注意:不能设置为委托执行。)
kwargs多一个key参数来设置关键字信息。
返回值: [1, Task类] 或者 [0, 错误信息]
query
- 调度数据查询。
query(client, **kwargs)
参数client是Client实例
其他参数请参考Client的query方法
kwargs多一个key参数来设置关键字信息。
返回值: [1, Task类] 或者 [0, 错误信息]
返回结果
- 可以使用迭代器来提取返回的结果数据,返回的结果类型是TSReturnValue类。
iter(batch) 参数batch是Batch实例。 例如:
assert c.login() == 1 batch = pyTSL.Batch(10) for i in range(1000): batch.exec(c, "sleep(100); echo %s ; return %s;" % (i,i)) res = [] it = iter(batch) for r in it: res.append(r.value())
Task类
Batch类执行任务的标识。
id
- 返回任务整数类型ID
id()
key
- 设置或返回任务的关键字信息,用户可以用这个作标识。
key(str=””) 如果不带参数就返回当前的关键字信息,否则设置关键字信息。
async_util模块
包装的异步方法,方便使用await语法。 (版本1.6新增)
async_login
async_login(c)
:异步登录
参数
参数 |
说明 |
---|---|
c |
Client实例 |
返回值: awaitable
async_logout
async_logout(c)
:异步注销
参数
参数 |
说明 |
---|---|
c |
Client实例 |
返回值: awaitable
async_exec
async_exec(c, *args, **kwargs)
:异步执行
参数
参数 |
说明 |
---|---|
c |
Client实例 |
其他参数参见Client.exec。
返回值: awaitable
async_call
async_call(c, *args, **kwargs)
:异步调用
参数
参数 |
说明 |
---|---|
c |
Client实例 |
其他参数参见Client.call。
返回值: awaitable
async_query
async_login(c, *args, **kwargs)
:异步查询
参数
参数 |
说明 |
---|---|
c |
Client实例 |
其他参数参见Client.query。
返回值: awaitable
async_admin
async_admin(c, *args, **kwargs)
:异步执行管理命令
参数
参数 |
说明 |
---|---|
c |
Client实例 |
其他参数参见Client.admin。
返回值: awaitable
async_download_list
async_download_list(c, *args, **kwargs)
:异步下载指定类型的数据列表
参数
参数 |
说明 |
---|---|
c |
Client实例 |
其他参数参见Client.download_list。
返回值: awaitable
async_download
async_download(c, *args, **kwargs)
:异步下载数据
参数
参数 |
说明 |
---|---|
c |
Client实例 |
其他参数参见Client.download。
返回值: awaitable
async_upload
async_upload(c, *args, **kwargs)
:异步上传数据
参数
参数 |
说明 |
---|---|
c |
Client实例 |
其他参数参见Client.upload。
返回值: awaitable
async_remove
async_remove(c, *args, **kwargs)
:异步删除数据
参数
参数 |
说明 |
---|---|
c |
Client实例 |
其他参数参见Client.remove。
返回值: awaitable
pyTSL辅助方法
DatetimeToDouble
- 转换python的datetime类型到TSL的时间类型,时间精度到毫秒。
DateTimeToDouble(datetime)
DoubleToDatetime
- 转换TSL的时间类型到python的datetime类型,时间精度到毫秒。
DoubleToDatetime(float)
DataFrameDiff
- 比较DataFrame,需要先安装pandas。
DataFrameDiff(df, df2)
EncodeStream
- 把python的变量转换成TSL的流格式,方便存储。
EncodeStream(obj) -> bytes
DecodeStream
- 把TSL的流转换成python的变量。
- DecodeStream(bytes, parse_date=False) -> object
参数parse_date 如果是True,将把数据转成datetime类型;
如果是字符串列表,将把字典类型中的这些字段转成datetime类型, 例如[‘date’]。
register_proc
- 注册方法
register_proc(name, func) 注册echo、rdo类的方法,方便调用。注意:name是大小写相关的。 例如:
def echo(s): print(s) register_proc("echo", echo) def exportfile(filename, value): .... register_proc("exportfile", exportfile) c.exec("echo 'ok';") c.exec('rdo2 exportfile("foo.csv",array(1,2,3))')
start_network_threads
start_network_threads(n)
:启动更多网络处理线程。(版本1.6新增)
pyTSL默认只启动一个线程做网络IO的处理,通常在只有一两个连接的情况下是足够了。如果同时有很多连接,可以启动更多的网络处理线程。 例子:
import pyTSL
pyTSL.start_network_threads(3) # 额外启动3个线程做网络IO处理,这样总共就有4个线程做网络IO处理
pyTSL.Const模块
- 返回常用的变量,例如周期,和TSL的相关方法对应。
例如:
from pyTSL.Const import * print(cy_1m) # 打印:1分钟线, 和TSL的cy_1m()对应。
cy_month
cy_day
cy_week
cy_quarter
cy_halfyear
cy_year
cy_1m
cy_2m
cy_3m
cy_5m
cy_10m
cy_15m
cy_20m
cy_30m
cy_40m
cy_60m
cy_120m
cy_detail
cy_1s
cy_2s
cy_3s
cy_4s
cy_5s
cy_6s
cy_10s
cy_12s
cy_15s
cy_20s
cy_30s
cy_halfs
cy_f30m
cy_f60m
ftCSV
ftXLS
ftStream
ftString
ftADO
ftXML
ftXLS2
ftXLS3
ftDBF
rwByte
rwInt
rwReal
rwStr
rwObj
rwRaw
rwBinary
STOCKID = “StockID”
STOCKNAME = “StockName”
DATE = “date”
PRICE = “price”
OPEN = “open”
CLOSE = “close”
HIGH = “high”
LOW = “low”
VOL = “vol”
AMOUNT = “amount”
CJBS = “cjbs”
YCLOSE = “yclose”
SYL1 = “syl1”
SYL2 = “syl2”
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”
SECTIONAL_OPEN = “sectional_open”
SECTIONAL_HIGH = “sectional_high”
SECTIONAL_LOW = “sectional_low”
SECTIONAL_VOL = “sectional_vol”
SECTIONAL_AMOUNT = “sectional_amount”
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_CJBS = “sectional_cjbs”
SECTIONAL_WB = “sectional_wb”