🗑️ remove(tsl): drop syntax_book/, data/ source and build script

- Remove docs/tsl/syntax_book/ (superseded by docs/tsl/syntax/)
- Remove data/tsl_reference_catalog_source/ (catalog already generated
  into docs/tsl/reference/catalog/, source no longer needed)
- Remove scripts/build_tsl_reference_catalog.ps1 (build script for
  the above source)
- Remove test assertion that referenced the deleted data/ source index

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
csh
2026-05-15 15:50:49 +08:00
co-authored by Claude Opus 4.7
parent f94dba0348
commit 7ade85ea1b
68 changed files with 0 additions and 247106 deletions
@@ -1,14 +0,0 @@
# TSL Reference Catalog Source
这里存放 `docs/tsl/reference/catalog/` 的脚本输入源。
## 用途
- 供 [`scripts/build_tsl_reference_catalog.ps1`](../../scripts/build_tsl_reference_catalog.ps1) 读取并生成 canonical 函数目录页。
- 保留按模块拆分后的 TSL 函数原始说明,避免脚本依赖 `archive/`
## 边界
- 这里不是 AI 新 session 的默认阅读入口。
- 这里不是 canonical 语法或函数手册,正式入口仍是 [`docs/tsl/reference/index.md`](../../docs/tsl/reference/index.md)。
- 这里的内容来自历史函数语料拆分结果,主要服务于目录生成与人工回查。
File diff suppressed because it is too large Load Diff
-396
View File
@@ -1,396 +0,0 @@
#### 客户端函数
##### 内容
- 结果处理
- 错误处理
- 客户端行为控制函数
- SendRunningData
##### 结果处理
###### 内容
- DelPrecode
- IncPrecode
- ProcessField
- ProcessFirstField
- TimeSeriesSplit
- ReportSeriesSplit
- TwoDimFormat2
- ThreeDimFormat2
- ThreeDimFormat3
- ThreeDimFormat4
- ThreeDimFormat5
- ThreeDimFormat6
- IsTwoDim
- TransForm
- TransPose
- TransPoseForChart
- TransPoseForChartSysParam
- TransPoseForChartSysParamEx
- TransDataStandardize
- CallBack
- 层次表格的展开
- 简单统计
- 品种管理
###### DelPrecode
###### IncPrecode
###### ProcessField
###### ProcessFirstField
###### TimeSeriesSplit
###### ReportSeriesSplit
###### TwoDimFormat2
###### ThreeDimFormat2
###### ThreeDimFormat3
###### ThreeDimFormat4
###### ThreeDimFormat5
###### ThreeDimFormat6
###### IsTwoDim
###### TransForm
###### TransPose
###### TransPoseForChart
###### TransPoseForChartSysParam
###### TransPoseForChartSysParamEx
###### TransDataStandardize
###### CallBack
####### 内容
- DelPrecodeCallBack
- IncPrecodeCallBack
####### DelPrecodeCallBack
用途:结果处理相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
return DelPrecodeCallBack('SH600000');
```
结果:’ 600000
####### IncPrecodeCallBack
用途:结果处理相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
return IncPrecodeCallBack('000002.SZ');
```
结果:’SZ000002
###### 层次表格的展开
####### 内容
- CheckDataCanBeExtract
- ExtractData
- ExtractDataEx
- ExtractDataEx2
- ExtractDataLocalRun
- ExtractDataLocalRun2
####### CheckDataCanBeExtract
####### ExtractData
用途:结果处理相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
r := Query("", "SH600000;SZ000002", true, "", "代码", DefaultStockID(),
"名称", CurrentStockName(),
"股票.分红送股", infoarray(18));
return ExtractData(r, 1, 0);
```
####### ExtractDataEx
用途:结果处理相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
r := Query("", "SH600000;SZ000002", true, "", "代码", DefaultStockID(),
"名称", CurrentStockName(),
"名称2", CurrentStockName(),
"名称3f", CurrentStockName(),
"股票.分红送股", infoarray(18));
return ExtractDataEx(r, 1, 0, 1);
```
####### ExtractDataEx2
用途:结果处理相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
// 数据展开范例
r := Query("", "SH600000;SZ000002", true, "", "代码", DefaultStockID(),
"名称", CurrentStockName(),
"名称2", CurrentStockName(),
"名称3f", CurrentStockName(),
"股票.分红送股", infoarray(18));
return ExtractDataEx2(r, 1, 0, 1, 1);
```
####### ExtractDataLocalRun
####### ExtractDataLocalRun2
用途:结果处理相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
// 数据展开范例
r := Query("", "SH600000;SZ000002", true, "", "代码", DefaultStockID(),
"名称", CurrentStockName(),
"名称2", CurrentStockName(),
"名称3f", CurrentStockName(),
"股票.分红送股", infoarray(18));
setsysparam(pn_data(), r);
return ExtractDataLocalRun2(0, 1);
```
###### 简单统计
####### 内容
- SimpleStat
- SimpleStatLocal
####### SimpleStat
用途:结果处理相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
data := array(1, 2, 3, 4, 5);
return SimpleStat(Data);
```
####### SimpleStatLocal
###### 品种管理
####### 内容
- GetDefaultFuncNameByStock
- GetTypeOfStock
####### GetDefaultFuncNameByStock
####### GetTypeOfStock
用途:结果处理相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
return GetTypeOfStock('OF000001');
```
结果:4
##### 错误处理
###### 内容
- ThisFuncOnlyForStock
- ThisFuncOnlyForBond
- ThisFuncUnderConstruction
- ThisFunOnlyForIndex
- RaiseError
- ThisFuncOnlyForFund
- ASSERT
###### ThisFuncOnlyForStock
###### ThisFuncOnlyForBond
###### ThisFuncUnderConstruction
###### ThisFunOnlyForIndex
###### RaiseError
范例
```tsl
return raise Error('function1', '无效的语段');
```
###### ThisFuncOnlyForFund
###### ASSERT
用途:错误处理相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
return ASSERT(0, '无效的语段');
```
##### 客户端行为控制函数
###### 内容
- 客户端行为控制函数简介
- TSExpert_ClientConfig
###### 客户端行为控制函数简介
客户端行为控制,是指客户端会调用一个模型,该模型的返回的结果会影响到客户端的行为,目前,客户端支持用户编写一个名为TSExpert_ClientConfig的函数,客户端会根据该函数的返回结果集来决定CHART的背景图,CHART的颜色序列,重新登录自动执行函数等等行为。
###### TSExpert_ClientConfig
范例
```tsl
// 在客户端内创建函数,函数名为TSExpert_ClientConfig,函数体内的函数如下
r := array();
r["AutoRun"][0] := 'TS_ClientDemo'; // TS_ClientDemo为预先设定好的函数,在下次登陆客户端时会自动运行该函数。其中TS_ClientDemo的代码为rdo2 MessageBox("欢迎登陆天软客户端","您好",rdo2 mb_DefButton1());
return r;
```
效果: 重新启动客户端时,会弹出下面对话框
该函数的返回值为一个数组,该数组的下标定义如下:
####### 内容
- ChartColor
- ChartColorArray
- DisabledFuncTypeList
- DisabledSystemFuncList
- DisabledSysFuncList
- FuncTypeList
- AutoRun
####### ChartColor
值为整数,为数组类型数据展示的Chart图的默认背景色。
例如:值为clWhite()
####### ChartColorArray
值为一个一维整数颜色数组,该数组为在数组类型数据展示的时候,下边的Chart的序列的颜色序列,例如:array(clRed(),clYellow(),clBlue()…..)表示第一个图的颜色为红色,第二个为黄色,第三个为蓝色…..。
####### DisabledFuncTypeList
值为一个一维整数数组,代表了在系统里禁用的函数类型ID,函数类型在funcType.cfg里定义。被禁止的函数类型将不会在系统里展示。
####### DisabledSystemFuncList
值为一个一维字符串数组,代表了在系统中隐藏的共用函数的函数名列表。
####### DisabledSysFuncList
值为一个一维字符串数组,代表了在系统中隐藏的二进制系统函数的函数名列表。
####### FuncTypeList
值为一个二维数组,该数组为扩展的函数类型定义,其定义参考FuncType.cfg。
这个二维数组有两列,分别为ID和NAME,ID列就是函数类型的数字,NAME则是函数类型的显示名称。
例如:
Array(("ID":601,"NAME":"我的扩展.扩展范例1"),…….)
####### AutoRun
值为一个数组,代表在客户端每次重新登录后自动运行的函数列表。
数组可以是一维的,也可以是二维。如果是一维,则每项的值为字符串类型,为需要的自动运行的函数名,如果是二维的,则具备两列,分别为type和name。
type列,类型为整数,表示函数的类型。0:用户函数,1:共享函数,2:共用函数,3:系统函数
name列,类型为字符串,表示函数的名称。
例如:array("AutoRunDemo1","AutoRunDemo2")表明启动的时候自动运行名为autorundemo1和autorundemo2的函数。
也可以用array(("type":0,"name":"AutoRunDemo1"),("type":0,"name":"AutoRunDemo2"))表明自动运行用户函数AutoRunDemo1和用户函数AutoRunDemo2。
##### SendRunningData
范例
```tsl
// 在原窗口输出个数,无需加Nwdow参数
n := 0;
while n < 100 do
begin
Echo n;
SendRunningData(n);
n++;
end;
return 1;
// 在新窗口输出数组,则需要加Nwdow参数,代码如下:
n := 0;
while n < 100 do
begin
Echo n;
SendRunningData(rand(10), "新窗口");
n++;
end;
return 1;
```
@@ -1,101 +0,0 @@
#### 压缩和解压函数
##### 内容
- 压缩和解压函数简介
- ZipCompress
- ZipExtract
- RarExtract
- 压缩解压函数使用说明
- unicompress
- uniuncompress
##### 压缩和解压函数简介
ZIP和RAR是最常见的文件压缩格式,为此天软提供了ZIP文件压缩和解压函数,以及RAR的解压支持。因RAR格式版权所有人不允许除自己外的第二者提供压缩支持,目前天软没有提供RAR的压缩函数。
##### ZipCompress
范例
```tsl
// 把文件d:\a.txt压缩到d:\a.zip文件中的/hello/world/a.txt中
ZipCompress('', 'd:\\a.zip', '', 'd:\\a.txt', 'hello/world/a.txt');
// 将d:\tmp目录压缩到d:\a.zip文件中
ZipCompress('', 'd:\\a.zip', '', 'd:\\tmp', 'test');
```
##### ZipExtract
范例
```tsl
// 将ZIP文件解压,可以使用ZipExtract函数,例如将d:\a.zip文件解压到d:\tmp目录
ZipExtract('', 'd:\\a.zip', '', 'd:\\tmp', '123');
```
##### RarExtract
范例
```tsl
// 将RAR文件解压,可以使用RarExtract函数,例如将d:\a.rar文件解压到d:\tmp目录
RarExtract('', 'd:\\a.rar', '', 'd:\\tmp', '123');
```
##### 压缩解压函数使用说明
函数中的alias参数用于指定目录别名
ZipCompress函数可以将由filename指定的文件或目录压缩到由zip_filename指定的压缩文件中,如果压缩文件不存在,函数会创建一个。ZIP格式的压缩不支持加密。
函数中所指定的path是压缩文件或目录在ZIP文件中的路径。如同文件系统中文件是在树状的目录结构中存储一样,ZIP文件中所存储的文件也是树状结构的,通过指定path参数,我们可以将文件或目录压缩后存放到ZIP文件中指定的目录下,如果path参数为空(“”),就压缩到ZIP的根目录下。例如我们把文件d:\a.txt压缩到d:\a.zip文件中的/hello/world/a.txt中,可以使用下面的语句:
```tsl
ZipCompress('', 'd:\\a.zip', '', 'd:\\a.txt', 'hello/world/a.txt');
```
又如我们要将d:\tmp目录压缩到d:\a.zip文件中的根下,可以使用这样的语句:
```tsl
ZipCompress('', 'd:\\a.zip', '', 'd:\\tmp', 'test');
```
要将ZIP文件解压,可以使用ZipExtract函数,例如将d:\a.zip文件解压到d:\tmp目录:
```tsl
ZipExtract('', 'd:\\a.zip', '', 'd:\\tmp', '123') ;
```
要将RAR文件解压,可以使用RarExtract函数,例如将d:\a.rar文件解压到d:\tmp目录:
```tsl
RarExtract('', 'd:\\a.rar', '', 'd:\\tmp', '123');
```
##### unicompress
范例
本地运行下面脚本:
```tsl
data := "Holle Tinysoft天软";
s := unicompress("zstd", data);
echo s, "\r\n";
echo uniuncompress("zstd", s), "\r\n";
return 1;
```
##### uniuncompress
范例
```tsl
data := "Holle Tinysoft天软";
len := length(data);
s := unicompress("zstd", data);
echo s, "\r\n";
echo uniuncompress("zstd", s, len), "\r\n";
return 1;
```
@@ -1,209 +0,0 @@
#### 信息摘要及编码
##### 内容
- 信息摘要函数
- BASE64编码
- URI EnCode函数
- 进制编码函数
##### 信息摘要函数
信息摘要函数主要提供CRC32,MD5,SHA这三类信息摘要算法的实现,信息摘要算法广泛地应用于数字签名应用中。
###### 内容
- 摘要函数使用说明
- GetMsgDigest
- GetMsgDigest(文件)
###### 摘要函数使用说明
```tsl
filename := "d:\\test.txt";
teststr := "hello";
alias := ""; //别名
return array(
"filename":filename,
"GetMsgDigest(crc32_str)":GetMsgDigest(teststr,0),
"GetMsgDigest(md5_str)":GetMsgDigest(teststr,1),
"GetMsgDigest(sha1_str)":GetMsgDigest(teststr,2),
"GetMsgDigest(sha224_str)":GetMsgDigest(teststr,3),
"GetMsgDigest(sha256_str)":GetMsgDigest(teststr,4),
"GetMsgDigest(sha384_str)":GetMsgDigest(teststr,5),
"GetMsgDigest(sha512_str)":GetMsgDigest(teststr,6),
"GetMsgDigest(alias, filename, crc32_str)":GetMsgDigest(alias,filename,0),
"GetMsgDigest(alias, filename, md5_str)":GetMsgDigest(alias,filename,1),
"GetMsgDigest(alias, filename, sha1_str)":GetMsgDigest(alias,filename,2),
"GetMsgDigest(alias, filename, sha224_str)":GetMsgDigest(alias,filename,3),
"GetMsgDigest(alias, filename, sha256_str)":GetMsgDigest(alias,filename,4),
"GetMsgDigest(alias, filename, sha384_str)":GetMsgDigest(alias,filename,5),
"GetMsgDigest(alias, filename, sha512_str)":GetMsgDigest(alias,filename,6)
);
```
###### GetMsgDigest
用途:信息摘要函数相关函数。
参数:arg1(按示例顺序传入)。
返回:处理后的结果值。
- 摘要函数使用说明
- GetMsgDigest
- GetMsgDigest(文件)
###### GetMsgDigest(文件)
##### BASE64编码
字符串与BASE64编码的互转函数
###### 内容
- BASE64编码函数使用说明
- StrToBase64
- Base64ToStr
###### BASE64编码函数使用说明
```tsl
//常量定义
test_str := 'hello world';
//BASE64
base64 := StrToBase64(test_str); //转换为BASE64编码
orig_str := Base64ToStr(base64); //BASE64编码转换为字符串
```
###### StrToBase64
用途:将字符串转换为对应类型。
参数:arg1(按示例顺序传入)。
返回:转换后的数值或日期。
范例
```tsl
return rdo2 StrToBase64('a12'); // 返回字符串:YTEy
```
###### Base64ToStr
用途:将输入值转换为字符串。
参数:arg1(按示例顺序传入)。
返回:字符串。
范例
```tsl
return rdo2 Base64ToStr('YTEy'); // 返回字符串:a12
```
##### URI EnCode函数
与JavaScript同名函数功能完全相同。
###### 内容
- EncodeURIComponent
- DecodeURIComponent
- EncodeURI
- DecodeURI
###### EncodeURIComponent
###### DecodeURIComponent
###### EncodeURI
###### DecodeURI
##### 进制编码函数
###### 内容
- 进制编码函数使用说明
- EncodeRadixstr
- DecodeRadixstr
- Decoderadixwstr
- Encoderadixwstr
###### 进制编码函数使用说明
encoderadixstr("123","0x",16)结果为"0x310x320x33" 前缀
encoderadixstr("123","h",0x80000000+16)结果为"31h32h33h" 后缀
decoderadixstr("0x310x320x33",2,16)的结果为123
encoderadixstr("123","h",0x80000000+16)结果为"31h32h33h"
decoderadixstr("31h32h33h",1,0x80000000+16)结果为"123"
encoderadixstr("天软","0x",16)结果为"0xCC0xEC0xC80xED" 默认大写
encoderadixstr("天软","0x",0x40000000+16)结果为"0xcc0xec0xc80xed" 小写字母
###### EncodeRadixstr
用途:进制编码函数相关函数。
参数:arg1,arg2,arg3(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
return EncodeRadixstr("1122", "0x", 16); // 结果为’ 0x310x310x320x32’,前缀,16进制
return EncodeRadixstr("1122", "h", 0x80000000 + 16); // 31h31h32h32h’,后缀,16进制
return EncodeRadixstr("天软", "ox", 0x80000000 + 16);
// CCoxECoxC8oxEDox’,后缀,默认为大写字母,16进制
return EncodeRadixstr("天软", "0X", 0x80000000 + 0x40000000 + 16);
// cc0Xec0Xc80Xed0X’,后缀,小写字母,16进制
return EncodeRadixstr("18", "B", 2); // B00110001B00111000’,二进制
```
###### DecodeRadixstr
用途:进制编码函数相关函数。
参数:arg1,arg2,arg3(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
return DecodeRadixstr('0x310x310x320x32', 2, 16); // 返回'1122'
// 注:这里的第二个参数是前缀或后缀的串的长度,并非指定串
```
###### Decoderadixwstr
用途:进制编码函数相关函数。
参数:arg1,arg2,arg3(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
return Decoderadixwstr('0x00310x00310x00320x0032', 2, 16); // 返回'1122'
// 注:这里的第二个参数是前缀或后缀的串的长度,并非指定串
```
###### Encoderadixwstr
用途:进制编码函数相关函数。
参数:arg1,arg2,arg3(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
return Encoderadixwstr("1122", "0x", 16);
// 结果为'0x00310x00310x00320x0032',前缀,16进制
return Encoderadixwstr("1122", "h", 0x80000000 + 16);
// '0031h0031h0032h0032h',后缀,16进制
return Encoderadixwstr("天软", "ox", 0x80000000 + 16); // ''
// '5929ox8F6Fox',后缀,默认为大写字母,16进制
return Encoderadixwstr("天软", "0X", 0x80000000 + 0x40000000 + 16);
// '59290X8f6f0X',后缀,小写字母,16进制
return Encoderadixwstr("18", "B", 2);
// 'B0000000000110001B0000000000111000',二进制
```
@@ -1,608 +0,0 @@
#### 图形函数
##### 内容
- 作图函数
- 图形类型函数
- 图形字段函数
- 图形标示函数
- 图形填充设置函数
- 颜色函数
- 颜色变换函数
##### 作图函数
###### 内容
- Graph
- GraphGroup
- MergeGraph
- EncodeGraphGroup
- DecodeGraphGroup
- DecodeGraph
- EncodeGraph
- FastLine_Web
- BarLine_Web
- PieLine_Web
- GetColorByIndex
###### Graph
用途:作图函数相关函数。
参数:arg1,arg2,arg3(按示例顺序传入)。
返回:处理后的结果值。
范例
范例一:
```tsl
// K线图
setsysparam(pn_stock(), 'SZ000002');
setsysparam(pn_date(), inttodate(20140117));
setsysparam(pn_nday(), 250);
t1 := NDay2(gfopen(), Open() ,
gfclose(), close(),
gfhigh(), high(),
gflow(), low(),
gftime(), datetimetostr(sp_time()),
// KLine颜色
gfColor(), IfThen3(Close(), Open(),
ClRed() ,//涨颜色
clYellow() ,//平颜色
ClLime()//跌颜色
),
gffill(), ifThen3(Close(), Open(), flClear(), flSolid(), flSolid())
);
t2 := NDay2('MA10', Ma(Close(), 10));
g1 := Graph(gtKline(), 'KLine', t1);
g2 := Graph(gtline(), 'MA10', t2);
return graphgroup(g1, g2);
```
范例二:
```tsl
// 折线图
setsysparam(pn_stock(), 'SZ000002');
setsysparam(pn_date(), inttodate(20140117));
setsysparam(pn_nday(), 250);
GData1 := Nday2(gfclose(), close());
GData2 := Nday2('MA5', MA(close(), 5));
GData3 := Nday2('MA20', MA(close(), 20));
g1 := Graph( gtLine(), gfclose(), Gdata1, gfColor() , clBlue());
g2 := Graph( gtLine(), "MA5", Gdata2, gfColor() , clGreen());
g3 := Graph( gtLine(), "MA20", Gdata3, gfColor() , clRed());
return graphgroup(g1, g2, g3);
```
参考GraphGroup DecodeGraphGroup EncodeGraphGroup DecodeGraph EncodeGraph
###### GraphGroup
用途:作图函数相关函数。
参数:arg1arg2,arg3,arg4(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
VolData := Nday2(GfVol() , Vol() , gfColor() , ifthen ( Close() > Open() , ClRed() , ClGreen() ) );
MAVOL := Nday2('MA5', MA ( Vol() , 5 ) );
VOLGraph := Graph(gtBar(), 'VOLGraph', VolData);
MAVOLGraph := Graph(gtLine(), 'MA5Graph', MAVOL, gfColor(), clBlue());
return GraphGroup(VOLGraph, MAVOLGraph, gfMinValue(), 0);
```
结果说明:GraphGroup包含了两个TGraph图形,一个是VOLGraph成交量图形,另一个是MAVOLGraph成交量的5日均线的折线图形。这两个图形具有的共有属性是gfMinValue(),就是最小值为0。gfColor在VolData中作为了数据字段,用来指示每一个数据点的颜色。因此柱子会根据开盘和收盘的差异来决定色彩的显示。而在MAVOLGraph又作为了图形的属性,因此MAVOLGraph在显示的时候会呈现出蓝色。gfMinValue在返回的图形组合里作为了图形组合的属性,因此决定了图形会用0来作为最小的值来显示,而不会用区间内的最小成交量作为最小值显示。
另外,我们可以注意到,作为gtLine类型的MAVOLGraph并不含有特殊的值来指定折线的点的位置,在没有特定的数据字段的时候,系统会使用第一个存在的数据字段当成默认的gfValue来显示。
gfMinValue():设定最小值。一般的,图形会用查找视图内最小最小值用于显示,同时,为了特殊显示,也可以指定其显示的最大最小值,通常成交量的图是用0作为最小值的。参考Graph
DecodeGraphGroup EncodeGraphGroup DecodeGraph EncodeGraph
###### MergeGraph
用途:作图函数相关函数。
参数:arg1arg2,arg3,arg4(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
setsysparam(pn_stock(), 'SZ000063');
setsysparam(pn_date(), 20190301T);
setsysparam(pn_nday(), 100);
t1 := NDay2(gfopen(), Open() ,
gfclose(), close(),
gfhigh(), high(),
gflow(), low(),
gftime(), datetimetostr(sp_time()),
// KLine颜色
gfColor(), IfThen3(Close(), Open(),
ClRed() ,//涨颜色
clYellow() ,//平颜色
ClLime()//跌颜色
),
gffill(), ifThen3(Close(), Open(), flClear(), flSolid(), flSolid())
);
t2 := NDay2('MA5', Ma(Close(), 5)); // 5日均线
t3 := NDay2('MA10', Ma(Close(), 10)); // 10日均线
t4 := NDay2('MA20', Ma(Close(), 20)); // 20日均线
g1 := graph(gtKline(), 'KLine', t1);
g2 := graph(gtline(), 'MA5', t2);
g3 := graph(gtline(), 'MA10', t3);
g4 := graph(gtline(), 'MA20', t4);
return MergeGraph(g1, g2, g3, g4);
```
返回:
###### EncodeGraphGroup
用途:作图函数相关函数。
参数:arg1,arg2(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
// 取万科A 截止至2014年1月17日的250个交易日的K线数据与10日移动平均数据的图形组合
setsysparam(pn_stock(), 'SZ000002');
setsysparam(pn_date(), inttodate(20140117));
setsysparam(pn_nday(), 250);
t1 := NDay2(gfopen(), Open() ,
gfclose(), close(),
gfhigh(), high(),
gflow(), low(),
gftime(), datetimetostr(sp_time()),
// KLine颜色
gfColor(), IfThen3(Close(), Open(),
ClRed() ,//涨颜色
clYellow() ,//平颜色
Clblue()//跌颜色
),
gffill(), ifThen3(Close(), Open(), flClear(), flSolid(), flSolid())
);
t2 := NDay2('MA10', Ma(Close(), 10));
g1 := graph(gtKline(), 'KLine', t1);
g2 := graph(gtline(), 'MA10', t2);
return EncodeGraphGroup(array(g1, g2), array());
```
参考Graph GraphGroup DecodeGraphGroup DecodeGraph EncodeGraph
###### DecodeGraphGroup
用途:作图函数相关函数。
参数:arg1,arg2,arg3(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
VolData := Nday2(GfVol() , Vol() , gfColor() , ifthen ( Close() > Open() , ClRed() , ClGreen() ) );
MAVOL := Nday2('MA5', MA ( Vol() , 5 ) );
VOLGraph := Graph(gtBar(), 'VOLGraph', VolData);
MAVOLGraph := Graph(gtLine(), 'MA5Graph', MAVOL, gfColor(), clBlue());
DATAARR := GraphGroup(VOLGraph, MAVOLGraph, gfMinValue(), 0);
DecodeGraphGroup(DATAARR, x, y);
return x; // 返回分解后的柱状图
```
参考Graph GraphGroup EncodeGraphGroup DecodeGraph EncodeGraph
###### DecodeGraph
用途:作图函数相关函数。
参数:arg1arg2arg3arg4arg5(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
setsysparam(pn_stock(), 'SZ000002');
setsysparam(pn_date(), inttodate(20140117));
setsysparam(pn_nday(), 250);
t1 := NDay2(gfopen(), Open() ,
gfclose(), close(),
gfhigh(), high(),
gflow(), low(),
gftime(), datetimetostr(sp_time()),
// KLine颜色
gfColor(), IfThen3(Close(), Open(),
ClRed() ,//涨颜色
clYellow() ,//平颜色
Clblue()//跌颜色
),
gffill(), ifThen3(Close(), Open(), flClear(), flSolid(), flSolid())
);
g1 := graph(gtKline(), 'KLine', t1);
DecodeGraph(g1, ty, na, da, pr);
return array(ty, na, da, pr);
```
参考Graph GraphGroup DecodeGraphGroup EncodeGraphGroup EncodeGraph
###### EncodeGraph
用途:作图函数相关函数。
参数:arg1arg2,arg3,arg4(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
setsysparam(pn_stock(), 'SZ000002');
setsysparam(pn_date(), inttodate(20140117));
setsysparam(pn_nday(), 250);
t1 := NDay2(gfopen(), Open() ,
gfclose(), close(),
gfhigh(), high(),
gflow(), low(),
gftime(), datetimetostr(sp_time()),
// KLine颜色
gfColor(), IfThen3(Close(), Open(),
ClRed() ,//涨颜色
clYellow() ,//平颜色
Clblue()//跌颜色
),
gffill(), ifThen3(Close(), Open(), flClear(), flSolid(), flSolid())
);
return EncodeGraph(gtkline(), 'KLine', t1, array());
```
参考Graph GraphGroup DecodeGraphGroup EncodeGraphGroup DecodeGraph
###### FastLine_Web
- Graph
- GraphGroup
- MergeGraph
- EncodeGraphGroup
- DecodeGraphGroup
- DecodeGraph
- EncodeGraph
- FastLine_Web
- BarLine_Web
- PieLine_Web
- GetColorByIndex
###### BarLine_Web
###### PieLine_Web
###### GetColorByIndex
用途:作图函数相关函数。
参数:arg1(按示例顺序传入)。
返回:整数。
范例
```tsl
return GetColorByIndex(1);
// 返回:16711680
```
##### 图形类型函数
###### 内容
- gtLine
- gtKLine
- gtTower
- gtAmerican
- gtBar
- gtSingleBar
- gtCircle
###### gtLine
###### gtKLine
###### gtTower
###### gtAmerican
###### gtBar
###### gtSingleBar
###### gtCircle
##### 图形字段函数
这类函数用于描述数据点的特性或者描述整个图形的属性
###### 内容
- gfValue
- gfClose
- gfOpen
- gfHigh
- gfLow
- gfTowerLow
- gfTowerHigh
- gfTowerMid
- gfVol
- gfAmount
- gfTime
- gfColor
- gfFill
- gfFlag
- gfRateFlag
- gfZero
- gfMaxValue
- gfMinValue
- gfLTP
- gfTitleCaption
- gfLeftTitleCaption
- gfCoordinate
###### gfValue
###### gfClose
###### gfOpen
###### gfHigh
###### gfLow
###### gfTowerLow
###### gfTowerHigh
###### gfTowerMid
###### gfVol
###### gfAmount
###### gfTime
###### gfColor
参考颜色函数
###### gfFill
参考图形填充设置函数
###### gfFlag
参考图形标示函数
###### gfRateFlag
###### gfZero
参考TGraphGroup
###### gfMaxValue
参考TGraphGroup
###### gfMinValue
参考TGraphGroup
###### gfLTP
参考TGraphGroup
###### gfTitleCaption
参考TGraphGroup
###### gfLeftTitleCaption
参考TGraphGroup
###### gfCoordinate
参考TGraphGroup
##### 图形标示函数
用于为图形做出一定标示,例如买入点或卖出点,取值为整数。
###### 内容
- fgNone
- fgUp
- fgDown
- fgLeft
- fgRight
- fgLeftUp
- fgLeftDown
- fgRightUp
- fgRightDown
###### fgNone
###### fgUp
###### fgDown
###### fgLeft
###### fgRight
###### fgLeftUp
###### fgLeftDown
###### fgRightUp
###### fgRightDown
##### 图形填充设置函数
用于设定图形是否填充以及如何填充,取值为整数。
参考:gfFill
###### 内容
- flSolid
- flClear
- flHorizontal
- flVertical
- flFDiagonal
- flBDiagonal
- flCross
- flDiagCross
###### flSolid
参考gfFill flClear flHorizontal flVertical flFDiagonal flBDiagonal flCross
flDiagCross
###### flClear
参考gfFill flSolid flHorizontal flVertical flFDiagonal flBDiagonal flCross
flDiagCross
###### flHorizontal
参考gfFill flSolid flClear flVertical flFDiagonal flBDiagonal flCross
flDiagCross
###### flVertical
参考gfFill flSolid flClear flHorizontal flFDiagonal flBDiagonal flCross
flDiagCross
###### flFDiagonal
参考gfFill flSolid flClear flHorizontal flVertical flBDiagonal flCross
flDiagCross
###### flBDiagonal
参考gfFill flSolid flClear flHorizontal flVertical flFDiagonal flCross
flDiagCross
###### flCross
参考gfFill flSolid flClear flHorizontal flVertical flFDiagonal flBDiagonal
flDiagCross
###### flDiagCross
参考gfFill flSolid flClear flHorizontal flVertical flFDiagonal flBDiagonal
flCross
##### 颜色函数
###### 内容
- clBlack
- clMaroon
- clGreen
- clOlive
- clNavy
- clPurple
- clTeal
- clGray
- clSilver
- clRed
- clLime
- clYellow
- clBlue
- clFuchsia
- clAqua
- clLtGray
- clDkGray
- clWhite
- clMoneyGreen
- clSkyBlue
- clCream
- clMedGray
###### clBlack
###### clMaroon
###### clGreen
###### clOlive
###### clNavy
###### clPurple
###### clTeal
###### clGray
###### clSilver
###### clRed
###### clLime
###### clYellow
###### clBlue
###### clFuchsia
###### clAqua
###### clLtGray
###### clDkGray
###### clWhite
###### clMoneyGreen
###### clSkyBlue
###### clCream
###### clMedGray
##### 颜色变换函数
###### 内容
- GetCValue
- GetMValue
- GetYValue
- GetKValue
- CMYK
- RGB
- Rgbbgr
- PaletteRGB
- PaletteIndex
- GetRValue
- GetGValue
- GetBValue
###### GetCValue
###### GetMValue
###### GetYValue
###### GetKValue
###### CMYK
###### RGB
###### Rgbbgr
###### PaletteRGB
###### PaletteIndex
###### GetRValue
###### GetGValue
###### GetBValue
File diff suppressed because it is too large Load Diff
@@ -1,560 +0,0 @@
#### 平台函数
##### 内容
- 自有数据维护函数
- 平台函数简介
- 平台执行信息
- 用户和函数相关函数
- 平台与客户端交互函数
##### 自有数据维护函数
###### 内容
- LoadTableEx
- UserDB
- LoadTable
- SaveTable
- TestTable
- SaveBk
- DeleteBk
- ListTable
- DeleteTable
###### LoadTableEx
用途:自有数据维护函数相关函数。
参数:arg1(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
return LoadTableEx('repitle');
```
返回:repitle为保存好的用户数据
###### UserDB
####### 内容
- UserDataUpLoad
- HexToString
- TransFileName
####### UserDataUpLoad
用途:自有数据维护函数相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
// dir为用户本地用户数据的存贮目录
Filedir := 'C:\\Users\\xxxx\\Tinysoft\\Analyse.NET\\D254A848\\xxx\\UserDB\\hex_74657374646174613031.stm';
return UserDataUpLoad(Filedir); // 返回上传结果提示信息。
```
####### HexToString
用途:将输入值转换为字符串。
参数:
返回:字符串。
范例
```tsl
// 将用户数据名转化为可读串
str := 'hex_74657374646174613031.stm';
return HexToString(str); // 返回testdata01
```
####### TransFileName
用途:自有数据维护函数相关函数。
参数:
返回:整数。
范例
```tsl
// 获取本地用户数据列表
dir := 'C:\\Users\\xxxx\\Tinysoft\\Analyse.NET\\D254A848\\xxx\\UserDB';
return TransFileName(dir); // 返回用户数据列表
```
###### LoadTable
用途:自有数据维护函数相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
// 将savetable范例中保存的用户数据testA提取出来
return LoadTable('testA');
```
参考TestTable SaveTable ListTable DeleteTable
###### SaveTable
用途:自有数据维护函数相关函数。
参数:
返回:处理后的结果值。
注意:
在保存用户数据的时候可以分目录保存,只需在目录层次间添加‘\\’即可;在不同的目录下可以将数据保存为相同的数据名称。
另外,该目录的分类方法在左上角工具栏中的“数据”可查看到分类,但是在资源管理器中,只以"目录名\数据表名"显示
范例
范例一:直接在根目录下保存
```tsl
// 将r保存为用户数据testA
r := rand(10, 10);
return SaveTable('testA', r);
// 结果:-1
```
范例二:保存到指定目录下
```tsl
// 将生成的10行10列的随机数据保存到目录:mydata\目录下,保存
// 文件名称为testA
r := rand(10, 10);
ret := SaveTable('mydata\\testA', r);
return ret;
// 结果:-1
```
用户数据的查看:
用户可以在左上角菜单栏的‘数据’中查看保存的数据,如果保存后即时查看,服务器还没有把数据推送到客户端,用户需要主动查询用户数据,点击左上角菜单栏‘系统’->‘检查用户数据’,右下角弹出最新更新的用户数据后,再点击菜单栏‘数据’,即可看到刚刚存入的数据。
范例三:新旧流格式数据保存操作及结果对比,在新版客户端+下一代服务器下执行以下操作
```tsl
t := getdatademo(); // 返回一个数组--测试者数据举例
r1 := SaveTable("TestSTData01", t); // 缺省情况下保存用户数据
r2 := SaveTable("TestSTData02", t, 0); // 指定保存为原始流格式
r3 := SaveTable("TestSTData03", t, 1); // 指定保存为新流格式
return array(r1, r2, r3);
```
保存后,用户数据中列表大小显示如下:新流格式数据大小为源始流格式的55%,数据大小有明显的变小
关于新流格式:
新一代客户端上传用户数据采用快速流,为了客户端保持和古旧的平台的兼容性,原有客户端上传的数据依旧采用原始流模式。
如果同时使用老旧的客户端(2020年6月之前的版本)和新的客户端,老旧客户端无法处理新的流模式。
新版本的执行返回结果集使用用的是快速流格式,快速流模式空间需求小,且加载效率快300%。
参考TestTable LoadTable ListTable DeleteTable
###### TestTable
用途:自有数据维护函数相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
return TestTable('testA'); // 测试用户数据"testA"是否存在。返回值为1,即存在,0即不存在。
```
参考SaveTable LoadTable ListTable DeleteTable
###### SaveBk
用途:自有数据维护函数相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
SaveBk("MySector", "我的一级分类\\我的二级分类", array("SZ000001", "SZ000002"));
{在"我的一级分类\\我的二级分类"目录生成一个名为"MySector "的板块,该板块的成分为SZ000001,SZ000002}
```
参考DeleteBk
###### DeleteBk
用途:自有数据维护函数相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
DeleteBk("MySector");
```
参考SaveBk
http://www.tinysoft.com.cn/TSDN/HelpDoc/SearchContent.tsl?r=ref&KeyWord=
###### ListTable
用途:自有数据维护函数相关函数。
参数:无。
返回:处理后的结果值。
范例
```tsl
return ListTable();
```
结果如下:
参考TestTable SaveTable LoadTable DeleteTable
###### DeleteTable
用途:自有数据维护函数相关函数。
参数:
返回:处理后的结果值。
范例
范例一:删除指定目录下的用户数据
```tsl
// 删除存在目录:“mydata\目录下”的用户数据testA
ret := DeleteTable('mydata\\testA');
return ret;
// 结果:-1
```
范例二:删除同一规则命名的用户数据
```tsl
// 删除存在目录:“mydata\目录下”以test开头命名的用户数据
data := listTable();
for i := 0 to length(data) - 1 do
begin
if pos('mydata\\test', data[i]) > 0 then
begin
DeleteTable(data[i]);
end;
end;
return listtable();
```
参考TestTable SaveTable LoadTable ListTable
##### 平台函数简介
平台函数指天软金融分析.NET平台专用函数(证券相关等函数也是平台专用函数)
##### 平台执行信息
###### 内容
- TSCanGrid
- Isbackground
- tsAppServer
- TsAppServerName
- SendToClient
- TS_ModuleInfo
###### TSCanGrid
###### Isbackground
###### tsAppServer
用途:平台执行信息相关函数。
参数:无。
返回:处理后的结果值。
范例
```tsl
a := rand(10, 10);
return tsAppServer();
// 结果:192.168.101.45:3328(Z:\server\bin5)
```
###### TsAppServerName
用途:平台执行信息相关函数。
参数:无。
返回:处理后的结果值。
范例
```tsl
return TsAppServerName();
```
结果:192.168.101.26:z:\server\bin\exec64.exe
###### SendToClient
用途:平台执行信息相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
// 1)执行命令:return 100+1
return SendToClient("getdo", "return 100 + 1;", nil, nil);
// 结果:101
// 2)采用系统参数取得数据,将取得的数据相加,并设置超时时间为30s
return SendToClient("getdo", "return getsysparam('a') + getsysparam('b');", nil, array("a":10, "b":30), 30);
// 结果:40
```
参考平台和客户端交互。
###### TS_ModuleInfo
用途:平台执行信息相关函数。
参数:无。
返回:处理后的结果值。
范例
```tsl
return TS_ModuleInfo();
```
差异说明Windows:任何版本。
Linux:自2024-07-10之后的版本,开始支持;之前的版本不支持。
##### 用户和函数相关函数
###### 内容
- User
- UserName
- FunctionType
- FunctionName
- FunctionVer
- UserConfig
- SetUID
- SUDO
###### User
用途:用户和函数相关函数相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
// 执行用户jrtzsupport 共享的大师策略的函数Show_DSXG_211
begt := inttodate(20130101);
endt := inttodate(20140101);
return User('jrtzsupport').Show_DSXG_211(begt, endt, 0);
```
参考SYSTEM
###### UserName
###### FunctionType
参考FunctionName FunctionVer
###### FunctionName
参考FunctionType FunctionVer
###### FunctionVer
参考FunctionType FunctionName
###### UserConfig
###### SetUID
###### SUDO
##### 平台与客户端交互函数
###### 内容
- 在平台模型运行时打印信息到客户端/Web端
- 平台模型远程调用客户端函数,访问客户端的资源
- SendToClient提供调用本地命令
###### 在平台模型运行时打印信息到客户端/Web端
在运行平台模型的时候,为了调试方便,也为了监控模型的正常运行,往往需要知道模型运行的状态,这样我们需要在模型运行过程中输出一些信息到终端,而不是等待模型执行完毕得到最终结果。
这就需要使用打印信息到客户端的功能。
我们看一个案例,这个案例就是获得每个股票的Beta值:
```tsl
Stks := GetBk("深证A股;上证A股");
Result := array();
for i := 0 to length(Stks) - 1 do
begin
SetSysParam(pn_Stock(), Stks[i]);
Result[i]["StockID"] := Stks[i];
Result[i]["Beta"] := StockBeta4("SH000300", 10); // 最近一年的Beta
Echo Result[i]["StockID"], "->", Result[i]["Beta"];
end;
return Result;
```
由于调用Beta的时候,计算效率会稍微低,我们利用Echo把当前运行的信息打印到了客户端,客户端的窗口内容如下:
利用这样的方法,我们就可以实时知道当前模型运行的状况了。我们在很多地方可以用到这个功能,例如我们可以简单地打印几个时间或者运行的时间长短来知道运行的效率。
对于运行中间得到的结果是一个复杂结果的,例如数组等内容,那么就没办法直接Echo这个结果,这就要结合tostn函数来输出调试了。
```tsl
Stks := GetBk("深证A股;上证A股");
Result := array();
for i := 0 to length(Stks) - 1 do
begin
SetSysParam(pn_Stock(), Stks[i]);
Result[i]["StockID"] := Stks[i];
Result[i]["Beta"] := StockBeta4("SH000300", 10); // 最近一年的Beta
Echo tostn(Result);
end;
return Result;
```
每一行的内容会显示在右边部分,这个时候我们可以利用转换数据按钮把字符串以数据的方式来显示。
除了Echo以外,我们还可以利用Writeln或者Write函数来输出这些内容。
当我们不是在终端上运行这些模型,而是在WEB端或者独立解释器里调用运行这个模型,信息会直接输出到浏览器或者控制台中。
参考:echo
###### 平台模型远程调用客户端函数,访问客户端的资源
我们在使用平台模型的时候,经常有需要要访问客户端本地资源。打个比方,我们需要导出计算的数据,而等待整个模型的返回特别长,所以可能我们需要边运行,边导出数据。又或者整个的数据结果集非常大,无法单次返回,需要分开成小结果集运行时导出到客户端,而导出数据可以通过ExecSql输出到数据库,也可以是通过ExportFile来导出文件,我们还可以通过WriteFile等文件读写函数来直接操作文件。以及通过封装好的系统或者用户写的TSL函数。
平台提供了两个关键字RDo和RDo2来解决这个问题。RDo和RDo2可以在平台运行模型的时候远端调用客户端的函数运行。
例如:我们在运行的时候要导出一组股票的交易明细数据到客户机上。
```tsl
Stks := GetBK("深证A股;上证A股");
Day := Today();
for i := 0 to length(Stks) - 1 do
begin
SetSysParam(pn_Stock(), Stks[i]);
if not isTradeDay(Day) then continue; // 如果没有交易则下一个
Data := select DateTimeToStr(["date"]) as"Time", ["close"], ["vol"] from tradetable DateKey Day to Day + 1 of Stks[i] where ["vol"] > 0 end; // 取出时间,收盘价,成交量
RDo2
ExportFile(ftCSV(), "", "C:\\DataStore\\" + IntToStr(DateToInt(Day)) + "\\" + Stks[i] + ".csv", Data); // 导出数据
end;
```
以上代码为将上证和深证A股的当天的交易明细导出到本地。ExportFile是一个导出的函数,但是在平台上运行的时候导出到的位置是在服务器上,而且需要在服务器上设置权限。而用RDo2则使导出命令在客户端上运行,所以输出会在客户端本地。
由于要对本地文件进行读写,或者调用本地的其他资源,终端为了安全起见,默认禁止了这类远端调用,于是系统左上角会出现如下界面:
系统还会终止模型的运行并且返回出错信息。
用户可以通过菜单进入系统设置,也可以点击进入系统信任中心,界面如下:
信任中心的初始是最高安全性,禁止了远程模型对本地资源的访问。如果我们只需要导出数据到本地或者执行本地的数据库查询语句,那么我们可以选择高安全性,高安全性允许RDO/RDO2执行的函数是ExportFile和ExecSQL。
如果我们还需要从本地导入数据,调用ImportFile函数,则应该设置为中安全性。低安全性则是允许RDo/RDo2调用任何本地函数。而最低安全性则还允许使用SendToClient函数用”do”或者”getdo”命令组成命令串执行,这就可以不需要把命令串封装成函数来执行。
如果信任中心拒绝了调用,系统会自动禁止该调用,并且会有一个禁止掉的提示小窗口。而当信任中心允许调用的时候,如果用户没有进行许可设置,系统依旧会对远程模型的本地资源调用进行安全提示。
我们可以信任某个用户来源的所有的函数的调用,也可以信任该来源函数的调用,还可以仅仅信任该调用(例如信任导出的调用必须导出的文件名都是一致的),我们还可以临时允许该调用或者拒绝该调用。这样下次当调用发生的时候,该信任管理窗口依旧会出现。
对于导入和导出的调用,还有一个信任路径的设置。当设置了信任路径以后,在该信任路径下以及该路径下的子目录下的所有导入/导出命令将会被允许而不再提示。
无论是拒绝还是信任了,在运行信息中总是会显示收到的命令。此外,对于已经设置了信任的调用方式,如果用户需要修改,可以进入系统设置中,打开信任配置文件来修改INI文件,找到相应项目删除掉就可以了。
RDo和RDo2的差异在于RDo2会返回函数的执行结果,因此RDo2是同步执行的方式,一定会等待客户端执行完毕才返回。而RDo则是不返回结果,直接把命令提交给客户端处理,至于执行的正确与否,RDo是不理会的,会出现模型执行完毕了,而客户端的命令仍然在排队执行的情况。
在绝大多数情况下,RDo2会更安全可靠,但是RDo的效率有时候会更高。但是平台会约束RDo送回到客户端的内容的带宽,并且系统也无法保障RDo的执行是否是正确的。
而且有些函数是必须用RDo2的,例如ImportFile,因为不用RDo2,该调用毫无意义。而ExportFile,ExecSQL的调用,有点却不一定需要等待返回,所以也可以采用RDo,但是我们依旧推荐用户使用RDo2,除非用户确实需要使用RDo。
如果RDo2所调用的函数使用了系统参数(客户端执行的函数并不多见),则可以使用With关键字把系统参数带进去。
例如A:=RDo2 LocalFunctionTest() with array("abcd":123,"bcd":234);
而LocalFunctiontest函数的内容则为:
Return GetSysParam("abcd")+GetSysParam("bcd");
则返回的结果是357
RDo2调用的默认是300秒超时的,也就是说默认情况下当客户端未能在300秒内处理完请求(包括客户端无人响应确认),系统会抛出超时的异常。
如果需要设置超时的时间,可以用TimeOut来设置超时,例如RDo2
ImportFile(ftCsv(),"","C:\\1.csv",Data) TimeOut 30;
调用ImportFile函数的超时时间为30秒。
参考:RDo,RDo2
###### SendToClient提供调用本地命令
RDo和RDo2提供了调用本地函数的功能,但是有时候一个计算不一定要用函数,例如:执行一个1+1的操作。这类需求利用SendToClient可以完成。
SendToClient提供了很灵活的调用方法,事实上RDo,RDo2也是通过SendToClient函数来实现的。SendToClient实现了如下命令:
echo 显示信息
import 导入
export 导出
rdo 远程调用
rdo2 远程调用并返回
do 远程执行命令串
getdo 远程执行命令串并返回
由于echo命令、import、export、rdo、rdo2命令在之前都有相应的简单的替代方案,因此,我们就只讲do、getdo命令的使用。
例如,我们要用本地计算一个1+1的值,我们可以采用如下方法:
Return SendToClient("getdo","return 1+1;",nil,nil);
如果在计算中需要采用系统参数,将参数放入第四个参数即可:
Return SendToClient("getdo","return
getsysparam('a')+GetSysParam('b');",nil,array("a":1,"b":2));
如果计算数据的超时时间需要设置,再在后边加入一个超时的秒数的参数:
Return SendToClient("getdo","return
getsysparam('a')+GetSysParam('b');",nil,array("a":1,"b":2),30);//超时为30秒。
do命令和getdo命令类似,但是do命令不等待结果的返回,这点和RDo与RDo2的差异类似。
参考:SendToClient
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,569 +0,0 @@
#### 第三方交互函数
##### 内容
- Python支持函数
- R支持函数
- MatLab支持函数
- 彭博终端支撑函数
- Html
- do方式对外部语言的调用
- COM接口
- JAVA方法的调用
##### Python支持函数
###### 内容
- Python支持函数简介
- PyPutVar
- PyGetVar
- PyRun
- PyCall
- PyRelease
- PyEnsure
- 调用Python范例
- PyError
###### Python支持函数简介
要使用Python的引擎,首先需要将对应于客户端(如在脚本调用则为TSL.EXE)的相应位数的版本(32位对应32位,64位对应于64位)的python相应支持DLL所在位置加入系统或者PATH中,并在天软存贮目录的plugin\FileMgr.ini中加入
[Python Config]
Enabled=1
version=3
如果是版本2.7的就用version=2
###### PyPutVar
###### PyGetVar
###### PyRun
用途:Python支持函数相关函数。
参数:arg1(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
s := "a=1
b := 1
if a == 1:
b := 2
";
PyRun(s);
return array("a":pygetvar("a"), "b":pygetvar("b"));
```
本地执行返回结果:
###### PyCall
用途:Python支持函数相关函数。
参数:arg1arg2,arg3,arg4(按示例顺序传入)。
返回:处理后的结果值。
范例
```tsl
rdo2 PyRun("import numpy");
// 不给状态值,默认方式下调用python的randint函数
return rdo2 PyCall('numpy.random', 'randint', 6, 9);
// 参数通过数组方式传入
return PyCall(2, 'numpy.random', 'randint', array('high':9, 'low':6));
// 一个个指定参数方式传入
return PyCall('numpy.random', 'randint', high:9, low:6);
```
###### PyRelease
###### PyEnsure
###### 调用Python范例
例1:
```tsl
a := 2;
pyputvar("a", a); // 送入变量
pyrun("a = a+1"); // 计算
b := pygetvar("a"); // 获取变量返回结果为 3
// 例2:
PyRun("import math"); // 执行python语句 :导入python的math模块
a := PyCall("math", "sqrt", 2); // a = 1.4142135623731
// 调用math模块下的sqrt(开方)函数,参数为2;
b := PyCall("math", "pow", 2, 3); // b = 8;
// 调用math模块下的pow函数,参数为2,3;
return C := a * b;
```
###### PyError
用途:获取最近一次 Python 调用错误信息。
参数:无。
返回:错误信息字符串。
范例
本地执行以下脚本
```tsl
pyrun("a=math.pi"); // 此处会报错因为没有 import math
return PyError();
```
返回: name 'math' is not defined
##### R支持函数
###### 内容
- R支持函数简介
- REVal
- RGetVar
- RPutVar
- REnsure
- RRelease
- R支持函数范例
###### R支持函数简介
要使用R的引擎,首先需要将对应于客户端(如在脚本调用则为TSL.EXE)的相应位数的版本(32位对应32位,64位对应于64位)的R.DLL所在位置加入系统或者PATH中,并在天软存贮目录的plugin\FileMgr.ini中加入
[R Config]
Enabled=1
天软平台尝试对R进行了多线程支持,但由于R语言本身的缺陷,多线程调用R会存在内存泄露等问题。因此,尽管TSL语言支持R语言的多线程调用并经过了测试,天软依旧不建议多线程下调用R语言。
###### REVal
###### RGetVar
###### RPutVar
###### REnsure
###### RRelease
- R支持函数简介
- REVal
- RGetVar
- RPutVar
- REnsure
- RRelease
- R支持函数范例
###### R支持函数范例
Rdo2 RPutVar("a",array(1,2,3,4));
Ret:=Rdo2 REval("b=mean(laply(a,unlist))",Code); //Code=0则正确
VarValue:=Rdo2 RGetVar("b");
return varvalue;
说明:
RputVar传递给R一个array(1,2,3,4),,并且命名为a,R那边接受的是一个list,通过laply(a,unlist)转化成R里面的数组类型,进而求均值。最后通过RgetVar得到计算的值。通过这种形式,可以很容易的实现在在天软平台调用R的函数。注意这里由于安全原因R的支持服务器不授权不能被调用,因此需要使用RDO2来测试。
##### MatLab支持函数
###### 内容
- MatLab支持函数简介
- MATLAB编译的DLL支持函数
###### MatLab支持函数简介
TSL有两种模式调用MATLAB,一种是调用编译后的MATLAB函数,另外一种是调用MATLAB引擎的函数。
无论哪种调用,均依赖系统提供的matlab.dll动态库来支持,该动态库和安装到的MATLAB的版本有关系,每一个安装的版本的MATLAB,我们均提供一个对应的DLL来进行支持,一般的,系统提供了多个版本的支持库,例如matlab.dll.2008a,matlab.2009a等,用户把自己相应安装的版本的该文件复制成为matlab.dll即可。如果找不到匹配版本的动态库,可能是您的版本过老或者太新,请联系客户服务人员进行该支持库的定制。
###### MATLAB编译的DLL支持函数
TSL语言支持通过配置的方法来支持MATLAB编译出来的函数提供调用。
TSL提供支持编译MATLAB的函数的方法:
无论是用户自己编写的,函数现有的TOOLBOX函数,在MATLAB中都是以.m文件存在的,这些m文件matlab提供了编译成DLL的方法:
假定当前目录为toolbox\garch\garch下:
用C:\Program Files\MATLAB\R2008a\toolbox\garch\garch>mcc -W lib:garch -T
link:lib
garchset garchfit garchpred ..\..\stats\norminv
可以将garchset garchfit garchpred
norminv等函数编译成DLL,假如要编译更多的TOOLBOX函数或者自己编写的M函数,只要在命令行内添加就可以了。
编译完成后会得到garch.dll(由lib:garch指定的),在TSL的相关配置文件里进行配置就可以使得mdo和mdo2函数可以对其中编译的函数进行调用。
####### 内容
- Mdo
- Mdo2
- 天软金融平台调用MATLAB的M方法的图解步骤
- MATLAB引擎支持函数
####### Mdo
####### Mdo2
####### 天软金融平台调用MATLAB的M方法的图解步骤
######## 内容
- 第一步,在MATLAB中建立C Shared Library工程
- 第二步,在工程中加入需要的M文件
- 第三步,设置好工程的相关的属性
- 第四步,编译,生成动态库
- 第五步,在金融工程平台中配置。
- 第六步,可以在金融工程平台中建模使用
- 第七步,运行的结果窗口
######## 第一步,在MATLAB中建立C Shared Library工程
######## 第二步,在工程中加入需要的M文件
以下范例为加入garchfit,garchpred,garchset,norminv等MATLAB方法
######## 第三步,设置好工程的相关的属性
######## 第四步,编译,生成动态库
######## 第五步,在金融工程平台中配置。
######## 第六步,可以在金融工程平台中建模使用
######## 第七步,运行的结果窗口
####### MATLAB引擎支持函数
要使用MATLAB的引擎,首先需要在天软的平台或者解释器以及客户端所在的目录找到当前使用的MATLAB版本难得相关支撑文件,一般来说其支撑文件的命名是matlab.dll.版本,例如matlab.dll.2013b就代表了R2013B的版本支持文件。
用户把相应的支撑文件的名字更名为matlab.dll。
对于绝大多数的MATLAB版本而言,这样就已经完成了配置,接下来的事情就是重新启动服务或者客户端,但是对于某些版本的MATLAB而言,这还不够,因为某些版本的MATLAB的路径设置有问题,用户需要手动将包含MATLAB引擎支撑库的路径加入到系统或者用户的PATH。一般来说该添加到PATH中的路径应包括安装到的目录的bin以及bin\win32或者bin\win64以及runtime\win32,runtime\win64。
######## 内容
- MEVal
- MPutVar
- MGetVar
- MGetBuf
- MClose
- MSetVisible
- MGetVisible
- MATLAB引擎调用范例
- Menablefmarray
######## MEVal
######## MPutVar
######## MGetVar
######## MGetBuf
######## MClose
######## MSetVisible
######## MGetVisible
######## MATLAB引擎调用范例
例如,用matlab做矩阵求逆的例子:
a:=rand(10,10);
MPutVar("MatlabA",a);
MEval("MatlabB=inv(a)");
b:=MGetVar("MatlabB");
由于大多数情况下MATLAB安装在客户机器上,因此,需要利用天软平台的RDO2来调用:
于是代码就变成了:
a:=rand(10,10);
RDO2 MPutVar("MatlabA",a);
RDO2 MEval(“MatlabB=inv(a)”);
b:=RDO2 MGetVar("MatlabB");
######## Menablefmarray
范例
范例代码:
```tsl
t := CreateMatrix(3, 4, array('s', 'd', 'f'), 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
rdo2 mPutVar("A", t);
rdo2 mPutVar("B", 2);
rdo2 mEval("C=A+B");
return rdo2 mGetVar("C");
```
场景一:不设置Menablefmarray
不修改上述范例代码,结果如下:
场景二:设置Menablefmarray值为0
上述范例代码前加上"rdo2 Menablefmarray(0);",结果如下:
场景三:设置Menablefmarray值为1
上述范例代码前加上"rdo2 Menablefmarray(1);",结果如下:
##### 彭博终端支撑函数
###### 内容
- 彭博终端支撑函数简介
- blpcall
- BLP测试范例
###### 彭博终端支撑函数简介
为了更好地和其他信息源进行交互,根据BLP的API,TSL封装了一个函数,用来从彭博的终端或者SERVER获得数据。
###### blpcall
###### BLP测试范例
下属例子为订阅两支指数的最新价格,价格到达则回调hello函数。
```tsl
a := array();
a[0] := array("FSSTI Index", "LAST_PRICE");
a[1] := array("DAX Index", "LAST_PRICE");
blpcall(array("maxEvent":300), "//blp/mktdata", "subscription", a, "hello");
function hello(b);
begin
echo "-----------------------------------\r\n";
if b["type"] = 8 and b["msgs"][0, "id"] = "FSSTI Index"then c[0, 1] := b["msgs"][0, "value"]["LAST_PRICE"];
else if b["type"] = 8 and b["msgs"][0, "id"] = "DAX Index"then c[1, 1] := b["msgs"][0, "value"]["LAST_PRICE"];
echo tostn(c), "\r\n";
return 1; // return
false退出, 如果一直返回真,就等到接收到系统结束的事件或者事件数达到maxEvent的规定。
end;
```
##### Html
###### 内容
- TextToHtml
- TextToURL
- HtmlToText
- URLToText
###### TextToHtml
用途:Html相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
Src := "The First LETTER won\'t be replaced by \'one\', but the Second letter will.";
return TextToHtml(Src);
// 结果:
The&#160;First&#160;LETTER&#160;won't&#160;be&#160;replaced&#160;by&#160;'one',&#160;but&#160;the&#160;Second&#160;letter&#160;will.
```
###### TextToURL
用途:Html相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
ASrc := "#abcd 10";
return TextToURL(ASrc);
// 结果:%23abcd%20%2010
```
###### HtmlToText
用途:Html相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
Src := "The&#160;First&#160;LETTER&#160;won't&#160;be&#160;replaced&#160;by&#160;'one',&#160;but&#160;the&#160;Second&#160;letter&#160;will.";
return HtmlToText(Src);
// 结果:The First LETTER won't be replaced by 'one', but the Second letter will.
```
###### URLToText
用途:Html相关函数。
参数:
返回:处理后的结果值。
范例
```tsl
aSrc := "%23abcd%20%2010";
return URLToText(aSrc);
// 结果:#abcd 10
```
##### do方式对外部语言的调用
语法:do extlanguage [paramlist] <scriptstring> [by config]
说明:
1、对外部语言的调用,in表示只送入,out表示只送出,var表示送入送出。
2、如果使用变量名,天软会默认将同名变量名送入到外部语言中。假如目标语言大小写相关,则必须用name关键字明确指定变量名。
3、对于不同的语言而言,可能有的语言存在返回值,有的语言是无返回值的。例如PYTHON没有返回值,而r有返回值。
4、如果只执行代码,参数等都可以省略。
5、对于某些语言,可能会存在其他配置的,可以通过by语法来送入。
6、目前extlanguage已经支持python,r,matlab,今后可能更多的语言会被扩展支持,底层用户也可以通过接口规范来扩展支持其他语言。
7、配合新的%%非转义字符串语法,对于调用其他语言会更方便。
下面是一个调python语言的示例:
```tsl
a := 3;
c := 2;
do python in a name"A", out b, var c
%%
c := A * c
b := c * c
%%;
```
结果c为6,b为36
##### COM接口
TSL内置了COM对象支持,支持通过创建外部com对象来调用外部组件的功能。
天软客户端也提供了COM服务,服务名为TSExpert.CoExec。利用COM访问天软平台,可以支撑包括MATLABSAS,EXCEL
VBASPLUS,R等软件。
###### 内容
- 外部COM对象的创建
- 天软客户端COM接口
###### 外部COM对象的创建
TSL内置了COM对象支持,支持通过创建外部com对象来调用外部组件的功能。
TSL中提供一个简单的方法GetOleObject来创建COM对象。
COM的调用和TSL的对象的调用是没有差异的,也非常类似于PASCAL以及VB等对COM对象的调用。每个COM对象方法或者属性的调用要么返回一个TSL基本类型,如数组,数字,字符串,NIL等,要么返回一个COM对象。
例如:
```tsl
GetOleObject(“Excel.Application”, 0, Obj);
Obj.WorkBooks.Open(“C:\\1.xls”);
```
上边的代码Obj.WorkBooks隐含着返回了一个WorkBooks对象
###### 天软客户端COM接口
##### JAVA方法的调用
JAVA类型在TSL语言中是一个内置的对象。
利用TJObject可以创建Java的对象,利用TJClass可以获得Java的类。
使用Java对象或者Java的类和Java并无大的差异
==========tjclass的使用范例=============
```tsl
systemClass := new TJClass("java/lang/System");
properties := systemClass.getProperties();
systemClass.out.println(properties.getProperty("java.class.path"));
```
==========tjobject使用范例==============
```tsl
// 构造StringBuffer对象
sbObj := new TJObject("java/lang/StringBuffer", "hello world");
// 调用对象的insert方法
ret := sbObj.insert(6, "天软");
// 调用toString方法
str := sbObj.toString();
// 显示: hello 天软 world
echo str, "\r\n";
```
###### 内容
- Java参数类型的转换
###### Java参数类型的转换
绝大多数的数据类型, TSL与Java之间会做隐式类型转换, TSL支持显式的数据类型转换这是由JavaEncode以及
JavaDecode来实现的
==============JavaEncode JavaDecode范例==================
```tsl
// char[]构造, Unicode字符集, JavaEncode负责生成Unicode编码的char数组
charArr := JavaEncode("chararray", "Tinysoft天软");
strObj := new TJObject("java/lang/String", charArr);
SystemClass.out.println(strObj.toString());
// 构造字符串
strObj := new TJObject("java/lang/String", "天软科技");
// 得到byte数组,系统默认字符集
byteArray := strObj.getBytes();
// byte数组转换为字符串
str := JavaDecode("String", byteArray);
echo str, "\r\n";
```
========================================================
JavaEncode支持的显式转换的类型有:
"CharArray", "ByteArray", "CurrentClass"
JavaDecode支持的显式类型有
"String","WString"
由于绝大多数数据类型已经在隐式转换里自动支持,例如array(1.0,2.0)会映射到float[]
如存在有需要显式转换的其他类型今后将会根据具体需求进行升级
=========================================================