使用说明

(天软维护的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”