🗑️ 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:
File diff suppressed because it is too large
Load Diff
@@ -1,610 +0,0 @@
|
||||
# 02 控制流与异常
|
||||
|
||||
本章汇总流程控制、错误控制与调试相关语句。
|
||||
|
||||
## 目录
|
||||
|
||||
- [02 控制流与异常](#02-控制流与异常)
|
||||
- [目录](#目录)
|
||||
- [流程控制语句](#流程控制语句)
|
||||
- [条件语句](#条件语句)
|
||||
- [IF](#if)
|
||||
- [IF 表达式](#if-表达式)
|
||||
- [CASE](#case)
|
||||
- [循环语句](#循环语句)
|
||||
- [WHILE](#while)
|
||||
- [REPEAT](#repeat)
|
||||
- [FOR](#for)
|
||||
- [BREAK](#break)
|
||||
- [CONTINUE](#continue)
|
||||
- [GOTO](#goto)
|
||||
- [错误控制,以及调试语句](#错误控制以及调试语句)
|
||||
- [异常处理 Try Except/Finally](#异常处理-try-exceptfinally)
|
||||
- [ExceptObject 异常对象](#exceptobject-异常对象)
|
||||
- [RAISE](#raise)
|
||||
- [DEBUGRETURN](#debugreturn)
|
||||
- [DebugRunEnv 与 DebugRunEnvDo](#debugrunenv-与-debugrunenvdo)
|
||||
- [MTIC,MTOC 计算运算时间](#mticmtoc-计算运算时间)
|
||||
- [SetProfiler,GetProfilerInfo 优化信息](#setprofilergetprofilerinfo-优化信息)
|
||||
- [调用信息与代码行号](#调用信息与代码行号)
|
||||
- [函数的返回和退出](#函数的返回和退出)
|
||||
|
||||
## 流程控制语句
|
||||
|
||||
### 条件语句
|
||||
|
||||
#### IF
|
||||
|
||||
if 语句是由一个布尔表达式和两个供选择的操作序列组成。运行时根据布尔表达式求值结果,选取其中之一的操作序列执行。有两种形式的 if 语句:
|
||||
|
||||
```tsl
|
||||
if <布尔表达式> then <语句> ;
|
||||
|
||||
if <布尔表达式> then <语句1>
|
||||
else <语句2> ;
|
||||
```
|
||||
|
||||
当布尔表达式的值为真,执行 then 后面的语句;当值为假时则有两种情况:要么什么也不做,要么执行 else 后面的语句。
|
||||
|
||||
注意:
|
||||
|
||||
else 前面没有分号,因为分号是两个语句之间的分隔符,而 else 并非语句。如果在该处添了分号,则远程服务器在编译的时候就会认为 if 语句到此结束,而把 else 当作另一句的开头,这样就会输出出错信息。
|
||||
|
||||
语句可以是一条语句或是一组语句,如果是一组语句时,这组语句必须使用 Begin …
|
||||
end 标识符来限定,写成复合语句。在用 if 语句连续嵌套时,如果你插入适量的复合语句,有利于程序的阅读和理解。
|
||||
|
||||
例 2:求 y=f(x),当 x>0 时,y=1,当 x=0 时,y=0,当 x<0 时,y=-1。
|
||||
|
||||
```tsl
|
||||
function IfExample(x);
|
||||
begin
|
||||
if x > 0 then
|
||||
y := 1;
|
||||
else if x = 0 then
|
||||
y := 0;
|
||||
else
|
||||
y := -1;
|
||||
return y;
|
||||
end;
|
||||
```
|
||||
|
||||
例 3:当 x>0 时候,计算 x*x,并且输出 x*x,否则输出 0。
|
||||
|
||||
```tsl
|
||||
function IfExample2(x);
|
||||
begin
|
||||
if x >= 0 then
|
||||
begin
|
||||
x1 := x * x;
|
||||
return x1;
|
||||
end
|
||||
else return 0;
|
||||
end;
|
||||
```
|
||||
|
||||
注意:当 if 语句嵌套时,TSL 约定 else 总是和最近的一个 if 配对。
|
||||
|
||||
#### IF 表达式
|
||||
|
||||
if 表达式是一种条件表达式,它根据条件的真假来返回不同的值。它与 if 语句不同:
|
||||
|
||||
if 语句:是一种控制流语句,用于决定是否执行某段代码块,本身不返回值。
|
||||
|
||||
if 表达式:会计算一个结果,这个结果可以赋值给变量、作为函数参数或在其他表达式中使用。功能类似三元运算符,但 if 表达式更通用,可读性更高
|
||||
|
||||
其基本形式通常如下:
|
||||
|
||||
if 条件 then 值1 else 值2
|
||||
|
||||
例如 if a>1 then 2 else 1,如果 a 大于 1,整个表达式的结果就是 2,否则是 1。
|
||||
|
||||
if 表达式必须存在 else 部分,主要是为了确保表达式始终有确定的返回值。如果没有 else,当条件为假时,表达式的返回值将是不确定的。
|
||||
|
||||
注:仅 2025-08-27 以后的语言版本支持此功能
|
||||
|
||||
示例:
|
||||
|
||||
```tsl
|
||||
ret := if x > 0 then x * x else 0;
|
||||
return ret;
|
||||
```
|
||||
|
||||
当 x>0,返回 x\*x;x<=0 时,返回 0。
|
||||
|
||||
多个分支:
|
||||
|
||||
```tsl
|
||||
ret := if x > 0 then x * x else if x < 0 then - (x * x) else 0;
|
||||
return ret;
|
||||
```
|
||||
|
||||
当 x>0,返回 x*x;x<0 时,返回-x*x;x=0,返回 0。
|
||||
|
||||
#### CASE
|
||||
|
||||
多分支条件语句,Case of
|
||||
|
||||
语法一:普通语法。
|
||||
|
||||
```tsl
|
||||
case <Expression> of
|
||||
<情况标号表 1>: 语句 1;
|
||||
<情况标号表 2>: 语句 2;
|
||||
...
|
||||
<情况标号表 N>: 语句 N;
|
||||
[else 例外语句;]
|
||||
end;
|
||||
```
|
||||
|
||||
情况标号表的语法为:
|
||||
|
||||
```tsl
|
||||
case 区间 1[, case 区间 2 .. case 区间 N]
|
||||
区间开始值 [to 区间结束值]
|
||||
```
|
||||
|
||||
如果没有 TO 语句,则结束值和开始值相同。
|
||||
|
||||
例:
|
||||
|
||||
```tsl
|
||||
function CaseExample(Age);
|
||||
begin
|
||||
case Age of
|
||||
0: Writeln("婴儿");
|
||||
1, 2: Writeln("婴幼儿");
|
||||
3 to 6: Writeln("幼儿");
|
||||
7 to 14: Writeln("少年");
|
||||
15 to 17: Writeln("青少年");
|
||||
else
|
||||
Writeln("成年");
|
||||
end;
|
||||
end;
|
||||
```
|
||||
|
||||
语法二:支持 Case 表达式,在该种情况下,分支语句不支持语句段,只能是单语句表达式。
|
||||
|
||||
```tsl
|
||||
B := case <Expression> of
|
||||
<情况标号表 1> : 表达式 1;
|
||||
<情况标号表 2> : 表达式 2;
|
||||
```
|
||||
|
||||
…(其它的与普通用法一致)
|
||||
|
||||
范例:
|
||||
|
||||
范例一:
|
||||
|
||||
```tsl
|
||||
a := 3;
|
||||
b := case a of
|
||||
1, 2: "1/2";
|
||||
3, 4: "3/4";
|
||||
else "OTHER";
|
||||
end;
|
||||
return b;
|
||||
```
|
||||
|
||||
结果:3/4
|
||||
|
||||
范例二:
|
||||
|
||||
```tsl
|
||||
a := 3;
|
||||
b := case a of
|
||||
1, 2: echo "1/2";
|
||||
3, 4: echo "3/4";
|
||||
else "OTHER";
|
||||
end;
|
||||
return b;
|
||||
```
|
||||
|
||||
结果:0。打印窗口:3/4
|
||||
|
||||
范例三:表达式的用法
|
||||
|
||||
```tsl
|
||||
b := @case a of
|
||||
1, 2: "1/2";
|
||||
3, 4: "3/4";
|
||||
else "OTHER";
|
||||
end;
|
||||
a := 2;
|
||||
return eval(b);
|
||||
```
|
||||
|
||||
结果:1/2
|
||||
|
||||
### 循环语句
|
||||
|
||||
当需要重复执行一条或是一组语句时,可以使用循环控制语句。TSL 中的循环控制语句有 While 语句和 For 语句。
|
||||
|
||||
#### WHILE
|
||||
|
||||
while 语句用于"当满足某一条件时重复执行语句"的情况。while 语句的语法格式:
|
||||
|
||||
while 布尔表达式 do 语句;
|
||||
|
||||
循环结束条件在进入循环体之前测试,若最初的测试值为 false,则根本不进入循环体。为了能使 while 重复能终止,循环体中一定要有影响布尔表达式的操作,否则该循就是一个死循环。
|
||||
|
||||
说明:
|
||||
|
||||
语句可以是一条语句或是一组语句,如果是一组语句时,这组语句必须使用 Begin …
|
||||
end 标识符来限定,写成复合语句。
|
||||
|
||||
例 4:计算从 0 到某个数之间的和。
|
||||
|
||||
```tsl
|
||||
function sums(limit);
|
||||
begin
|
||||
sum := 0;
|
||||
num := 0;
|
||||
while num <= limit do
|
||||
begin
|
||||
sum := sum + num;
|
||||
num++;
|
||||
end;
|
||||
return sum;
|
||||
end;
|
||||
```
|
||||
|
||||
#### REPEAT
|
||||
|
||||
repeat 语句用于”重复执行语句直到满足某一条件”的情况。repeat 语句的语法格式:
|
||||
|
||||
```tsl
|
||||
repeat
|
||||
// 语句段;
|
||||
until 布尔表达式;
|
||||
```
|
||||
|
||||
说明:
|
||||
|
||||
repeat 与 while 不同之处有几点:
|
||||
|
||||
1,repeat 先做后判断是否结束,while 先判断后做,也就是说 repeat 至少会做一次;
|
||||
|
||||
2,repeat 的判断条件是结束条件,而 while 的判定条件是开始做的条件;
|
||||
|
||||
3,repeat 和 util 之间可以有语句段,不需要 begin
|
||||
end 来限定,而 while 由于没有结束的特殊标识符,因此当使用语句段的时候必须用 begin
|
||||
end 来约束。
|
||||
|
||||
例 5:求第一个阶乘超过指定值的值
|
||||
|
||||
```tsl
|
||||
function MinMultiValue(limit);
|
||||
begin
|
||||
multi := 1;
|
||||
value := 1;
|
||||
repeat
|
||||
multi := multi * value;
|
||||
value++;
|
||||
until multi > limit;
|
||||
return value;
|
||||
end;
|
||||
```
|
||||
|
||||
#### FOR
|
||||
|
||||
```tsl
|
||||
for 语句用来描述已知重复次数的循环结构。for 语句有三种形式:
|
||||
(1) for 控制变量 := 初值 to 终值 [step 步长] do 语句;
|
||||
(2) for 控制变量 := 初值 downto 终值 [step 步长] do 语句;
|
||||
(3) for 控制变量 1,控制变量 2 in 数组 do 语句;
|
||||
```
|
||||
|
||||
第一种形式的 for 语句是递增循环。
|
||||
|
||||
首先将初值赋给控制变量,接着判断控制变量的值是否小于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值该为它的后继值,并重新判断是否小于或等于终值。当控制变量的值大于终值时,退出 for 循环,执行 for 语句之后的语句。
|
||||
|
||||
可通过 step N 方式指定递增步长,可省,默认为 1。
|
||||
|
||||
第二种形式的 for 语句是递减循环。
|
||||
|
||||
首先将初值赋给控制变量,接着判断控制变量的值是否大于或等于终值,若是,则执行循环体,在执行了循环体之后,自动将控制变量的值该为它的前趋值,并重新判断是否大于或等于终值。当控制变量的值小于终值时,退出 for 循环,执行 for 语句之后的语句。
|
||||
|
||||
可通过 step N 方式指定递减步长,可省,默认为 1。
|
||||
|
||||
注意:for 语句中,当初值、终值、步长确定后,重复的次数就确定不变了,并且控制变量在重复语句内不能施加任何赋值操作。
|
||||
|
||||
例如:计算 1+2+3+……+99+100 的值
|
||||
|
||||
```tsl
|
||||
function PlusFor();
|
||||
begin
|
||||
sum := 0;
|
||||
for i := 1 to 100 do sum := sum + i; // 缺省步长,默认步长为 1
|
||||
return sum;
|
||||
end;
|
||||
```
|
||||
|
||||
例如:计算 1+3+5+……+99 的值
|
||||
|
||||
```tsl
|
||||
function PlusFor2();
|
||||
begin
|
||||
sum := 0;
|
||||
for i := 1 to 100 step 2 do sum := sum + i;
|
||||
return sum;
|
||||
end;
|
||||
```
|
||||
|
||||
第三种形式的 for 语句是直接对数组进行遍历
|
||||
|
||||
对数组中的每一行(第一维)进行遍历,当前行的下标存放在第一个控制变量中,该行对应的值存放在第二个控制变量中。从第一行开始,将行标与当前行的值分别赋值给控制变量 1 与控制变量 2 后,执行循环体,在执行了循环体之后,自动将 2 个控制变量的值赋值为下一行的下标及该行值,当遍历完最后一行之后,退出 for 循环,执行 for 语句之后的语句。
|
||||
|
||||
for … in 遍历的用法说明
|
||||
|
||||
语法:For i,v IN TArray DO 语句;说明:对数据的遍历。
|
||||
|
||||
其中,i:控制变量 1,获取当前循环中数组第一维的下标值 v:控制变量 2,对应当前循环中第一维度的值
|
||||
|
||||
TArray:需要被遍历的数组。
|
||||
|
||||
注 1:二维及多维数组可当作一维处理,此时的控制变量 2 的值则可能是一个数组。
|
||||
|
||||
注 2:在此过程中,不可更改一维数组的值,也不可对该数组中的任何元素进行赋值操作,对在循环过程中不可对循环数组 TArray 进行变更操作。
|
||||
|
||||
适应场景:对于非数字下标的数组,处理比较方便,且效率高
|
||||
|
||||
范例一:一维数组的应用
|
||||
|
||||
```tsl
|
||||
data := array('a': 1, 'b': 5, 'c': 3, 'd': -2);
|
||||
s := 0;
|
||||
for i, v in data do s += v;
|
||||
return s;
|
||||
```
|
||||
|
||||
返回:7
|
||||
|
||||
范例二:二维数组的应用
|
||||
|
||||
```tsl
|
||||
data := rand(array('a', 'b', 'c'), array('AA', 'BB', 'CC', 'DD'));
|
||||
s := 0;
|
||||
t := 1;
|
||||
for i, v in data do // data 是二维数组,所以第一维中 v 的值是当前行的一维数组
|
||||
for j, v1 in v do
|
||||
begin
|
||||
s += v1;
|
||||
t *= v1;
|
||||
end;
|
||||
return array(s, t);
|
||||
```
|
||||
|
||||
返回:array(12,1)
|
||||
|
||||
#### BREAK
|
||||
|
||||
在执行 WHILE 和 FOR 以及 REPEAT
|
||||
until 循环语句时,可以用 break 语句随时从当前循环的语句段中跳出来,并继续执行循环语句后面的语句。
|
||||
|
||||
注意:Break 语句只是从当前的语句循环中跳出来,如果要从多个嵌套的循环语句中跳出,则需要通过多个对应的 Break 语句来完成。
|
||||
|
||||
例 7:我们用 While 语句和 Break 语句重新来例 5 中的 1+2+3+……+99+100 值
|
||||
|
||||
```tsl
|
||||
function PlusWhile();
|
||||
begin
|
||||
sum := 0;
|
||||
i := 0;
|
||||
while true do
|
||||
begin
|
||||
i++;
|
||||
if i > 100 then break;
|
||||
sum := sum + i;
|
||||
end;
|
||||
return sum; // break 后执行的第一行语句
|
||||
end;
|
||||
```
|
||||
|
||||
#### CONTINUE
|
||||
|
||||
CONTINUE 语句和 BREAK 语句一样,都可以改变 WHILE 循环语句和 FOR 循环语句以及 REPEAT
|
||||
until 的执行顺序。
|
||||
|
||||
BREAK 是强制地从一个循环语句中跳出来,提前结束循环,而 CONTINUE 语句则强制地结束当前循环开始进入下一次循环。
|
||||
|
||||
如:
|
||||
|
||||
```tsl
|
||||
while true do
|
||||
begin
|
||||
i++;
|
||||
if i = 100 then continue; // 跳过 100
|
||||
if i >= 1000 then break; // 到 1000 结束
|
||||
end;
|
||||
```
|
||||
|
||||
### GOTO
|
||||
|
||||
几乎所有的分支流程控制语句都指令跳转有关,只是绝大多数情况下是有条件跳转,GOTO 是无条件跳转语句,其规则是使用 label 定义标号,使用 goto 可以跳转到指定的标号。
|
||||
|
||||
一个 GOTO 的案例:
|
||||
|
||||
```tsl
|
||||
for i := 0 to length(data) - 1 do
|
||||
begin
|
||||
for j := 0 to length(data[i]) - 1 do
|
||||
begin
|
||||
if data[i][j] = target then
|
||||
begin
|
||||
goto finded;
|
||||
end;
|
||||
end;
|
||||
end;
|
||||
label finded;
|
||||
// 在二维数组中查找,找到即结束
|
||||
```
|
||||
|
||||
goto 有一个特性,就是只能从内层往外层跳转(且不能跨越函数)
|
||||
|
||||
### 错误控制,以及调试语句
|
||||
|
||||
#### 异常处理 Try Except/Finally
|
||||
|
||||
某些函数在执行的过程中可能会自动抛出异常,或者被手动 Raise 抛出异常,这个时候如果没有异常处理运行就会终止。
|
||||
|
||||
使用异常处理则可以保护程序继续执行,并可以对异常进行相应的处理。异常的信息可以由 ExceptObject 对象获得,异常处理使用如下模式:
|
||||
|
||||
```tsl
|
||||
try
|
||||
// 被保护的程序执行段
|
||||
except
|
||||
// 异常处理程序段
|
||||
end;
|
||||
```
|
||||
|
||||
例如:
|
||||
|
||||
```tsl
|
||||
try
|
||||
I := StrToInt(S); // 当 S 不能转换为整数时会产生异常
|
||||
except
|
||||
I := 0; // 当发生异常时设置 I 为 0
|
||||
Writeln(ExceptObject.ErrInfo);
|
||||
end;
|
||||
```
|
||||
|
||||
对于某个程序段可能出现中途返回或者退出,或者中途被异常中断,而某些代码必需要在其后执行的,则采用如下模式:
|
||||
|
||||
```tsl
|
||||
try
|
||||
// 被保护的程序执行段
|
||||
finally
|
||||
// 保证执行的处理程序段,即便Try Finally之间的语句有返回或者异常产生。
|
||||
end;
|
||||
```
|
||||
|
||||
注:try...Except...end 可以使程序在报错时继续向下运行,即主程序不终止。
|
||||
|
||||
try...finally...end 则是该报错时就会报错,即发生错误时程序会报错且终止,只是在中断前会执行完 finally 中的命令行。
|
||||
|
||||
#### ExceptObject 异常对象
|
||||
|
||||
在 Except 块中,可以用 ExceptObject 获得当前的异常信息。
|
||||
|
||||
ExceptObject 是一个异常对象,包括以下几个成员:
|
||||
|
||||
ExceptObject. ErrInfo 获得错误的信息串
|
||||
|
||||
ExceptObject. ErrLine 错误的行号
|
||||
|
||||
ExceptObject. ErrNo 错误号
|
||||
|
||||
例如:
|
||||
|
||||
```tsl
|
||||
a := 100;
|
||||
try
|
||||
a := 1 + 'a';
|
||||
except
|
||||
echo ExceptObject.ErrInfo;
|
||||
end;
|
||||
return a;
|
||||
```
|
||||
|
||||
打印结果:
|
||||
|
||||
function:NoName501:line 11:instruction:+: Addition instruction error,operand
|
||||
type error
|
||||
|
||||
#### RAISE
|
||||
|
||||
主动抛出运行时异常,会引发程序出错并终止运行,RAISE 后跟随一个字符串,该字符串为出错返回的错误信息。
|
||||
|
||||
如:
|
||||
|
||||
```tsl
|
||||
A := -1;
|
||||
if a < 0 then raise “a不能小于0”;
|
||||
```
|
||||
|
||||
运行时报错如:
|
||||
|
||||
#### DEBUGRETURN
|
||||
|
||||
调试返回,后面跟返回值,可在任何地方直接将结果返回,而不是象 RETURN 一样返回到上一级别,这有助于用户调试使用。
|
||||
|
||||
如下面示例,返回为 3 而不是 4:
|
||||
|
||||
```tsl
|
||||
A := abcd(3);
|
||||
return A + 1;
|
||||
function abcd(bb);
|
||||
begin
|
||||
debugreturn
|
||||
bb;
|
||||
end;
|
||||
```
|
||||
|
||||
#### DebugRunEnv 与 DebugRunEnvDo
|
||||
|
||||
DebugRunEnv(0)与 DebugRunEnv(1)
|
||||
|
||||
DebugRunEnv(0)可以将所有的变量内容递交到客户端的调试窗口
|
||||
|
||||
DebugRunEnv(1)可以将变量以及系统参数的内容递交到客户端的调试窗口
|
||||
|
||||
DebugRunEnvDo FunctionXX(….)
|
||||
|
||||
运行完指定的函数以后返回该函数最后的变量结果
|
||||
|
||||
#### MTIC,MTOC 计算运算时间
|
||||
|
||||
可以通过 MTIC 与 MTOC 记录一段程序运行的时间。
|
||||
|
||||
一般使用:以上代码可以计算所耗费的秒数
|
||||
|
||||
```tsl
|
||||
MTIC
|
||||
;
|
||||
A := 0;
|
||||
for i := 0 to 99999 do  A++;
|
||||
return
|
||||
MTOC
|
||||
;
|
||||
```
|
||||
|
||||
扩展使用:同时统计多段程序的运行时间
|
||||
|
||||
默认 MTOC 和上次 MTIC 匹配,但是也可以指定某个 MTIC 的返回来计算时间
|
||||
|
||||
```tsl
|
||||
T1 :=
|
||||
MTIC
|
||||
;
|
||||
for i := 0 to 9999 do A++;
|
||||
TE1 :=
|
||||
MTOC(T1)
|
||||
;
|
||||
MTIC;
|
||||
for j := 0 to 9999 do A++;
|
||||
TE2 :=
|
||||
MTOC(T1)
|
||||
;
|
||||
return array(TE1, TE2,
|
||||
MTOC
|
||||
);
|
||||
```
|
||||
|
||||
返回结果中:TE1 为第一段循环运行的时间,TE2 为两段循环运行的时间,第三个值为第二段循环运行的时间。
|
||||
|
||||
#### SetProfiler,GetProfilerInfo 优化信息
|
||||
|
||||
在程序中可通过指定 SetProfiler 指定运行时计算用户函数,系统函数,以及运算指令的耗费时间,最后通过 GetProfilerInfo()获得这些信息,如果不用 GetProfilerInfo,返回时会自动新建 Profiler 窗口来显示这些信息,客户端可以在运行时指定优化信息系统参数。
|
||||
|
||||
函数具体用法及优化信息结构可参考:SetProfiler、GetProfilerInfo
|
||||
|
||||
#### 调用信息与代码行号
|
||||
|
||||
通过关键字\_\_stack_frame 获得调用的堆栈的函数名以及行号
|
||||
|
||||
通过关键字**line**获得当前所在的行号
|
||||
|
||||
### 函数的返回和退出
|
||||
|
||||
参见函数返回以及退出
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,731 +0,0 @@
|
||||
# 04 单元/命名空间/函数文件
|
||||
|
||||
本章整理 UNIT 单元、TSF 函数文件与 NAMESPACE 命名空间等组织机制。
|
||||
|
||||
## 目录
|
||||
|
||||
- [04 单元/命名空间/函数文件](#04-单元命名空间函数文件)
|
||||
- [目录](#目录)
|
||||
- [UNIT 单元管理](#unit-单元管理)
|
||||
- [UNIT 单元的支持](#unit-单元的支持)
|
||||
- [UNIT 单元的支持简介](#unit-单元的支持简介)
|
||||
- [UNIT 单元的定义规范](#unit-单元的定义规范)
|
||||
- [Interface](#interface)
|
||||
- [Implementation](#implementation)
|
||||
- [Initialization](#initialization)
|
||||
- [Finalization](#finalization)
|
||||
- [End.单元结束符](#end单元结束符)
|
||||
- [Uses 引用单元](#uses-引用单元)
|
||||
- [单元方法参数缺省值支持单元常量](#单元方法参数缺省值支持单元常量)
|
||||
- [单元的意义](#单元的意义)
|
||||
- [封装](#封装)
|
||||
- [隐藏](#隐藏)
|
||||
- [初始化和清理](#初始化和清理)
|
||||
- [单元的特殊定义](#单元的特殊定义)
|
||||
- [UNIT 单元中常量与变量](#unit-单元中常量与变量)
|
||||
- [Unit 的使用](#unit-的使用)
|
||||
- [Uses 子句](#uses-子句)
|
||||
- [在 function 中使用 uses](#在-function-中使用-uses)
|
||||
- [在 Class 中使用 uses](#在-class-中使用-uses)
|
||||
- [在 unit 中使用 uses](#在-unit-中使用-uses)
|
||||
- [在.tsf 或者.tsl 中使用 uses](#在tsf-或者tsl-中使用-uses)
|
||||
- [调用 Unit 中的接口函数](#调用-unit-中的接口函数)
|
||||
- [Unit 的作用域](#unit-的作用域)
|
||||
- [重名函数的引用优先级以及处理方法](#重名函数的引用优先级以及处理方法)
|
||||
- [重名类的引用优先级以及处理方法](#重名类的引用优先级以及处理方法)
|
||||
- [单元对函数调用影响](#单元对函数调用影响)
|
||||
- [函数文件以及命名空间](#函数文件以及命名空间)
|
||||
- [TSF 文件函数的存贮](#tsf-文件函数的存贮)
|
||||
- [NAMESPACE 命名空间](#namespace-命名空间)
|
||||
- [TslFileName](#tslfilename)
|
||||
- [sysgettsllibpath](#sysgettsllibpath)
|
||||
- [syssettsllibpath](#syssettsllibpath)
|
||||
- [扩展函数查找路径](#扩展函数查找路径)
|
||||
- [1、临时性扩展函数查找路径:TSL.EXE -libpath 参数](#1临时性扩展函数查找路径tslexe-libpath-参数)
|
||||
- [2、配置文件扩展函数查找路径:tsl.conf 配置文件 system 中 libpath 参数](#2配置文件扩展函数查找路径tslconf-配置文件-system-中-libpath-参数)
|
||||
|
||||
## UNIT 单元管理
|
||||
|
||||
### UNIT 单元的支持
|
||||
|
||||
#### UNIT 单元的支持简介
|
||||
|
||||
什么是单元?
|
||||
|
||||
当公共的函数库越来越多的时候,函数很容易同名,虽然可以通过更名的方式解决函数同名问题,但是当函数越来越多的时候,用户需要把一组处理一类问题的函数放在一起,这样便于使用的查找,也便于源代码的管理,这个时候,TSL 引入了 UNIT 关键字,提供对单元的支持。
|
||||
|
||||
在许多其他的语言中,提供了类似于 TSL 语言的单元的功能,例如有的称之为 Package 即包,有的称之为 Library 即库,在这里我们姑且均称之为单元。大体的使用模式无外乎在某个单元内封装很多的内容,这些内容在没有引用的时候用户是无法调用的,调用之时需要利用特殊的引用关键字去使用。在 TSL 语言中,引用单元的关键字是 uses,这点与 Object
|
||||
Pascal 语言相同,在其他的语言中,有用 import、using 等做为关键字,事实上,从语义上看起来也非常类似。
|
||||
|
||||
事实上,单元不仅仅提供函数的整合管理,其中还可以包括有类等内容,对于支持全局常量和变量的语言而言,其中还可以定义变量和常量。单元中的内容可以是可视的,亦可以是私有非可视的。
|
||||
|
||||
单元还提供初始化和结束的方法,当有一组函数都需要有初始化代码的时候,这样可以使得在单元的函数可以共用初始化代码,而不需要在每一个函数中去初始化并且检查初始化的状态。
|
||||
|
||||
#### UNIT 单元的定义规范
|
||||
|
||||
我们不妨来看一段 UNIT 的范例代码:
|
||||
|
||||
```tsl
|
||||
unit
|
||||
SampleUnit; // 单元名称
|
||||
interface
|
||||
// 单元属性及单元方法的声明,在此处声明的属性与方法可被外部访问
|
||||
uses Unit1, Unit2; // uses statement 引用其它单元
|
||||
function InterfaceFunction(); // place publish function header here
|
||||
implementation
|
||||
// 可定义私有属性及单元方法的实现,在此处新增的属性及方法仅能当前单元内部引用
|
||||
uses Unit3, Unit4.; // uses statement
|
||||
function InterfaceFunction(); // place function body here
|
||||
begin
|
||||
PrivateFunction();
|
||||
end;
|
||||
function PrivateFunction(); // this is a private function can be called inside only
|
||||
begin
|
||||
end;
|
||||
procedure InitCode();
|
||||
begin
|
||||
echo "Initialization\r\n";
|
||||
end;
|
||||
procedure FinalCode();
|
||||
begin
|
||||
echo "Finalization\r\n";
|
||||
end;
|
||||
Initialization
|
||||
// 单元初始化
|
||||
// Unit Initial statement here
|
||||
InitCode();
|
||||
Finalization
|
||||
// 单元释放前执行的过程
|
||||
// Unit Final statement here
|
||||
FinalCode();
|
||||
end.
|
||||
```
|
||||
|
||||
我们可以看到,单元的定义是以关键字 unit 开始的,其后紧跟单元的名字,在其后有一个 interface 关键字,表示接口段。
|
||||
|
||||
##### Interface
|
||||
|
||||
声明外部访问的属性及方法等,在 interface 之内声明的属性与方法可被外部访问。
|
||||
|
||||
可以用 uses 来引用其他的单元(在接口段内 uses 的单元将在本单元内全局可视可直接使用),之后就是接口段内的内容,放在接口段内的内容(例如属性、函数头定义、类)将变得可视可被引用。
|
||||
|
||||
紧跟着 Interface 段的是由关键字 Implementation 开始的实现段。
|
||||
|
||||
##### Implementation
|
||||
|
||||
定义私有属性及单元方法的实现,在此处新增的属性及方法仅能在当前单元内部引用
|
||||
|
||||
在实现段里也可以引用其他单元,如果需要引用,可以用 uses 紧跟在 Implementation 后来引用(这里的引用的单元对 interface 段不可视),实现段内的内容对引用者不可视,除非该内容已经在 Interface 中将接口引出。绝大多数的语言的单元引用不支持出现在函数或者类中,而 TSL 语言的 uses 不仅仅支持在单元中引用,还支持在函数和类中引用,其后我们会具体讲述。
|
||||
|
||||
在 Implementation 后可以跟 Initialization 和 Finalization 段,从事单元的初始化和清理工作。
|
||||
|
||||
##### Initialization
|
||||
|
||||
Initialization 段内的代码将在单元被第一次引用使用的时候调用,主要从事单元的初始化工作。
|
||||
|
||||
##### Finalization
|
||||
|
||||
Finalization 段内的代码则在运行的任务结束的时候调用,主要从事单元的清理工作。
|
||||
|
||||
##### End.单元结束符
|
||||
|
||||
单元是以 End.作为结束的。
|
||||
|
||||
##### Uses 引用单元
|
||||
|
||||
在单元的 Interface 段,Implementation 段的开始,在函数的 Begin 后的第一条代码,在类定义的第一条代码可以用 Uses 引用单元,多个单元以,分隔。
|
||||
|
||||
##### 单元方法参数缺省值支持单元常量
|
||||
|
||||
单元中的函数支持参数缺省值定义中使用可以访问的 const 定义的常量。
|
||||
|
||||
例如,有一个单元 Unit_DfParamsDemo,分别定义了两个方法 funcA 与 funcB,这两个方法分别使用声明中定义缺省参数为外部可访问到的单元常量,及在实现中定义缺省参数为单元内部才能访问到的单元常量
|
||||
|
||||
```tsl
|
||||
unit Unit_DfParamsDemo;
|
||||
interface//可在单元外引用访问
|
||||
const CS = 888; // 定义一个常量,定义之后不能被修改
|
||||
// 声明中定义--支持指定interface中定义的常量
|
||||
function funcA(a, b = 100, c = CS); // 缺省参数支单元常量
|
||||
// 不在声明中定义,而在implementation实现中定义缺省参数
|
||||
function funcB(a, b, c);
|
||||
implementation//只能被当前Unit单元内的方法访问
|
||||
const CN = 999; // 定义一个私有常量
|
||||
function funcA(a, b, c); // 已在声明中定义缺省参数,此处不能重复再定义
|
||||
begin
|
||||
echo "funcA-a:", a, " b:", b, " c:", c;
|
||||
return a + b + c;
|
||||
end;
|
||||
function funcB(a, b, c = CN); // 此处定义可指定interface及implementation中已定义到的常量
|
||||
begin
|
||||
echo "funcB-a:", a, " b:", b, " c:", c;
|
||||
return a + b + c;
|
||||
end;
|
||||
initialization//初始化
|
||||
Finalization//析构前
|
||||
echo "Unit_DfParamsDemo End.";
|
||||
end.
|
||||
```
|
||||
|
||||
调用如:
|
||||
|
||||
```tsl
|
||||
uses Unit_DfParamsDemo;
|
||||
echo funcA(1);
|
||||
echo funcA(1, 2);
|
||||
echo funcB(1, 2);
|
||||
```
|
||||
|
||||
打印结果:
|
||||
|
||||
funcA-a:1 b:100 c:888
|
||||
|
||||
989
|
||||
|
||||
funcA-a:1 b:2 c:888
|
||||
|
||||
891
|
||||
|
||||
funcB-a:1 b:2 c:999
|
||||
|
||||
1002
|
||||
|
||||
Unit_DfParamsDemo End.
|
||||
|
||||
#### 单元的意义
|
||||
|
||||
##### 封装
|
||||
|
||||
单元可以将同类的功能模块放置在一起,不用使用这些功能模块的用户完全不需要关心,而需要使用的用户则可以在一个单元中集中看到所有的相关内容而不需要在一个个的分散的函数中去寻找。
|
||||
|
||||
单元中的函数往往有一些内部共用的中间函数,既无需将这些中间函数写成全局的函数,亦不需要在每一个需要的函数中独立定义私有函数,亦起到封装的效果。
|
||||
|
||||
##### 隐藏
|
||||
|
||||
```tsl
|
||||
unit 的使用具有代码重用,信息隐藏的优势。一个单元的 interface 中的所有标识符(函数,类等)对于使用该 unit 的任何程序都是可用的,而这些标识符的实现部分都隐藏在相应的 unit 中(implementation 部分)。调用者只需要知道接口部分的语法,利用 unit 中的公有方法,unit 中的内部运行机制并不是调用者需要关心的,只在 implementation 中定义而不在 interface 定义的内容是不能被 unit 的引用者访问的。
|
||||
```
|
||||
|
||||
一个例子:
|
||||
|
||||
```tsl
|
||||
unit
|
||||
UnitB;
|
||||
interface
|
||||
function
|
||||
PublicFunc;
|
||||
implementation
|
||||
function
|
||||
PublicFunc();
|
||||
begin
|
||||
echo 'Public Function is called!';
|
||||
PrivateFunc();
|
||||
end;
|
||||
;
|
||||
function
|
||||
PrivateFunc();
|
||||
begin
|
||||
Echo
|
||||
'Private Function is called!';
|
||||
end;
|
||||
;
|
||||
end.
|
||||
|
||||
function
|
||||
FunctionUsingUnit();
|
||||
begin
|
||||
uses
|
||||
UnitB
|
||||
;
|
||||
PublicFunc(); // "Public Function is called!Private Function is called!"
|
||||
PrivateFunc(); // 函数privatefunc编译错误,或者找不到该函数
|
||||
end;
|
||||
;
|
||||
```
|
||||
|
||||
##### 初始化和清理
|
||||
|
||||
用户的多个功能模块可能均需要初始化某个全局的数据,没有单元的话,要么在应用的启动代码中,要么在每个模块中均检查初始化状态并调用初始化的代码,然后在应用中执行清理工作,如果采用单元的初始化和清理的便利,就会让开发变得简便很多。
|
||||
|
||||
#### 单元的特殊定义
|
||||
|
||||
单元可以省略 Interface 和 Implementation 关键字,一旦省略关键字,所有单元内的内容均对引用者可视。
|
||||
|
||||
例:
|
||||
|
||||
```tsl
|
||||
unit SpecialUnit;
|
||||
|
||||
function Abcd();
|
||||
begin
|
||||
end;
|
||||
|
||||
function Abcd2();
|
||||
begin
|
||||
end;
|
||||
|
||||
initialization
|
||||
...
|
||||
|
||||
finalization
|
||||
...
|
||||
|
||||
end.
|
||||
```
|
||||
|
||||
#### UNIT 单元中常量与变量
|
||||
|
||||
TSL 语言 UNIT 支持在 interface 或 implementation 中定义变量或者常量,支持 findfunction 获得一个 unit 对象,unit 对象支持用.来调用方法或者 interface 里定义的变量或常量。
|
||||
|
||||
用来支持在单元中对全局变量的需求。
|
||||
|
||||
版本说明:新一代 TSL 语言中支持该功能。
|
||||
|
||||
unit 中变量的作用范围:全局变量
|
||||
|
||||
interface 中声明的变量或常量,可被对象访问。
|
||||
|
||||
implementation 中声明的变量或常量,只能被当前 unit 单元内的方法访问。
|
||||
|
||||
变量的定义:由关键字 `var` 开头,后面接变量名,多个变量名之间用逗号分隔。
|
||||
|
||||
```tsl
|
||||
// 如定义变量 UA,UC:var UA,UC;
|
||||
```
|
||||
|
||||
常量的定义:由关键字 Const 开头,后面接常量,具体用法可参考:常量及常量成员的定义与初始化
|
||||
|
||||
```tsl
|
||||
// 如定义一个常量:const UcA=100;
|
||||
```
|
||||
|
||||
外部对单元变量或常量的引用:findfunction(UnitName).UnitA
|
||||
|
||||
示例:
|
||||
|
||||
定义一个单元 DeMo_Unit_Test01 如下:
|
||||
|
||||
```tsl
|
||||
unit DeMo_Unit_Test01;
|
||||
interface
|
||||
var Ua, Ub;
|
||||
const CS = 888;
|
||||
function addv();
|
||||
function NumbJO(v); // 判断奇偶
|
||||
function print();
|
||||
implementation
|
||||
const CN = array("奇数", "偶数");
|
||||
var Uc;
|
||||
function print(); // 打印变量与常量
|
||||
begin
|
||||
echo "当前值-Ua:", Ua, " Ub:", Ub, " Uc:", Uc, " CS:", CS;
|
||||
end;
|
||||
function addv();
|
||||
begin
|
||||
Ua += 10;
|
||||
Uc += 1;
|
||||
end;
|
||||
function NumbJO(v);
|
||||
begin
|
||||
if (v mod 2) = 0 then echo v, "是一个", CN[1];
|
||||
else echo v, "是一个", CN[0];
|
||||
end;
|
||||
initialization//初始化
|
||||
Ua := 100;
|
||||
Ub := "Tinysoft Unit";
|
||||
Uc := 1;
|
||||
Finalization//析构前
|
||||
echo "DeMo_Unit_Test01 End.";
|
||||
end.
|
||||
```
|
||||
|
||||
应用展示:
|
||||
|
||||
```tsl
|
||||
uses DeMo_Unit_Test01;
|
||||
obj := findfunction("DeMo_Unit_Test01"); // 获取单元的对象
|
||||
// --获取Unit中变量Ua的值
|
||||
echo obj.Ua;
|
||||
obj.print();
|
||||
// --给变量重新赋值
|
||||
obj.Ua := 500;
|
||||
print();
|
||||
// --调用Unit中的方法
|
||||
{对方法的调用,当只存在一个单元时,可省略,若存在多个单元且有同名方法时,建议通过对象方式进行指定}
|
||||
obj.NumbJO(58);
|
||||
NumbJO(33);
|
||||
addv();
|
||||
print();
|
||||
return obj.Ub;
|
||||
```
|
||||
|
||||
打印结果:
|
||||
|
||||
100
|
||||
|
||||
当前值-Ua:100 Ub:Tinysoft Unit Uc:1 CS:888
|
||||
|
||||
当前值-Ua:500 Ub:Tinysoft Unit Uc:1 CS:888
|
||||
|
||||
58 是一个偶数
|
||||
|
||||
33 是一个奇数
|
||||
|
||||
当前值-Ua:510 Ub:Tinysoft Unit Uc:2 CS:888
|
||||
|
||||
DeMo_Unit_Test01 End.
|
||||
|
||||
程序返回结果:"Tinysoft Unit"
|
||||
|
||||
### Unit 的使用
|
||||
|
||||
#### Uses 子句
|
||||
|
||||
unit 可以在 function,procedure,unit,class,.tsf 和.tsl 中使用,我们用 uses 子句声明需要用到的 unit,uses 子句后可以跟多个 unit,用逗号分隔。
|
||||
|
||||
##### 在 function 中使用 uses
|
||||
|
||||
```tsl
|
||||
function
|
||||
FunctionUsingUnit();
|
||||
begin
|
||||
uses
|
||||
UnitA, UnitB, UnitC;
|
||||
FuncInUnitA();
|
||||
end;
|
||||
;
|
||||
```
|
||||
|
||||
在 function 中 uses 子句必须写在函数体的第一行,且一个函数体中只能使用一次 uses 语句,否则无法通过语法检查。引用后,函数可以直接调用在各个被引用单元中的接口函数和类。
|
||||
|
||||
##### 在 Class 中使用 uses
|
||||
|
||||
```tsl
|
||||
type
|
||||
ClassUsingUnit
|
||||
uses
|
||||
UnitA, UnitB, UnitC;
|
||||
FuncInClassA();
|
||||
end;
|
||||
;
|
||||
```
|
||||
|
||||
在 class 中的 uses 字句必须写在类定义体内的第一行,且一个类定义体中只能使用一次 uses,引用的单元的接口函数和类对类函数均有效。
|
||||
|
||||
##### 在 unit 中使用 uses
|
||||
|
||||
在 unit 中有两个地方可以使用 uses 子句:interface,implementation,但 uses 字句必须紧跟在 interface 或 implementation 之后。
|
||||
|
||||
使用 uses 子句后,被引用单元的接口函数可以在单元内使用,但在 interface 中定义的类的内联函数不能访问 Implementation 中 uses 子句引用的单元接口函数和类。
|
||||
|
||||
```tsl
|
||||
unit
|
||||
Unit1;
|
||||
interface
|
||||
// Uses Unit1,Unit2....; // Uses statement
|
||||
// Function InterfaceFunction(); // place publish function header here
|
||||
function
|
||||
func1();
|
||||
begin
|
||||
// 调用在unitB中定义的函数;
|
||||
FuncInUnitB(); // Error:找不到该函数
|
||||
end;
|
||||
;
|
||||
implementation
|
||||
uses
|
||||
UnitB
|
||||
;
|
||||
end.
|
||||
```
|
||||
|
||||
##### 在.tsf 或者.tsl 中使用 uses
|
||||
|
||||
对于.tsf 和.tsl 文件,除了可以在文件中的 function 和 class 中使用 uses 子句,还可以在文件的第一行使用 uses 子句,被 uses 声明的 unit 中的接口函数和类对于整个文件都是可以访问的,如在一个 tsf 文件中定义的多个函数都需要用到某个 unit,只需要声明一次,如:
|
||||
|
||||
```tsl
|
||||
uses
|
||||
UnitA
|
||||
;
|
||||
function
|
||||
Func1();
|
||||
begin
|
||||
// 调用UnitA中的一个函数
|
||||
FuncInUnitA();
|
||||
end;
|
||||
;
|
||||
function
|
||||
Func2();
|
||||
begin
|
||||
// 调用UnitA中的另一个函数
|
||||
AnotherFuncInUnitA();
|
||||
end;
|
||||
;
|
||||
```
|
||||
|
||||
注意,一个文件在其顶层的代码只能使用一次 uses 子句。
|
||||
|
||||
##### 调用 Unit 中的接口函数
|
||||
|
||||
一般来说,我们使用 uses 声明要引用的 unit,在之后的代码调用被声明后的 unit 中的接口函数。比如:
|
||||
|
||||
```tsl
|
||||
function
|
||||
FunctionUsingUnit();
|
||||
begin
|
||||
uses
|
||||
UnitA;
|
||||
// 调用UnitA中的一个函数
|
||||
FuncInUnitA();
|
||||
end;
|
||||
;
|
||||
```
|
||||
|
||||
某些时候,我们可以通过 Unit(UnitName).
|
||||
InterfaceName 的方式调用 unit 中的接口函数,而不用使用 uses 子句,如:
|
||||
|
||||
```tsl
|
||||
function
|
||||
FunctionUsingUnit();
|
||||
begin
|
||||
// 使用Unit(UnitName).InterfaceName调用UnitA中的一个函数
|
||||
unit
|
||||
(
|
||||
UnitA
|
||||
).FuncInUnitA();
|
||||
end;
|
||||
;
|
||||
```
|
||||
|
||||
uses 多个 unit 时,偶尔我们需要调用制定 unit 中的接口,可以使用 UnitName.InterfaceName 的方式,如:
|
||||
|
||||
```tsl
|
||||
function
|
||||
FunctionUsingUnit();
|
||||
begin
|
||||
uses
|
||||
UnitA, UnitB;
|
||||
// 调用UnitA中的一个函数
|
||||
UnitA.Hello(); // A said:"hello!"
|
||||
UnitB.Hello(); // B said:"hello!"
|
||||
end;
|
||||
;
|
||||
```
|
||||
|
||||
#### Unit 的作用域
|
||||
|
||||
在一个函数中使用的 unit,只在当前函数体内有效。
|
||||
|
||||
对于 unit,在 interface 后 uses 的 unit 可以在被当前 unit 任何位置访问,在 implementation 后 uses 的 unit,在 interface 段不能访问其接口。
|
||||
|
||||
在.tsf,和.tsl 中使用的 unit,其接口函数和类可以在当前文件的任何位置访问。
|
||||
|
||||
##### 重名函数的引用优先级以及处理方法
|
||||
|
||||
当一个文件中使用了多个 unit,而在这些 unit 定义的接口存在重名的时候,编译器并不会提示警告或者错误,而是按照以下顺序优先级递减的规则调用相应的函数:
|
||||
|
||||
1 当前应用的私有函数
|
||||
|
||||
2 全局函数
|
||||
|
||||
3 Uses 最后的 unit 依次往前
|
||||
|
||||
如果要指定使用某个 unit 中的接口函数是,可以使用 UnitName.InterfaceName。
|
||||
|
||||
##### 重名类的引用优先级以及处理方法
|
||||
|
||||
当出现名字相重的类,其优先级遵循重名函数的引用优先级,假定需要在创建对象的时候指定某个单元的类,使用 CreateObject("UnitName.ClassName")的模式访问。
|
||||
|
||||
### 单元对函数调用影响
|
||||
|
||||
引用函数的时候,会一次从被引用单元的先后次序对函数进行查找,如果用户需要调用指定单元的函数,则可以采用如下方式:
|
||||
|
||||
直接调用模式:`unit(UnitA).InterfaceFunction()` 调用单元 `UnitA` 的 `InterfaceFunction`。
|
||||
|
||||
CALL 调用模式:`CALL("UnitA.InterfaceFunction")`
|
||||
|
||||
## 函数文件以及命名空间
|
||||
|
||||
在客户端 TSL 解释器以及独立的 TSL 脚本解释器和 WEB 的 TSL 语言插件中,缺乏平台的函数存贮统一管理的功能,这个时候函数是以 TSF 文件的方式进行存贮的。在 WEB 等项目的开发的过程中,由于缺乏统一的函数管理功能,避免不了会产生函数等重名现象,当产生了函数重名又需要部署在一个解释器来运行的时候,就需要命名空间来解决这些问题。
|
||||
|
||||
### TSF 文件函数的存贮
|
||||
|
||||
TSL 语言允许将函数、类、单元以同名文件存贮成一个以.tsf 为扩展名的文件,这个文件可以放置在解释器的 funcext 子目录下,亦可以存贮在 funcext 子目录下的下级子目录中,这些内容将是全局可视的,这样 TSL 语言可以直接调用访问到这些内容。
|
||||
|
||||
WEB 端、客户端、命令行解释器端,funcext 目录存在于 tslinterp.dll 所在目录下,在服务端,funcext 目录存在于执行服务器的路径下。
|
||||
|
||||
原则上 funcext 目录下的文件名不允许同名,也就是说,一般来说,全局函数不允许同名,同名则以查找到的第一个为准。
|
||||
|
||||
### NAMESPACE 命名空间
|
||||
|
||||
如果多个项目工程需要存在多个同名的全局函数,可以采用 NAMESPACE 来解决函数重名问题。(这种情况往往是经常发生的,例如,某两个项目共享一套框架,但是框架内的某几个函数内容不同,则不同的项目会有几个同名全局函数)
|
||||
|
||||
可以将 TSF 文件的文件名以 `FunctionName@NameSpaceName.TSF` 形式存贮。在调用之前使用
|
||||
`NameSpace "NameSpaceName"` 的模式来使用。
|
||||
|
||||
例如:
|
||||
|
||||
```tsl
|
||||
NameSpace "NameSpaceName";
|
||||
FunctionName();
|
||||
```
|
||||
|
||||
当在使用 WEB 开发或者命令行解释器开发的时候,可以在 .tsl 文件的当前路径下创建
|
||||
`tsl.conf` 文件,并在其中:
|
||||
|
||||
```ini
|
||||
[system]
|
||||
Namespace=NameSpaceName
|
||||
InheritParent=1
|
||||
```
|
||||
|
||||
这样,所有该目录下的 TSL 执行都将使用默认名为 NameSpaceName 命名空间,InteritParent=1 则如果当前未设置 NameSpace,将继承上级路径的 NameSpace 配置。
|
||||
|
||||
使用命令空间主要目的是解决在开发多个项目的时候函数同名问题。
|
||||
|
||||
### TslFileName
|
||||
|
||||
范例
|
||||
|
||||
封装 tsl 文件:TestEnv.tsl
|
||||
|
||||
```tsl
|
||||
echo tslfilename(), '\r\n';
|
||||
return 1;
|
||||
```
|
||||
|
||||
执行该文件结果:
|
||||
|
||||
### sysgettsllibpath
|
||||
|
||||
使用范例可参考 FAQ:syssettsllibpath
|
||||
|
||||
### syssettsllibpath
|
||||
|
||||
范例
|
||||
|
||||
在 tsl 脚本中,需要调用非当前环境下的函数 TestTsfsum,若不临时设置该函数的所在目录,则调用会报找不到该函数的错误。
|
||||
|
||||
通过 syssettsllibpath 设置好查找路径后,就可调用到该函数了。
|
||||
|
||||
```tsl
|
||||
A := 198.86;
|
||||
B := -22.34;
|
||||
echo "abs(A):", abs(A), " abs(B):", abs(B), '\r\n';
|
||||
echo "当前查找路径:", sysgettsllibpath(), '\r\n';
|
||||
s0 := syssettsllibpath("C:\\DoTSL\\otherTest\\;");
|
||||
echo "当前查找路径:", sysgettsllibpath(), '\r\n';
|
||||
try
|
||||
v1 := TestTsfsum(A, B);
|
||||
echo "TestTsfsum执行成功:", v1, '\r\n';
|
||||
except
|
||||
echo ExceptObject.ErrInfo, '\r\n';
|
||||
end;
|
||||
return "执行完毕";
|
||||
```
|
||||
|
||||
### 扩展函数查找路径
|
||||
|
||||
天软 TSL 程序运行过程中,若程序中有调用其它本地函数,默认从解析器所在目录的 funcext 文件夹中进行查找对应函数,若查找失败,则会报错。
|
||||
|
||||
为了增加函数存放位置,可以通过两种方式进行扩展函数查找范围。
|
||||
|
||||
第一种:在执行当前程序时,临时指定查找路径
|
||||
|
||||
第二种:在执行文件的同目录下,新增 tsl.conf 配置文件,指定查找路径,
|
||||
|
||||
需要注意,扩展函数查找路径优先级高于解析器所在目录的 funcext 文件夹。
|
||||
|
||||
#### 1、临时性扩展函数查找路径:TSL.EXE -libpath 参数
|
||||
|
||||
执行天软 TSL 程序(.tsl/.tsf 文件)时,可在执行命令末尾添加 -libpath 参数临时扩展函数查找路径。
|
||||
|
||||
支持指定多个路径(以分号分隔),路径必须以 / 或 \ 结尾。
|
||||
|
||||
例如:
|
||||
|
||||
```tsl
|
||||
tsl test.tsl -libpath "D:/TinySoft/Test/func/;D:\test\funcext\"
|
||||
```
|
||||
|
||||
具体示例:
|
||||
|
||||
现有 test.tsl 文件,内容如下:
|
||||
|
||||
```tsl
|
||||
foo(2, 3);
|
||||
function foo(a, b)
|
||||
begin
|
||||
t1 := a * b;
|
||||
t2 := ts_test01(a, b);
|
||||
t := t1 + t2;
|
||||
echo "t:", t, "\n";
|
||||
return t;
|
||||
end;
|
||||
```
|
||||
|
||||
其中,子函数 ts_test01.tsf 内容如下:
|
||||
|
||||
```tsl
|
||||
function ts_test01(n, m)
|
||||
begin
|
||||
return n + 2 * m;
|
||||
end;
|
||||
```
|
||||
|
||||
当未扩展函数查找路径时,执行结果如下:
|
||||
|
||||
临时扩展函数查找路径时,执行结果如下:
|
||||
|
||||
#### 2、配置文件扩展函数查找路径:tsl.conf 配置文件 system 中 libpath 参数
|
||||
|
||||
天软 TSL 程序(.tsl/.tsf 文件)同目录新增 tsl.conf 配置文件,并配置 system 中的 libpath 参数,可为当前目录所有天软 TSL 程序扩展函数查找路径。
|
||||
|
||||
1、支持指定多个路径(以分号分隔),路径必须以 / 或 \ 结尾。
|
||||
|
||||
2、支持{$P}来替换为当前主程序文件所在路径。
|
||||
|
||||
例如可以在 tsl.conf 加入
|
||||
|
||||
[system]
|
||||
|
||||
libpath={$P}funcext\
|
||||
|
||||
这样可以使得.tsl 所在的路径下的 funcext 会成为优先的 funcext 路径。
|
||||
|
||||
这种使用主要解决 TSL.EXE 调用所开发多个.tsl 编写的应用的函数重名问题
|
||||
|
||||
例如:
|
||||
|
||||
```ini
|
||||
[system]
|
||||
libpath=D:/TinySoft/Test/func/;D:\test\funcext\
|
||||
```
|
||||
|
||||
具体示例:
|
||||
|
||||
现有 test.tsl 文件,内容如下:
|
||||
|
||||
```tsl
|
||||
foo(2, 3);
|
||||
function foo(a, b)
|
||||
begin
|
||||
t1 := a * b;
|
||||
t2 := ts_test01(a, b);
|
||||
t := t1 + t2;
|
||||
echo "t:", t, "\n";
|
||||
return t;
|
||||
end;
|
||||
```
|
||||
|
||||
其中,子函数 ts_test01.tsf 内容如下:
|
||||
|
||||
```tsl
|
||||
function ts_test01(n, m)
|
||||
begin
|
||||
return n + 2 * m;
|
||||
end;
|
||||
```
|
||||
|
||||
未新增 tsl.conf 配置文件时,执行结果如下:
|
||||
|
||||
新增 tsl.conf 配置文件后,执行结果如下:
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,506 +0,0 @@
|
||||
# 07 运行时与性能工具
|
||||
|
||||
本章收录网格计算与全局缓存等运行时与性能相关机制。
|
||||
|
||||
## 目录
|
||||
|
||||
- [#网格计算操作符](#网格计算操作符)
|
||||
- [#网格计算操作符简介](#网格计算操作符简介)
|
||||
- [网格计算案例](#网格计算案例)
|
||||
- [网格计算代入系统参数的案例](#网格计算代入系统参数的案例)
|
||||
- [网格计算设置任务超时时间](#网格计算设置任务超时时间)
|
||||
- [TSL 全局缓存的应用说明](#tsl-全局缓存的应用说明)
|
||||
- [全局缓存管理](#全局缓存管理)
|
||||
- [全局缓存管理的函数](#全局缓存管理的函数)
|
||||
- [全局缓存的使用](#全局缓存的使用)
|
||||
- [全局缓存的过期与回收策略](#全局缓存的过期与回收策略)
|
||||
- [全局缓存管理的初始化和监控](#全局缓存管理的初始化和监控)
|
||||
- [未升级的系统对新代码的使用](#未升级的系统对新代码的使用)
|
||||
- [初始化 TSL 和监控管理的 TSL](#初始化-tsl-和监控管理的-tsl)
|
||||
- [功能设计](#功能设计)
|
||||
|
||||
## #网格计算操作符
|
||||
|
||||
### #网格计算操作符简介
|
||||
|
||||
什么是网格计算?
|
||||
|
||||
网格计算用于并行执行函数调用,把任务分发到可用计算资源并异步返回句柄。适用于大量独立任务的批量计算;对强顺序依赖的流程不适用。
|
||||
|
||||
网格使用格式:
|
||||
|
||||
```tsl
|
||||
R[i] := #函数名(参数…) with array(系统参数列表…) timeout N;
|
||||
```
|
||||
|
||||
其中,with 语句可指定网格运算子程中的系统参数,此输入可省
|
||||
|
||||
timeout
|
||||
N 为指定网格运算子程序运行的超时时间,若运行超过设定时间,则程序报错,可省,默认为一直等待,单位为:毫秒。
|
||||
|
||||
### 网格计算案例
|
||||
|
||||
如果用户拥有网格计算的权限,就可以进行网格计算了。
|
||||
|
||||
在 TSL 中使用网格计算非常简单,仅仅只需要在网格调用的函数前加上#即可。
|
||||
|
||||
例如:
|
||||
|
||||
```tsl
|
||||
A := array();
|
||||
B := array('SZ000001', 'SZ000002', 'SH600000');
|
||||
for i := 0 to length(B) - 1 do
|
||||
begin
|
||||
A[i] := #CalcStock(B[i]);
|
||||
end;
|
||||
// 对结果进行访问,用来等待所有网格运行完成并取得结果
|
||||
r := array();
|
||||
for j := 0 to length(A) - 1 do r[j] := dupvalue(A[j]); // 复制网格子程序结果
|
||||
return r;
|
||||
```
|
||||
|
||||
需要被网格调用的函数 `CalcStock`:
|
||||
|
||||
```tsl
|
||||
function CalcStock(StockId);
|
||||
begin
|
||||
// ...
|
||||
end;
|
||||
```
|
||||
|
||||
### 网格计算代入系统参数的案例
|
||||
|
||||
在有些函数调用的时候,需要设置系统参数,由于网格计算是一个重新开始的计算,并不会主动将系统参数带给新的网格计算函数,这个时候可以使用 with 后缀。
|
||||
|
||||
例如:
|
||||
|
||||
```tsl
|
||||
A[i] := #Close() with array(pn_stock():StockId, pn_date():Today() - 1);
|
||||
```
|
||||
|
||||
就可以获得指定股票昨日的收盘价。实际使用时不建议用网格计算调用收盘价函数,这里仅作示例。
|
||||
|
||||
### 网格计算设置任务超时时间
|
||||
|
||||
网格调用时可通过设置 timeout
|
||||
N 对该子进程进行设置超时时间,若网格运行的程序运行时间超过该设置时间(单位:毫秒),则程序进行报错。
|
||||
|
||||
如有网格运行目标程序:
|
||||
|
||||
```tsl
|
||||
function TestDo();
|
||||
begin
|
||||
sleep(10 * 1000);
|
||||
return getsysparam(pn_stock());
|
||||
end;
|
||||
```
|
||||
|
||||
在网格中设置超时间为 3 秒,调用如下:
|
||||
|
||||
```tsl
|
||||
r := #TestDo() timeout 3000;
|
||||
t := dupvalue(r);
|
||||
return t;
|
||||
```
|
||||
|
||||
在网格中通过 with 传入系统参数的同时设置超时间为 3 秒,调用如下:
|
||||
|
||||
```tsl
|
||||
r := #TestDo() with array(pn_stock():"SZ000002") timeout 3000;
|
||||
t := dupvalue(r);
|
||||
return t;
|
||||
```
|
||||
|
||||
超时报错 Grid timeout,示例如下:
|
||||
|
||||
## TSL 全局缓存的应用说明
|
||||
|
||||
### 全局缓存管理
|
||||
|
||||
TSL 设计的全局缓存是一套极为高效的内存缓存机制,其以 COPYONWRITE 的模式实现了设置和写入完全分离,允许存在多份使用中的版本,使得更新数据和读数据无冲突。
|
||||
|
||||
TSL 的全局缓存主要是为了对公共类的数据进行全局优化,尤其是对那些准备效率低下的数据,例如存贮在数据库内的数据,又或者是需要经过大的计算的数据。这些数据的全局缓存化可以使得应用不再关注于数据准备的开销上。
|
||||
|
||||
TSL 的全局缓存对于用户而言是一种新的数据类型,但这种数据结构和 TSL 原生数据结构完全相同,是在 TSL 的原生数据类型上扩展而成的,我们的开发使其不仅仅支持 TSL 的标准算符,例如四则运算,同时也支持矩阵计算,还支持子矩阵等算符,不仅仅如此,全局缓存还支持 SELECT,绝大多数 TSL 的函数对于全局缓存也是透明的,在计算的使用上,用户完全不需要理会一个数据到底是全局缓存还是其他的类型,除非真的需要(例如缓存是否过期等)。
|
||||
|
||||
TSL 的全局缓存对于用户的透明还有一个特性,我们对全局缓存的数据类型进行更改的时候(不是设置),系统会自动将用户使用的全局数据的引用实例化,也就是会将全局数据的相关内容复制到用户的运行环境中,然后进行修改的操作。
|
||||
|
||||
TSL 的全局缓存主要应用于数组和矩阵两种类型,也支持其他简单类型,但仅仅对数组和矩阵两种类型采用引用的方式,而其余数据类型取出的时候就进行了实例化。
|
||||
|
||||
由于我们对 TSL 全局缓存的透明处理,因为普通函数无法分辨全局缓存还是标准数据类型,除非采用特殊的函数。
|
||||
|
||||
#### 全局缓存管理的函数
|
||||
|
||||
##### SetGlobalCache
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
a := rand(1000, 100);
|
||||
return SetGlobalCache("LLL", a, now() + 1); // 设置一个名为”LLL”的全局缓存,生存周期为1天
|
||||
```
|
||||
|
||||
##### GetGlobalCache
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
mtic;
|
||||
for i := 0 to 999999 do getglobalCache("LLL", V);
|
||||
return array(V, mtoc);
|
||||
```
|
||||
|
||||
这个例子告诉我们,对于全局缓存数据,无论全局缓存数据本身多大,例如这个是 1000\*1000 的矩阵,获取 100 万次花费的时间也是微乎其微的。这样我们的数据准备工作所耗费的时间几乎就不存在了。
|
||||
|
||||
##### CheckGlobalCacheExpired
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
Setglobalcache("VVV", rand(1000, 100));
|
||||
Getglobalcache("VVV", V);
|
||||
expired1 := CheckGlobalCacheExpired(V);
|
||||
setglobalcache("VVV", rand(1000, 100)); // 重置,V过期
|
||||
return array("重置前":expired1, "重置后":CheckGlobalCacheExpired(V));
|
||||
```
|
||||
|
||||
##### GetGlobalCacheInfo
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
if GetGlobalCache("LLL", V) then return GetGlobalCacheInfo(V);
|
||||
```
|
||||
|
||||
##### ListGlobalCache
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
getglobalcache("LLL", v);
|
||||
return listglobalcache();
|
||||
```
|
||||
|
||||
Owners 列里是缓存使用中的用户列表
|
||||
|
||||
##### ListGlobalCacheRemoved
|
||||
|
||||
范例
|
||||
|
||||
范例 1:
|
||||
|
||||
```tsl
|
||||
SetGlobalCache("CCC", array(1, 2, 3));
|
||||
Getglobalcache("CCC", V); // v指向全局缓存
|
||||
setglobalcache("CCC", array(1, 2, 3, 4)); // v的版本已经过期
|
||||
return listglobalcacheremoved();
|
||||
```
|
||||
|
||||
存在一份 CCC 的过期版本。
|
||||
|
||||
范例 2:
|
||||
|
||||
```tsl
|
||||
SetGlobalCache("CCC", array(1, 2, 3));
|
||||
Getglobalcache("CCC", V); // v指向全局缓存
|
||||
setglobalcache("CCC", array(1, 2, 3, 4)); // V已经过期
|
||||
// return listglobalcacheremoved();
|
||||
V := nil; // V释放了没有过期版本
|
||||
return listglobalcacheremoved();
|
||||
```
|
||||
|
||||
返回结果:空数组。
|
||||
|
||||
##### IfCache
|
||||
|
||||
#### 全局缓存的使用
|
||||
|
||||
##### 全局缓存的基础函数和子矩阵的支持
|
||||
|
||||
绝大多数的函数已经可以完全支持全局缓存,当成和原始数据类型对待,而子矩阵这类的操作也毫无问题。
|
||||
|
||||
```tsl
|
||||
a := array();
|
||||
for i := 1 to 9 do for j := 1 to 9 do
|
||||
a[i - 1, j - 1] := i * j;
|
||||
setglobalcache("99MT", a);
|
||||
Getglobalcache("99MT", V);
|
||||
return array(sum(sum(V)), length(V), mcols(V), ifarray(V), V[8, 8], V[0:3, 0:3]);
|
||||
```
|
||||
|
||||
##### 全局缓存的算符支持
|
||||
|
||||
对于四则运算等算符,以及矩阵运算符,还有集合运算符号等等,全局缓存和原始类型一致。
|
||||
|
||||
```tsl
|
||||
a := array();
|
||||
for i := 1 to 9 do for j := 1 to 9 do
|
||||
a[i - 1, j - 1] := i * j;
|
||||
setglobalcache("99MT", a);
|
||||
Getglobalcache("99MT", V);
|
||||
return V + 100;
|
||||
```
|
||||
|
||||
##### 支持 SELECT
|
||||
|
||||
对于 SELECT 而言,全局缓存的表现和其原始数据没有任何差异。
|
||||
|
||||
```tsl
|
||||
a := array();
|
||||
for i := 1 to 9 do for j := 1 to 9 do
|
||||
a[i - 1, j - 1] := i * j;
|
||||
setglobalcache("99MT", a);
|
||||
Getglobalcache("99MT", V);
|
||||
return select * from V order by [0] desc end;
|
||||
```
|
||||
|
||||
##### 写入实例化
|
||||
|
||||
当对全局缓存进行各式写入操作时,无论是数据设置,还是 UPDATE,INSERT 等 SQL 操作,我们均会将全局缓存实例化,在用户使用的时候和传统数据复制后进行写入操作毫无差异,这样最大化地保证了易用性。
|
||||
|
||||
```tsl
|
||||
a := array();
|
||||
for i := 1 to 9 do for j := 1 to 9 do
|
||||
a[i - 1, j - 1] := i * j;
|
||||
setglobalcache("99MT", a);
|
||||
Getglobalcache("99MT", V);
|
||||
b := ifcache(V); // 是缓存 ,b为真
|
||||
V[0, 0] := 100; // 设置完成后,ifcache就为假了
|
||||
return array(b, ifcache(V), V);
|
||||
```
|
||||
|
||||
使用 SQL 的 Update 更新全局缓存也引发数据的实例化
|
||||
|
||||
```tsl
|
||||
a := array();
|
||||
for i := 1 to 9 do for j := 1 to 9 do
|
||||
a[i - 1, j - 1] := i * j;
|
||||
setglobalcache("99MT", a);
|
||||
Getglobalcache("99MT", V);
|
||||
b := ifcache(V); // 是缓存 ,b为真
|
||||
update v set [0] = 1 end; // update后V也不再是globalcache
|
||||
return array(b, ifcache(V), V);
|
||||
```
|
||||
|
||||
#### 全局缓存的过期与回收策略
|
||||
|
||||
用户一旦使用过期的全局缓存,会导致内存的占用,因而系统必需建立回收过期缓存的机制,否则可能会危害到系统的正常运行的安全。
|
||||
|
||||
一旦系统进行过期的内存的回收,会导致使用这些过期的全局缓存的模型被终止,并产生不可恢复的错误,这又会对一些特殊的应用造成,因而内存的回收是必要又是需要谨慎的。
|
||||
|
||||
TSL 为全局缓存建立了一套回收规则,结合了系统的剩余内存比例,剩余内存的物理大小,以及占用的过期内存总和大小以及占用的时长等等,基于极为审慎的原则对违反规则的模型进行终止,保障其他正常模型的运行。
|
||||
|
||||
一旦遇到这类的问题,用户应该检查模型使用这些全局缓存是否存在问题。由于全局缓存的获取效率以及使用效率均极高,用户不应该将全局缓存放在系统变量,TSL 的 GLOBAL 存贮等等中,用户应尽量直接使用缓存,并审慎长期占用缓存的模式。
|
||||
|
||||
##### 配置
|
||||
|
||||
配置在 plugin\FileMgr.ini 中
|
||||
|
||||
一个典型的设置如下:
|
||||
|
||||
[Global Cache]
|
||||
|
||||
MemoryLoadLimit=90 //在物理内存使用达到 90%的时候才检查
|
||||
|
||||
MemoryAvailLimit=26214400 //在内存剩余大小不到 25G 时才检查,单位 KB
|
||||
|
||||
ExpiredSecondsCheck=900 //允许过期后使用的秒数
|
||||
|
||||
ExpiredLoadLimit=5 //允许过期的全局缓存占用的物理内存百分比
|
||||
|
||||
ExpiredAvailLimit=16777216 //允许过期的全局缓存占用的物理内存大小,单位 KB
|
||||
|
||||
###### MemoryLoadLimit
|
||||
|
||||
单位:百分数
|
||||
|
||||
描述进行全局缓存回收的物理内存占用比例阈值,不超过该阈值不回收
|
||||
|
||||
###### MemoryAvailLimit
|
||||
|
||||
单位:KB
|
||||
|
||||
描述在内存剩余大小低于的阈值才回收,剩余内存超过不回收。
|
||||
|
||||
###### ExpiredSecondsCheck
|
||||
|
||||
单位:秒
|
||||
|
||||
描述安全使用的过期后的时长
|
||||
|
||||
###### ExpiredLoadLimit
|
||||
|
||||
单位:百分数
|
||||
|
||||
描述允许超过安全使用时的全局内存占用的物理内存比例
|
||||
|
||||
###### ExpiredAvailLimit
|
||||
|
||||
单位:KB
|
||||
|
||||
描述允许超过安全使用时的全局内存占用的物理内存大小。
|
||||
|
||||
#### 全局缓存管理的初始化和监控
|
||||
|
||||
##### 有瑕疵的全局缓存管理方式
|
||||
|
||||
全局缓存的生成,一种模式是在由应用模型内来设置:
|
||||
|
||||
例如: if not GetGlobalCache(CacheName,V) then
|
||||
|
||||
```tsl
|
||||
begin
|
||||
V := CalcDataCall();
|
||||
SetGlobalCache(Cache, V);
|
||||
end;
|
||||
```
|
||||
|
||||
但这样存在几个问题:
|
||||
|
||||
一是全局缓存的设置是需要权限的,一旦采用这样的模式,代码只能运行在高权限下。
|
||||
|
||||
二是用户模型的性能是不稳定的,当第一次运行的时候会很缓慢,这样有时候会造成不可靠的用户体验。
|
||||
|
||||
三是我们很难知道何时适合于进行缓存的准备工作以及缓存的更新工作,因为缓存总有失效的时候,如果要解决失效问题,我们还得将代码变成如下:
|
||||
|
||||
```tsl
|
||||
if not GetGlobalCache(CacheName, V) or IsDataNeedReCalc(V) then
|
||||
begin
|
||||
V := CalcDataCall();
|
||||
SetGlobalCache(Cache, V);
|
||||
end;
|
||||
```
|
||||
|
||||
我们需要在 IsDataNeedReCalc 里来检查诸如外部数据的版本是否发生了变更等工作,往往这种检查对事件的耗费远远大于全局缓存的获取,这样又会影响到用户模型的效率。
|
||||
|
||||
##### 期望的方式
|
||||
|
||||
如果全局缓存的生成和更新,交由系统,那么我们期望的应用开发是如下模式:
|
||||
|
||||
```tsl
|
||||
if not GetGlobalCache(CacheName, V) then V := CalcDataCall();
|
||||
```
|
||||
|
||||
由于全局缓存系统管了生成,所以我们只需要取即可,如果系统未生成,我们直接进入计算模式。
|
||||
|
||||
##### 不推荐的模式
|
||||
|
||||
```tsl
|
||||
GetGlobalCache(CacheName, V);
|
||||
```
|
||||
|
||||
有的开发者会在升级应用后,将取数程序变成了最简单的模式,假设缓存的获得会成功,这样在项目实施中并无不可,假设数据的初始化和数据变更确定性由系统其他部分完成了,这样也带来了数据底层来源和上层应用分离的优势。
|
||||
|
||||
但在产品开发中,我们并不推荐如此模式,因为这样会带来了新的问题。
|
||||
|
||||
一是采用缓存本身是对旧有模式的升级,一旦采用了这样的方式,缓存就成为了必需而非选项,这样对程序的兼容产生不利影响。
|
||||
|
||||
二是可能产生内存依赖,缓存本身是依赖数据在内存里的常驻来达到性能的飞跃,如果一些系统的内存本身就不足够,实施缓存模式本身就不现实。
|
||||
|
||||
三是不利于灵活化实施,我们可能会根据内存的大小进行灵活化实施,例如某些数据进入到缓存管理里,某些数据则采用旧有模式,在这种情况下,保留缓存的检查的模式是最佳的选择。
|
||||
|
||||
##### 全局缓存的初始化
|
||||
|
||||
采用【新开发的初始化 TSL 和监控管理的 TSL】功能,将所需的全局缓存的初始化工作交由 InitRun.TSL 来完成。如果开发采用了强依赖模式,那么,我们在初始化中必需保障全部用到的全局缓存的准备工作。
|
||||
|
||||
系统将在这个初始化 TSL 运行完成后才会接收应用,无论是 WEB 还是平台。
|
||||
|
||||
##### 全局缓存的更新监控
|
||||
|
||||
采用【新开发的初始化 TSL 和监控管理的 TSL】功能,将所需的全局缓存的更新监控工作交由 AutoMon.TSL 来完成。这个 TSL 会在独立的线程里运行,和用户模型的运行平行独立。而 AutoMon.TSL 的工作是监视数据的变动,当数据发生了变动就立刻重置全局缓存。
|
||||
|
||||
如果开发采用了对全局缓存的弱依赖模式,例如初始化全部全局缓存的时间代价太高,而全局缓存的击中概率也不高,那我们也可以将一些本身应由初始化完成的全局缓存准备工作交由监控来完成。这样可以逐步将全局缓存准备出来,而不会因为初始化速度很低影响到用户的使用。
|
||||
|
||||
#### 未升级的系统对新代码的使用
|
||||
|
||||
由于 TSL 的设计特性,底层系统函数的优先级高于公共和用户函数,我们建议在未升级全局缓存管理功能的用户处,按照规范新增两个函数 SetGlobalCache 以及 GetGlobalCache,返回的结果为假即可。
|
||||
|
||||
这样,老的 TSL 版本也可以正确地运行使用了新特性的模型。
|
||||
|
||||
### 初始化 TSL 和监控管理的 TSL
|
||||
|
||||
某些特殊情况下,平台或者 WEB 都需要一些初始化工作,例如数据初始化或者缓存准备等工作,这时候平台管理者会希望在启动的时候运行一个 TSL 代码。当没有这种支撑的时候,往往管理者会采用调度一个 TSL 代码来执行的模式。
|
||||
|
||||
在另外一些情况下,平台或者 WEB 可能需要一些非用户任务,不需要调度而是不断在后台监控运行。例如,用于数据变动检查,进行一些资源回收等等,这些工作有时候被开发者放入了一些用户模型中,这样既不及时,也会影响用户模型的效率,而且还存在一些权限性问题。
|
||||
|
||||
为了这些应用的需求,因而我们在天软的平台以及 WEB 模块里设计了初始化 TSL 以及监控 TSL 的功能。
|
||||
|
||||
初始化是指平台或者 WEB 在启动的时候先允许执行一个初始化的 TSL。
|
||||
|
||||
而监控 TSL,则是允许在后台启动数个线程(一般只需要 1 个),这个线程可以运行监控的 TSL,用于从事缓存更新以及其他所需要的工作。
|
||||
|
||||
注:初始化 TSL 只运行一次,而监控的线程不会退出,当 TSL 运行完毕后会重新调用运行。
|
||||
|
||||
#### 功能设计
|
||||
|
||||
##### WEB 模块的初始化和监控
|
||||
|
||||
Apache 的模块,设置在 TSL.INI 中。
|
||||
|
||||
[WebApp]
|
||||
|
||||
automonthreads=1 //监控线程的个数
|
||||
|
||||
initrun=1 //是否运行初始化 TSL
|
||||
|
||||
###### 初始化
|
||||
|
||||
初始化 InitRun.TSL 位于进程或者模块所在目录,进程所在目录优先。
|
||||
|
||||
当 initrun=1 时候,apache 的模块将会在启动后运行 InitRun.TSL,运行完成后才接收请求,否则返回 406 错误,HTTP
|
||||
406 错误指无法接受 (Not acceptable)错误
|
||||
|
||||
###### 监控及管理线程
|
||||
|
||||
Automonthreads 设置的是启动的监控管理线程的数量。
|
||||
|
||||
这些线程执行 WEB 服务器进程或者模块所在目录的文件(进程目录优先):
|
||||
|
||||
文件名的规则为:
|
||||
|
||||
第一个线程执行 AutoMon0.TSL,第二个线程执行 AutoMon1.TSL,依此类推。
|
||||
|
||||
如果每个线程没有特殊的 TSL,则执行缺省的 AutoMon.TSL
|
||||
|
||||
执行 TSL 可以使用 AutoMonIndex 系统参数来获得自己是第几个线程,并可以 AutoFileName 系统参数获得运行的文件名
|
||||
|
||||
##### 平台的初始化和监控
|
||||
|
||||
初始化是在执行接收分发任务前,设计上初始化无法也不允许调用网格计算等功能。
|
||||
|
||||
监控进程目前并未支持调用网格计算。
|
||||
|
||||
###### 初始化
|
||||
|
||||
初始化的启动是通过参数-i 来设定的,例如 Exec64.exe -i 则表明需要启动初始化。
|
||||
|
||||
初始化程序为 InitRun.TSL 位于执行进程所在目录。
|
||||
|
||||
当初始化参数指定的时候,执行将在数据同步准备完成后启动 InitRun.TSL,运行完成后才接收请求。
|
||||
|
||||
###### 监控及管理线程
|
||||
|
||||
监控线程的启动是通过参数-M 来设置,例如 Exec64.exe -M
|
||||
1 则表明采用了一个监控管理线程。
|
||||
|
||||
这些线程执行进程所在目录的文件:
|
||||
|
||||
文件名的规则为:
|
||||
|
||||
第一个线程执行 AutoMon0.TSL,第二个线程执行 AutoMon1.TSL,一次类推。
|
||||
|
||||
如果每个线程没有特殊的 TSL,则执行缺省的 AutoMon.TSL
|
||||
|
||||
执行 TSL 可以使用 AutoMonIndex 系统参数来获得自己是第几个线程,并可以 AutoFileName 系统参数获得运行的文件名
|
||||
|
||||
###### 平台的初始化和监控 TSL 的管理
|
||||
|
||||
应用执行服务启动的时候,会尝试同步下载 InitRun.TSL 以及 AutoMon.TSL 和相应的 AutoMon0….TSL 等 TSL 文件。这些文件平台管理员可以按照更新 ini 配置的方式通过事件服务器进行统一管理。
|
||||
|
||||
###### 平台的初始化和监控的权限管控
|
||||
|
||||
```tsl
|
||||
// 如果初始化和监控 TSL 需要调用内外部的 TSL 函数来进行数据准备,设计者推荐用户采用 data:=sudo("modeluser",getcalcdata())的模式来进行数据的一些准备工作,因为 GetCalcData()这类的函数往往不需要任何特殊权限,这样可以最大限度地防止非授权代码的运行。
|
||||
```
|
||||
|
||||
如果我们仅仅只是利用初始化和监控进行一些系统性操作,设计者强烈建议不需要使用一些中间函数,将除了二进制函数外的实现直接在.TSL 里完成,这样做可以让这些代码可以独立运行。如果无法保障这一点,强烈建议将无需权限运行的内容以 sudo 模式来运行。
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,40 +0,0 @@
|
||||
# 01 TSL函数
|
||||
|
||||
> 本模块包含数学、系统、基础、图形等通用函数,适用于各种TSL脚本开发场景。
|
||||
|
||||
**完整内容请查阅:**
|
||||
|
||||
**→ [TSL函数模块详细文档](./tsl/index.md)**
|
||||
|
||||
## 快速概览
|
||||
|
||||
### 数学与计算
|
||||
|
||||
- **[数学函数](./tsl/math.md)** (14,396行) - 数值计算、三角函数、统计函数
|
||||
|
||||
### 系统与平台
|
||||
|
||||
- **[系统相关函数](./tsl/system.md)** (1,647行) - 系统信息、环境变量、进程控制
|
||||
- **[平台函数](./tsl/platform.md)** (553行) - 平台特定功能
|
||||
- **[客户端函数](./tsl/client.md)** (409行) - 客户端交互、界面控制
|
||||
|
||||
### 基础功能
|
||||
|
||||
- **[基础函数](./tsl/base.md)** (10,660行) - 字符串、数组、日期时间、文件操作
|
||||
- **[图形函数](./tsl/graphics.md)** (698行) - 绘图、图表、可视化
|
||||
|
||||
### 资源与交互
|
||||
|
||||
- **[资源访问函数](./tsl/resource.md)** (4,897行) - 文件读写、数据库、网络通信
|
||||
- **[第三方交互函数](./tsl/third_party.md)** (610行) - 第三方库调用、外部程序交互
|
||||
|
||||
### 工具函数
|
||||
|
||||
- **[压缩和解压函数](./tsl/compression.md)** (108行) - 数据压缩、解压缩
|
||||
- **[信息摘要及编码](./tsl/digest_encoding.md)** (172行) - 哈希算法、加密、编码转换
|
||||
|
||||
---
|
||||
|
||||
**共计 10 个子文件,总计 34,150 行**
|
||||
|
||||
详细目录和完整内容请访问:**[tsl/index.md](./tsl/index.md)**
|
||||
@@ -1,58 +0,0 @@
|
||||
# 02 金融函数
|
||||
|
||||
> 本模块涵盖股票、行情、技术分析、财务等金融专用功能,是量化分析和金融建模的核心函数库。
|
||||
|
||||
**完整内容请查阅:**
|
||||
|
||||
**→ [金融函数模块详细文档](./financial/index.md)**
|
||||
|
||||
## 快速概览
|
||||
|
||||
### 行情数据
|
||||
|
||||
- **[股票](./financial/stock.md)** (20,893行) - 股票代码、名称、上市信息、交易状态
|
||||
- **[行情](./financial/market_data.md)** (11,748行) - 实时行情、历史行情、K线数据
|
||||
- **[指数](./financial/index_data.md)** (2,237行) - 指数数据、指数成分股
|
||||
|
||||
### 技术分析
|
||||
|
||||
- **[技术分析](./financial/technical_analysis.md)** (11,373行) - 均线、MACD、KDJ、RSI等技术指标
|
||||
|
||||
### 资产类别
|
||||
|
||||
- **[债券](./financial/bond.md)** (2,827行) - 债券信息、收益率曲线、债券估值
|
||||
- **[期权](./financial/option.md)** (1,573行) - 期权定价、希腊字母、隐含波动率
|
||||
- **[基金](./financial/fund.md)** (10,681行) - 基金净值、持仓、业绩
|
||||
- **[期货](./financial/futures.md)** (1,248行) - 期货合约、持仓量、基差
|
||||
- **[权证](./financial/warrant.md)** (125行) - 权证信息、行权价
|
||||
- **[外汇](./financial/forex.md)** (116行) - 汇率、外汇行情
|
||||
|
||||
### 财务与基本面
|
||||
|
||||
- **[财务分析](./financial/financial_analysis.md)** (46,778行) ⚠️ **最大文件** - 三大报表、财务比率
|
||||
- **[基本面](./financial/fundamentals.md)** (6,139行) - 公司信息、行业分类、股东结构
|
||||
- **[宏观](./financial/macro.md)** (789行) - 宏观经济数据、GDP、CPI
|
||||
|
||||
### 板块与分类
|
||||
|
||||
- **[板块](./financial/sector.md)** (24,819行) ⚠️ **大文件** - 行业板块、概念板块、板块轮动
|
||||
|
||||
### 量化分析
|
||||
|
||||
- **[金融工程](./financial/financial_engineering.md)** (6,564行) - 风险模型、因子模型、组合优化
|
||||
- **[组合评价](./financial/portfolio_evaluation.md)** (3,656行) - 绩效评估、风险调整收益
|
||||
- **[天软因子](./financial/ts_factor.md)** (186行) - 天软自定义因子库
|
||||
|
||||
### 工具与框架
|
||||
|
||||
- **[框架构造Tools](./financial/framework_tools.md)** (71行) - 策略框架构建工具
|
||||
- **[网格池](./financial/grid_pool.md)** (301行) - 网格交易、池化管理
|
||||
- **[日志](./financial/logging.md)** (53行) - 交易日志、事件日志
|
||||
- **[数据提取](./financial/data_extraction.md)** (50行) - 批量数据提取工具
|
||||
- **[评价分析算法函数](./financial/evaluation_algorithms.md)** (18行) - 评价算法接口
|
||||
|
||||
---
|
||||
|
||||
**共计 22 个子文件,总计 152,245 行**
|
||||
|
||||
详细目录和完整内容请访问:**[financial/index.md](./financial/index.md)**
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,214 +0,0 @@
|
||||
### 服务器交互函数
|
||||
|
||||
#### 内容
|
||||
|
||||
- 服务器交互函数简介
|
||||
- ConnectServer
|
||||
- LoginServer
|
||||
- DefaultConnectAndLogin
|
||||
- INI文件配置登陆信息
|
||||
- SendExecuteAndWait
|
||||
- SendExecute
|
||||
- 实时行情订阅SendExecute
|
||||
- 异步回调函数以及实时订阅系统参数说明
|
||||
- 服务器返回信息类型
|
||||
- EndExecute
|
||||
- CheckLogined
|
||||
- CheckConnected
|
||||
- LoginedUser
|
||||
- RemoteAddress
|
||||
- RemotePort
|
||||
- DisconnectServer
|
||||
- TSTaskAdmin
|
||||
- SetComputeService
|
||||
- GetComputebitsOption
|
||||
- SetComputebitsOption
|
||||
- GetComputeService
|
||||
|
||||
#### 服务器交互函数简介
|
||||
|
||||
服务器交互函数可以让本地执行的TSL语言与金融分析.NET服务器进行交互,并递交计算请求到服务器运算。
|
||||
|
||||
#### ConnectServer
|
||||
|
||||
范例 http模式代理登陆
|
||||
|
||||
```tsl
|
||||
cTS := ConnectServer("tsl.tinysoft.com.cn", 443, array("Address":"192.168.0.250", "Port":808, "AuthMode":0));
|
||||
lg := LoginServer("TSUser", "UserPass", msg);
|
||||
if lg = 0 then
|
||||
begin
|
||||
echo "登陆成功!";
|
||||
Script := 'program TS_testFunc;
|
||||
begin
|
||||
r := 1 - > 5;
|
||||
return r;
|
||||
end.';
|
||||
if SendExecuteAndWait(Script, getSysParams(), Result, ErrMsg) = 0 then//Execute Success
|
||||
echo tostn(Result), '\r\n';
|
||||
else echo '远端执行失败!\r\n';
|
||||
DisconnectServer();
|
||||
end
|
||||
else echo "登陆失败,报错:(", cTS, ",", msg, ")\r\n";
|
||||
```
|
||||
|
||||
打印"登陆成功!"则说明连接成功。参考DefaultConnectAndLogin LoginServer
|
||||
|
||||
#### LoginServer
|
||||
|
||||
参考DefaultConnectAndLogin ConnectServer
|
||||
|
||||
#### DefaultConnectAndLogin
|
||||
|
||||
参考ConnectServer LoginServer
|
||||
|
||||
#### INI文件配置登陆信息
|
||||
|
||||
第一步:在plugin目录下新建ini文件,文件全名为tslclient.ini
|
||||
|
||||
注:客户端用户,该plugin目录在天软安装目录下,一般路径为:C:\Program
|
||||
Files\Tinysoft\Analyse.NET\Plugin
|
||||
|
||||
其它用户,需要找到插件包中的plugin目录下添加。
|
||||
|
||||
第二步:在tslclient.ini添加以下内容:
|
||||
|
||||
```ini
|
||||
[TSLClient Config]
|
||||
;调用是登陆的别名
|
||||
[test]
|
||||
;本地许可
|
||||
Permit=local
|
||||
;用户名
|
||||
LoginName=
|
||||
;密码
|
||||
LoginPass=
|
||||
;服务器 地址
|
||||
Address=tsl.tinysoft.com.cn
|
||||
;端口
|
||||
Port=443
|
||||
;---以下为代理服务器
|
||||
;代理服务器端口
|
||||
ProxyPort=
|
||||
;代理服务器地址
|
||||
ProxyAddress=
|
||||
;代理身份验证用户名
|
||||
ProxyUser=
|
||||
;验证密码
|
||||
ProxyPass=
|
||||
;代理模式 http模式设置为0, SOCKS5模式设置为5
|
||||
ProxyAuthMode=
|
||||
```
|
||||
|
||||
其中,[test]中的test是用户自定义的别名,可用户自己设定,区分大小写,在登陆时调用。
|
||||
|
||||
其余项用户需要根据自己的实际情况填写。
|
||||
|
||||
同一个ini文档中,可以配置多个配置信息,使用时通过别名进行识别。
|
||||
|
||||
调用比如:cTS:=DefaultConnectAndLogin(‘test’,msg)
|
||||
|
||||
#### SendExecuteAndWait
|
||||
|
||||
参考实时行情订阅。
|
||||
|
||||
#### SendExecute
|
||||
|
||||
参考实时行情订阅 异步回调函数以及实时订阅系统参数说明 服务器返回信息类型。
|
||||
|
||||
#### 实时行情订阅SendExecute
|
||||
|
||||
参考异步回调函数以及实时订阅系统参数说明 服务器返回信息类型
|
||||
|
||||
#### 异步回调函数以及实时订阅系统参数说明
|
||||
|
||||
| 系统参数名 | 类型 | 说明 |
|
||||
| ---------- | -------------- | ------------------------------ |
|
||||
| channel | 整数 | 通道ID,和SendExecute返回值一致 |
|
||||
| recvtype | 整数 | 参阅:服务器返回信息类型 |
|
||||
| errno | 整数 | 错误号,非0错误 |
|
||||
| errmsg | 字符串 | 错误信息 |
|
||||
| result | 订阅为数组类型 | 结果集,订阅为推送类型 |
|
||||
|
||||
#### 服务器返回信息类型
|
||||
|
||||
| 返回类型 | 值 | 说明 |
|
||||
| ---------------- | ------ | ---- |
|
||||
| 执行函数返回 | 0x0201 | |
|
||||
| 执行委托函数返回 | 0x0301 | |
|
||||
| ECHO返回 | 0x0401 | |
|
||||
| 客户请求返回 | 0x0402 | |
|
||||
| 实时订阅返回 | 0x0501 | |
|
||||
| 错误信息返回 | 0 | |
|
||||
|
||||
#### EndExecute
|
||||
|
||||
#### CheckLogined
|
||||
|
||||
#### CheckConnected
|
||||
|
||||
#### LoginedUser
|
||||
|
||||
#### RemoteAddress
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
####python交互范例,python代码
|
||||
import sys
|
||||
sys.path.append('D:\\tinysoft\\Analyse.NET\\')
|
||||
import TSLPy3 as ts
|
||||
data := ts.DefaultConnectAndLogin("test")
|
||||
print(ts.Logined())
|
||||
print("远程登录地址", ts.RemoteAddress())
|
||||
print("服务器设置:", ts.GetService())
|
||||
ts.SetComputeBitsOption(64) #设置计算单位
|
||||
print("计算位数设置:", ts.GetComputeBitsOption())
|
||||
ts.Disconnect() #断开连接
|
||||
```
|
||||
|
||||
结果
|
||||
|
||||
#### RemotePort
|
||||
|
||||
#### DisconnectServer
|
||||
|
||||
- 服务器交互函数简介
|
||||
- ConnectServer
|
||||
- LoginServer
|
||||
- DefaultConnectAndLogin
|
||||
- INI文件配置登陆信息
|
||||
- SendExecuteAndWait
|
||||
- SendExecute
|
||||
- 实时行情订阅SendExecute
|
||||
- 异步回调函数以及实时订阅系统参数说明
|
||||
- 服务器返回信息类型
|
||||
- EndExecute
|
||||
- CheckLogined
|
||||
- CheckConnected
|
||||
- LoginedUser
|
||||
- RemoteAddress
|
||||
- RemotePort
|
||||
- DisconnectServer
|
||||
- TSTaskAdmin
|
||||
- SetComputeService
|
||||
- GetComputebitsOption
|
||||
- SetComputebitsOption
|
||||
- GetComputeService
|
||||
|
||||
#### TSTaskAdmin
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
rdo2 TSTaskAdmin("oa", CmdReturn, BroadCastMsg, ErrMsg, 3000, 1000);
|
||||
return CmdReturn;
|
||||
```
|
||||
|
||||
#### SetComputeService
|
||||
|
||||
#### GetComputebitsOption
|
||||
|
||||
#### SetComputebitsOption
|
||||
|
||||
#### GetComputeService
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,160 +0,0 @@
|
||||
### CGI控制台相关函数
|
||||
|
||||
#### 内容
|
||||
|
||||
- CGI/控制台相关函数简介
|
||||
- CGI/控制台输入输出函数
|
||||
- CGI变量以及环境相关函数
|
||||
|
||||
#### CGI/控制台相关函数简介
|
||||
|
||||
CGI/控制台相关函数仅当使用TSL语言编写CGI或者编写控制台应用的时候才被使用。
|
||||
|
||||
此处的CGI兼容于TSL在APACHE或者IIS上以MODULE方式运行的模式。
|
||||
|
||||
#### CGI/控制台输入输出函数
|
||||
|
||||
##### 内容
|
||||
|
||||
- Echo
|
||||
- SetEchoString
|
||||
- UnsetEchoString
|
||||
- IsEchoRedirect
|
||||
- Read
|
||||
- ReadLn
|
||||
- Writeln
|
||||
- Write
|
||||
|
||||
##### Echo
|
||||
|
||||
##### SetEchoString
|
||||
|
||||
ECHO和WRITE,WRITELN等输出函数被重定向,不再输出,用UnSetEchoString获得重定向的输出流。
|
||||
|
||||
##### UnsetEchoString
|
||||
|
||||
##### IsEchoRedirect
|
||||
|
||||
##### Read
|
||||
|
||||
范例
|
||||
|
||||
范例一:读单个字符,不用回显:Ch:=Read(1,'');
|
||||
|
||||
范例二:读一个密码串,以*显示输入的字符:Password:=Read(0,'*');
|
||||
|
||||
##### ReadLn
|
||||
|
||||
##### Writeln
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 先输出111222,接着另起一行显示空白,再接着另起一行输出333
|
||||
writeln("111", "222");
|
||||
writeln("333");
|
||||
{结果页面中,运行信息下打印:
|
||||
111222
|
||||
333
|
||||
}
|
||||
```
|
||||
|
||||
##### Write
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 先输出123456,接着另起一行输出789
|
||||
write("123", "456");
|
||||
write("789");
|
||||
return;
|
||||
{在结果页面中打印:
|
||||
123456
|
||||
789}
|
||||
```
|
||||
|
||||
#### CGI变量以及环境相关函数
|
||||
|
||||
##### 内容
|
||||
|
||||
- HttpGetContent
|
||||
- HttpGetContentLength
|
||||
- HttpGetQueryString
|
||||
- HttpGetRequestMethod
|
||||
- HttpGetQueryValues
|
||||
- HttpGetQueryValueByName
|
||||
- HttpGetQueryValueByNameEx
|
||||
- HttpGetScriptName
|
||||
- HttpGetPathInfo
|
||||
- HttpGetPathTranslated
|
||||
- HttpGetRemoteHost
|
||||
- HttpGetRemoteAddr
|
||||
- HttpGetAuthType
|
||||
- HttpGetRemoteUser
|
||||
- HttpGetRemoteIdent
|
||||
- HttpGetHttpAccept
|
||||
- HttpGetHttpUserAgent
|
||||
- HttpGetServerName
|
||||
- HttpGetServerPort
|
||||
- HttpGetServerProtocol
|
||||
- HttpGetServerSoftware
|
||||
- HttpGetGatewayInterface
|
||||
- HttpGetCookie
|
||||
- HttpGetEnvVar
|
||||
- HttpSetHeadString
|
||||
|
||||
##### HttpGetContent
|
||||
|
||||
##### HttpGetContentLength
|
||||
|
||||
##### HttpGetQueryString
|
||||
|
||||
范例
|
||||
|
||||
前端执行的是http://hostname/test.tsl?name=billgates&sex=male,
|
||||
|
||||
则返回的值为name=billgates&sex=male
|
||||
|
||||
##### HttpGetRequestMethod
|
||||
|
||||
##### HttpGetQueryValues
|
||||
|
||||
##### HttpGetQueryValueByName
|
||||
|
||||
##### HttpGetQueryValueByNameEx
|
||||
|
||||
##### HttpGetScriptName
|
||||
|
||||
##### HttpGetPathInfo
|
||||
|
||||
##### HttpGetPathTranslated
|
||||
|
||||
##### HttpGetRemoteHost
|
||||
|
||||
##### HttpGetRemoteAddr
|
||||
|
||||
##### HttpGetAuthType
|
||||
|
||||
##### HttpGetRemoteUser
|
||||
|
||||
##### HttpGetRemoteIdent
|
||||
|
||||
##### HttpGetHttpAccept
|
||||
|
||||
##### HttpGetHttpUserAgent
|
||||
|
||||
##### HttpGetServerName
|
||||
|
||||
##### HttpGetServerPort
|
||||
|
||||
##### HttpGetServerProtocol
|
||||
|
||||
##### HttpGetServerSoftware
|
||||
|
||||
##### HttpGetGatewayInterface
|
||||
|
||||
##### HttpGetCookie
|
||||
|
||||
##### HttpGetEnvVar
|
||||
|
||||
##### HttpSetHeadString
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,773 +0,0 @@
|
||||
### TSL编译工具
|
||||
|
||||
#### 内容
|
||||
|
||||
- 功能简介
|
||||
- 应用场景
|
||||
- 特性
|
||||
- 编译范围
|
||||
- TSL指令
|
||||
- 调用效率的测试
|
||||
- 依赖关系
|
||||
|
||||
#### 功能简介
|
||||
|
||||
将TSL代码编译成为可执行文件和动态库文件,支持windows与linux环境。
|
||||
|
||||
编译成为可执行文件,即开发的程序与应用可作为一个独立运行的小程序,不需要依赖天软客户端或天软解释器。
|
||||
|
||||
编译动态库文件,可将天软函数包编译成动态链接库,方便其它开发工具如C++等进行调用,为第三方开发工具提供支撑,如由TSL开发的算法等,让TSL语言程序可被更广泛地应用。
|
||||
|
||||
#### 应用场景
|
||||
|
||||
##### 内容
|
||||
|
||||
- 编译可执行文件
|
||||
- 编译动态库
|
||||
|
||||
##### 编译可执行文件
|
||||
|
||||
此前,天软语言只支持脚本方式运行,即在.NET平台、本地解释器或.web平台中进行执行。若只作为天软的建模语言,已经满足了一般需求,然而,随着天软语言支持功能的扩展,其应用也越来越广泛,如用来开发编译桌面应用的天软TSL语言桌面开发工具,开发好的应用是需要通过TSL.exe去执行这个桌面应用的,这种方式不利于这些应用的发布,由此,编译成为可执行文件就显的很有必要。
|
||||
|
||||
另外,天软还提供了信创版的客户端,该客户端也是基于TSL语言的开发程,支持编译成可执行文件后,就可以将这些已开发的应用直接编译成windows或linux的可执行程序,用起来就会非常方便。
|
||||
|
||||
除此之外,还有例如一些管理工具,业务的应用的小程序等,都可生成为一个独立的可执行文件。
|
||||
|
||||
##### 编译动态库
|
||||
|
||||
可将天软TSL语言函数包创建成一个动态链接库(即DLL文件),并将该函数包进行输出。如此,在第三方工具如C++中,只需将生成的该动态库进行引入后,就可直接调用,不再需要天软TSSVRAPI等包的支持。
|
||||
|
||||
还可以将一些复杂的算法,通过TSL语言进行开发后编译成动态库,放入到其它语言工具中,就可以直接进行调用,不需要重复开发。
|
||||
|
||||
#### 特性
|
||||
|
||||
TSL编译工具的三特性:
|
||||
|
||||
其中,
|
||||
|
||||
独立编译:目前,除Linux中编译动态库还需依赖GCC相关功能才能完成外,其它编译工作,如windows中编译可执行文件与动态库,及Linux中编译可执行文件等,都已实现不依赖其它编译工具就可独立完成。
|
||||
|
||||
线程安全:输出的动态库可被多线程并发,且线程安全。
|
||||
|
||||
接口高效:利用TSL编译出来的动态库,接口调用所花费的时间消耗在亚微秒级别,效率非常高,大概一秒钟可以调用107次,能适用于交易级别的应用。
|
||||
|
||||
#### 编译范围
|
||||
|
||||
编译工具可将TSL语言的源代码与函数库,以及相关的资源文件,如配置类.ini文件,桌面开发工具中的窗体.dfm文件、窗口资源文件等,都可以通过天软编译工具生成一个单一的目标文件(即单一的可执行文件或.so或.dll),该文件的运行仅依赖天软运行环境的动态库,可方便程序的直接运行与业务应用的安装发布。
|
||||
|
||||
#### TSL指令
|
||||
|
||||
根据编译目标大致可分为三块指令:
|
||||
|
||||
可执行文件(.exe),编译命--buildexe=
|
||||
|
||||
可选项一: -buildgui,用来指定编译出来的目标是Windows
|
||||
UI应用程序,默认为控制台应用程序。
|
||||
|
||||
可选项二:--buildico=,用来指定Windows icon图标。
|
||||
|
||||
以上两个可选项只在Windows下有效,在Linux中不生效。
|
||||
|
||||
动态库(.dll/.so),编译命--buildlib=,
|
||||
|
||||
可选项一--exports=,可以指定输出的函数。
|
||||
|
||||
包文件,编译命令--build=
|
||||
|
||||
另外,还新增了对包执行等相关命令
|
||||
|
||||
如执行包文件,命令为:--runpkg=
|
||||
|
||||
加载包文件,命令为:--pkg=
|
||||
|
||||
等等,详情可参考TSL命令集列表。
|
||||
|
||||
目前提供的指令功能分布大致如下:
|
||||
|
||||
如,将TSLDemo01.tsl程序编译成可执行文件,操作如下:
|
||||
|
||||
在文件路径下进入控制台,执行以下命令:
|
||||
|
||||
tsl --buildexe=TSLDemo01.tsl --output=test01.exe
|
||||
|
||||
执行完后在当前路径中会新增一个test01.exe可执行文件,如下所示:
|
||||
|
||||
双击test01.exe即可启动运行该程序。
|
||||
|
||||
##### 内容
|
||||
|
||||
- TSL命令集列表
|
||||
- 命令集详细解析
|
||||
|
||||
##### TSL命令集列表
|
||||
|
||||
执行命令行的命令为:tsl xxx
|
||||
|
||||
Windows命令集
|
||||
|
||||
| 命令 | 功能说明 | 备注 |
|
||||
| ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| tsl.exe /? | 查看命令列表帮助,或TSL /? | 注意/前有一个空格 |
|
||||
| -COMPILE\|-COMPILEC [/S] [-S] tslfiename | 将tsl/tsf文件编译为二进制格式文件。<br>-COMPILE命令生成的文件后缀为.TSB<br>- COMPILEC命令生成的文件后缀为.TSC<br>可选项<br>/S:递归模式,即加上该可选命令后,会从子目录中查找该函数。默认只在当前目录下查找。<br>-S:安静模式,不打印执行结果的信息 | 默认生成的文件与原文件同目录,如:<br>Tsl -COMPILE TsfDemo01.tsf<br>作用:编译成二进制文件后,函数与脚本照样可以正常调用,可以用于隐藏源代码。 |
|
||||
| 编译指令 | | |
|
||||
| --buildexe=tslfilename | 将指定tsl文件编译成可执行(.exe)文件,默认生成文件名为default.exe,可执行文件默认图标为tsl编译器图标 | |
|
||||
| 其可选项 | -buildgui<br>指定编译的可执行文件为Windows UI应用程序 | 默认为控制台应用程序 |
|
||||
| | --buildico=xxx.ico<br>指定可执行文件的图标 | 默认为TSL.exe的图标 |
|
||||
| --buildlib=tsl(tsf)filename | 将指定tsl/tsf文件编译成动态库(.dll)文件 | 默认生成文件名为default.dll |
|
||||
| 其可选项 | `--exports=func1[:exp1][,…]`<br>将指定函数名输出在动态库中 | 指定多个函数用逗号分割 |
|
||||
| --build=tslfilename | 将指定tsl文件编译成.tsg包文件,默认生成文件名为default.tsg | 可以通过函数获取包中资源内容rs:<br>getglobalcache("@@tsl-resource@@",rs) |
|
||||
| 编译指令的可选项 | --buildexe\|--buildlib\|--build通用的可选项 | |
|
||||
| --output=filename | 给输出目标指定文件路径与名称 | 默认为<br>default.exe\|default.dll\|default.tsg<br>默认生成在当前路径下 |
|
||||
| -strong | 编译所有引用,将所有依赖的引用都进行编译<br>缺省为仅编译调用的 | 解决调用了某些动态库不能被检测到的函数。 |
|
||||
| --depends=fun1,fun2,… | 指定额外需要编译的函数列表 | 多个函数或路径用,分隔 |
|
||||
| --dependsdir=dir1,dir2,… | 指定额外需要编译的函数路径 | |
|
||||
| --excludes=fun1,fun2,… | 不编译某些函数 | |
|
||||
| --resourcedir=foldername | 指定编译资源文件目录 | |
|
||||
| --resourcepat=pat1,pat2,… | 指定资源文件的匹配串 | 需要搭配--resourcedir=一起使用 |
|
||||
| -resourcekeepdir | 资源名保留相对路径 | |
|
||||
| --extresource=filename1<br>[:keyname1],filename2… | 指定额外的资源 | |
|
||||
| 运行指令 | | |
|
||||
| --runpkg=packagename | 执行包文件 | 如:tsl --runpkg=runpkg.tsg |
|
||||
| -eval tslstring | 执行TSL脚本串 | 如:tsl -eval “inttostr(100)” |
|
||||
| tslfilename | 执行TSL脚本文件 | 如:tsl test.tsl |
|
||||
| 其可选项 | -LIBPATH | 扩展函数查找路径 |
|
||||
| | -TESTMULTITHREAD N | 线程调用,N为线程数 |
|
||||
| | -NODEBUGSERVER | 不启用调试服务器 |
|
||||
| | -DEBUGSERVER | 开启调试服务器 |
|
||||
| | -DEBUGPORT port | 指定调试监听端口 |
|
||||
| | -DEBUGLISTEN ip | 指定调试监听地址 |
|
||||
| | -DEBUGTHREADS N | 指定调试用于网络通信的线程数 |
|
||||
| | -WAITATTACH | 运行时等待调试程序连接 |
|
||||
| | -DEBUGLOGIN 1\|0 | 是否需要进行用户登陆 |
|
||||
| | --data-dir=datapath | 使用指定文件夹中的配置文件 |
|
||||
| | --pkg=pgk1,pkg2… | 加载指定包中的函数 |
|
||||
| 其它指令 | | |
|
||||
| -ENCODE configstring | 生成加密串 | 用于数据库配置串加密 |
|
||||
| -ENCODEDEBUGPASS | 生成密码串的加密串 | 用于远程调试配置中密码的加密 |
|
||||
|
||||
Linux命令集
|
||||
|
||||
| 命令 | 说明 | 备注 |
|
||||
| ------------------------------------- | ---------------- | ------------------- |
|
||||
| TSL /? | 查看命令列表帮助 | 注意TSL后有一个空格 |
|
||||
| 其它命令参考Windows命令集,注意大小写 | | |
|
||||
|
||||
##### 命令集详细解析
|
||||
|
||||
提示:以下命令的操作展示都是在windows操作系统中完成的。
|
||||
|
||||
###### 内容
|
||||
|
||||
- 查看命令帮助
|
||||
- 编译成二进制文件
|
||||
- 编译成可执行文件
|
||||
- 编译动态库
|
||||
- 编译包文件
|
||||
- 编译命令的其它可选项
|
||||
- 执行包文件(.tsg)
|
||||
- 生成加密串
|
||||
- 执行TSL代码串
|
||||
- 加密密码串
|
||||
- 执行TSL脚本
|
||||
|
||||
###### 查看命令帮助
|
||||
|
||||
进入cmd中,执行:tsl /?
|
||||
|
||||
展示所有命令及其帮助说明,显示如下:
|
||||
|
||||
###### 编译成二进制文件
|
||||
|
||||
语法:-COMPILE|-COMPILEC [/S] [-S] tslfilename
|
||||
|
||||
功能:将指定脚本文件编译成二进制文件。
|
||||
|
||||
场景一:默认方式下将tsf文件生成二进制文件
|
||||
|
||||
输入:
|
||||
|
||||
tsl -COMPILE C:\DoTSL\CompileToExe\TsfDemo01.tsf
|
||||
|
||||
输出:在tsf文件同目录下生成.TSB文件。
|
||||
|
||||
新增文件如下:
|
||||
|
||||
####### 内容
|
||||
|
||||
- 可选项:/S 递归模式
|
||||
- 可选项:-S 安静模式
|
||||
|
||||
####### 可选项:/S 递归模式
|
||||
|
||||
功能:编译时,若当前目录下无目标文件,会查找子目录下的目标进行编译
|
||||
|
||||
如:被编译的文件TsfFuncB.tsf在C:\DoTSL\CompileToExe\AAA目录下,命令运行当前路径是在C:\DoTSL\CompileToExe\,执行以下操作进行对比:
|
||||
|
||||
| 执行命令 | 结果说明 |
|
||||
| ------------------------------------------------------------ | -------------------------------------------------------------------- |
|
||||
| 默认情况下进行编译<br>命令行:tsl -COMPILE TsfFuncB.tsf | 执行结果:编译失败,找不到目标文件,原因是默认只在当前路径下查找。 |
|
||||
| 在递归模式下进行编译<br>命令行:tsl -COMPILE /S TsfFuncB.tsf | 执行结果:编译成功,递归模式下,还会在当前目录下的子目录下进行查找。 |
|
||||
|
||||
执行具体表现如下:
|
||||
|
||||
####### 可选项:-S 安静模式
|
||||
|
||||
功能:安静模式,不打印执行结果的信息。
|
||||
|
||||
如:安静模式命令:tsl -COMPILE -S TsfFuncA.tsf
|
||||
|
||||
默认情况下的命令:tsl -COMPILE TsfFuncA.tsf
|
||||
|
||||
对比结果如下,安静模式下,不打印执行是否成功的提示信息。
|
||||
|
||||
###### 编译成可执行文件
|
||||
|
||||
命令:--buildexe=tslfilename
|
||||
|
||||
功能:将指定tsl脚本文件编译成可执行文件,同时会编译该函数的相关依赖。
|
||||
|
||||
场景:将目标文件编译成.exe可执行文件,默认文件名为default.exe
|
||||
|
||||
输入:tsl --buildexe=TD_TSL_ExePath.tsl
|
||||
|
||||
输出:在tsl文件同目录下生成.exe可执行文件。默认是一个控制台应用
|
||||
|
||||
运行结果和新增文件如下:
|
||||
|
||||
默认图标为天软客户端图标。
|
||||
|
||||
####### 内容
|
||||
|
||||
- 可选项:-buildgui 指定为Windows UI应用程序
|
||||
- 可选项:--buildico= 指定图标
|
||||
|
||||
####### 可选项:-buildgui 指定为Windows UI应用程序
|
||||
|
||||
命令:-buildgui
|
||||
|
||||
功能:指定编译的可执行文件为Windows UI应用程序。
|
||||
|
||||
场景:将创建了界面的脚本编译成带有图形界面的.exe可执行文件,指定文件名为buildgui.exe
|
||||
|
||||
输入:tsl --buildexe=Test_GUIexe.tsl --output=buildgui.exe -buildgui
|
||||
|
||||
输出:在tsl文件同目录下生成一个带有图形界面的buildgui.exe可执行文件。
|
||||
|
||||
新增文件以及buildgui.exe执行结果如下:
|
||||
|
||||
以下是上述Test_GUIexe.tsl文件中的代码,仅供参考。执行下述案例中用到了界面tslvcl工具包。
|
||||
|
||||
```tsl
|
||||
uses tslvcl;
|
||||
app := initializeapplication();
|
||||
app.createform(class(tfm), fm);
|
||||
fm.show();
|
||||
app.run();
|
||||
type tfm = class(TVCForm)
|
||||
uses tslvcl;
|
||||
function Create(AOwner);
|
||||
begin
|
||||
inherited;
|
||||
end;
|
||||
end;
|
||||
```
|
||||
|
||||
####### 可选项:--buildico= 指定图标
|
||||
|
||||
命令:--buildico=iconfile
|
||||
|
||||
功能:指定输出文件的图标,默认为天软可执行文件的图标。
|
||||
|
||||
场景:将输出的可执行文件的图标指定为ts.ico图标,文件名为buildico.exe
|
||||
|
||||
输入:tsl --buildexe=TD_TSL_ExePath.tsl --output=buildico.exe --buildico=ts.ico
|
||||
|
||||
输出:在tsl文件同目录下生成一个带有自定义图标的buildico.exe可执行文件。
|
||||
|
||||
注:自定义图标文件只能为.ico格式图片,否则编译时打印错误信息,但不会影响编译。
|
||||
|
||||
如发现编译后的可执行文件图标没有更改,可能是windows存有缓存。
|
||||
|
||||
###### 编译动态库
|
||||
|
||||
命令:--buildlib=tsl(tsf)filename
|
||||
|
||||
功能:将tsl/tsf文件编译成动态库, 同时会编译该函数或脚本中的相关依赖
|
||||
|
||||
场景:将指定的tsl文件及相关依赖编译到一个.dll动态库文件中
|
||||
|
||||
输入:tsl --buildlib=TD_TSL_ExePath.tsl
|
||||
|
||||
输出:在tsl文件同目录下生成.dll文件。tsl文件及其依赖会编译至单个文件中。
|
||||
|
||||
运行结果和新增文件如下:
|
||||
|
||||
####### 内容
|
||||
|
||||
- 可选项:--exports 输出指定函数名
|
||||
|
||||
####### 可选项:--exports 输出指定函数名
|
||||
|
||||
命令:--exports=func1[:exp1],…
|
||||
|
||||
功能:将指定函数输出在动态库中,多个函数用逗号分割
|
||||
|
||||
场景:将目标文件编译成动态库文件,并在动态库的函数列表中暴露函数TD_TSL_ExePath,别名为
|
||||
|
||||
ExePath
|
||||
|
||||
输入:tsl --buildlib=TD_TSL_ExePath.tsl --exports=TD_TSL_ExePath:ExePath
|
||||
|
||||
输出:在tsl文件同目录下生成.dll文件。
|
||||
|
||||
执行上述语句打印信息如下:
|
||||
|
||||
可以通过visual studio自带工具可以查看.dll文件暴露出的方法,如下所示:
|
||||
|
||||
###### 编译包文件
|
||||
|
||||
命令:--build=tslfilename
|
||||
|
||||
功能:将tsl/tsf文件编译成.tsg包文件, 同时会编译目标函数或脚本中的相关依赖
|
||||
|
||||
场景:将指定的tsl文件编译成.tsg包文件
|
||||
|
||||
输入:tsl --build=TD_TSL_ExePath.tsl
|
||||
|
||||
输出:在tsl文件同目录下生成.tsg包文件。
|
||||
|
||||
运行结果和新增文件如下:
|
||||
|
||||
###### 编译命令的其它可选项
|
||||
|
||||
在执行--build| --buildexe| --buildlib编译命令时,可添加的可选项的使用样例。
|
||||
|
||||
在不添加可选项时,编译默认会包含tsl文件中调用的tsf函数文件。不加额外参数的情况下,默认编译文件名为default.xxx,且文件生成在当前路径下。
|
||||
|
||||
####### 内容
|
||||
|
||||
- --output= 输出目标文件的名称与路径
|
||||
- -strong 编译所有引用
|
||||
- --depends= 指定函数列表
|
||||
- --dependsdir= 函数扩展路径
|
||||
- --excludes= 不编译指定函数
|
||||
- --resourcedir= 资源扩展路径
|
||||
- --resourcepat= 指定资源匹配串
|
||||
- -resourcekeepdir 保留相对路径
|
||||
- --extresource= 指定额外资源
|
||||
|
||||
####### --output= 输出目标文件的名称与路径
|
||||
|
||||
可选命令:--output=filename
|
||||
|
||||
功能:给输出目标指定文件路径与名称
|
||||
|
||||
场景:将目标文件编译成名为test.tsg的包文件,并且指定输出目录为子目录output
|
||||
|
||||
输入:tsl --build=TD_TSL_ExePath.tsl --output=.\output\test.tsg
|
||||
|
||||
输出:在当前运行目录下的output子文件夹中生成test.tsg文件。
|
||||
|
||||
####### -strong 编译所有引用
|
||||
|
||||
命令:-strong
|
||||
|
||||
功能:将所有依赖的引用都进行编译
|
||||
|
||||
场景:目标文件中调用了单元方法,单元中其它方法还调用了其它函数,将目标文件编译成.exe可执行文件,且将所有没有被调用到的引用也编译至生成文件中
|
||||
|
||||
输入:tsl--buildexe=TestDemo01.tsl -strong
|
||||
|
||||
输出:在tsl文件同目录下生成.exe可执行文件。
|
||||
|
||||
展示如下(包括不加该选项的对照):
|
||||
|
||||
其中,TestDemo01.tsl?的源代码如下:
|
||||
|
||||
```tsl
|
||||
uses TSLUnitDemo01;
|
||||
a := 10;
|
||||
t := FuncA(a);
|
||||
echo "TSLUnitDemo01.FuncA", t;
|
||||
sleep(10 * 1000);
|
||||
return t;
|
||||
```
|
||||
|
||||
TSLUnitDemo01单元的源代码如下:
|
||||
|
||||
```tsl
|
||||
unit TSLUnitDemo01;
|
||||
interface
|
||||
function FuncA(a);
|
||||
function FuncB(a);
|
||||
implementation
|
||||
function FuncA(a);
|
||||
begin
|
||||
return a + 20;
|
||||
end;
|
||||
function FuncB(a);
|
||||
begin
|
||||
a := TD_Test(a);
|
||||
return a * a;
|
||||
end;
|
||||
Initialization
|
||||
FuncA(2);
|
||||
Finalizationend.
|
||||
```
|
||||
|
||||
####### --depends= 指定函数列表
|
||||
|
||||
命令:--depends=fun1,fun2,…
|
||||
|
||||
功能:指定额外的需要一起编译的函数列表,多个函数用,分隔
|
||||
|
||||
场景:目标函数不依赖该函数的情况下,将该函数与目标文件一起编译至动态库中
|
||||
|
||||
输入:tsl --buildlib=Test_depends.tsl --depends=Test01_TD
|
||||
|
||||
输出:在tsl文件同目录下生成.dll文件。
|
||||
|
||||
####### --dependsdir= 函数扩展路径
|
||||
|
||||
命令:--dependsdir=dir1,dir2,…
|
||||
|
||||
功能:指定其它需要被编译的函数路径
|
||||
|
||||
场景:将指定文件夹(子目录\test)中的所有函数一起编译至动态库中
|
||||
|
||||
输入:tsl --buildlib=Test_dependsdir.tsl --dependsdir=test
|
||||
|
||||
输出:在tsl文件同目录下生成.dll文件,该dll中包含指定路径下的所有文件。
|
||||
|
||||
####### --excludes= 不编译指定函数
|
||||
|
||||
命令:--excludes=fun1,fun2,…
|
||||
|
||||
功能:不编译指定函数,一般用于在依赖范围内时需要不被编译的场景
|
||||
|
||||
场景:将一个调用了Test01_TD函数的脚本文件编译成可执行文件,并且指定Test01_TD函数不被编译。
|
||||
|
||||
输入:tsl --buildexe=Test_depends.tsl --excludes=Test01_TD
|
||||
|
||||
输出:生成可执行文件,该文件中不包含Test01_TD函数
|
||||
|
||||
其生成过程的表及与运行该可执行文件的表现如下:运行会报找不到Test01_TD函数的错,说明打包中没有该模型。
|
||||
|
||||
注:编译过程中的打印信息是指分析到的依赖关系或资源文件,像上面Test01_TD这种被依赖但是不需要编译的文件还是会被打印在提示信息中。
|
||||
|
||||
####### --resourcedir= 资源扩展路径
|
||||
|
||||
命令:--resourcedir=foldername
|
||||
|
||||
功能:指定其它需要被编译的资源路径。
|
||||
|
||||
场景:在编译动态库文件时,指定子目录\ resourcedir\下的文件一起编译至动态库中
|
||||
|
||||
输入:tsl --buildlib=Test_resourcedir.tsl --resourcedir=resource
|
||||
|
||||
执行上述语句,打印信息如下:
|
||||
|
||||
资源文件夹中文件如下:
|
||||
|
||||
####### --resourcepat= 指定资源匹配串
|
||||
|
||||
命令:--resourcepat=pat1,pat2,…
|
||||
|
||||
功能:将指定目录下的符合匹配串的文件编译进目标文件中,需要通过--resourcedir=进行指定目录,指定当前目录时,用--resourcedir=.\。
|
||||
|
||||
场景01:在编译成可执行文件时,将\ resource
|
||||
\目录下的所有.ini文件编译至生成文件中。
|
||||
|
||||
输入:tsl --buildexe=Test_resourcepat.tsl --resourcedir=resource
|
||||
--resourcepat="\*.ini"
|
||||
|
||||
输出:在同目录下生成了.exe文件,并一起编译了\ resource \目录下的ini文件
|
||||
|
||||
子目录\ resource
|
||||
\文件夹如下:可以看出上面的命令中只编译了两个ini,其它文件没有被编译。
|
||||
|
||||
Test_resourcepat.tsl中代码如下:
|
||||
|
||||
```tsl
|
||||
echo "\r\n";
|
||||
echo "Running!!\r\n";
|
||||
getglobalcache("@@tsl-resource@@", rs); // 获取可执行文件中的所有资源文件信息
|
||||
echo tostn(rs);
|
||||
sleep(20 * 1000);
|
||||
return 1;
|
||||
```
|
||||
|
||||
执行目标文件打印如下:可以到符合条件的ini文件信息
|
||||
|
||||
场景02:编译可执行文件时,将当前路径及其子路径下的pat.ini文件一起编译。
|
||||
|
||||
输入:tsl --buildexe=Test_resourcepat.tsl --resourcedir=.\
|
||||
--resourcepat="pat.ini"
|
||||
|
||||
输出:生成.exe文件,并编译了两个路径下的pat.ini文件
|
||||
|
||||
执行命令目录下的pat.ini文件展示如下:
|
||||
|
||||
####### -resourcekeepdir 保留相对路径
|
||||
|
||||
命令:-resourcekeepdir
|
||||
|
||||
功能:资源文件名中保留文件的相对路径
|
||||
|
||||
场景:编译可执行文件时,编译pat.ini文件,并保留相对路径,目标源代码中输出当前资源数据。
|
||||
|
||||
输入:tsl --buildexe=Test_resourcekeepdir.tsl --resourcedir=.\
|
||||
--resourcepat=pat.ini -resourcekeepdir
|
||||
|
||||
输出:生成可执行文件。
|
||||
|
||||
执行可执行文件:资源文件名中加入了相对路径
|
||||
|
||||
下面是不加相对路径命令的生成结果:可对比查看差异
|
||||
|
||||
####### --extresource= 指定额外资源
|
||||
|
||||
命令:--extresource=filename1[:keyname1],filename2…
|
||||
|
||||
功能:将指定资源加入编译,一般用于需要额外加入资源文件时使用,支持相对路径的指定
|
||||
|
||||
场景:在编译可执行文件时,将ts.ico图标文件一起编译
|
||||
|
||||
输入:tsl--buildexe=Test01_TD.tsl?--extresource=ts.ico
|
||||
|
||||
输出:生成.exe文件
|
||||
|
||||
执行编译与运行可执行文件展示:资源包中存在ts.ico文件
|
||||
|
||||
其中Test01_TD.tsl?的源程序如下:
|
||||
|
||||
```tsl
|
||||
echo "\r\n";
|
||||
echo "Running!!\r\n";
|
||||
getglobalcache("@@tsl-resource@@", rs); // 获取包中的资源文件信息
|
||||
echo tostn(rs);
|
||||
sleep(20 * 1000);
|
||||
return 1;
|
||||
```
|
||||
|
||||
###### 执行包文件(.tsg)
|
||||
|
||||
命令:--runpkg=packagename
|
||||
|
||||
功能:执行包文件
|
||||
|
||||
场景:执行一个写入本地test_runpkg.txt文件中的包文件
|
||||
|
||||
输入:tsl --runpkg=runpkg.tsg
|
||||
|
||||
输出:运行.tsg包文件,在本地新增test_runpkg.txt文件,并写入内容
|
||||
|
||||
其中,包中目标文件的的源代码如下:
|
||||
|
||||
```tsl
|
||||
content := "test_runpkg";
|
||||
writefile(rwraw(), "", "D:\\test\\tslCmdTest\\runpkg\\test_runpkg.txt", 0, 1000, content);
|
||||
return 1;
|
||||
```
|
||||
|
||||
####### 内容
|
||||
|
||||
- 可选项:--pkg= 加载指定资源包
|
||||
|
||||
####### 可选项:--pkg= 加载指定资源包
|
||||
|
||||
命令:--pkg=pkg1,pkg2…
|
||||
|
||||
功能:执行包文件的同时,加载指定包文件。
|
||||
|
||||
场景:执行包文件,加载并调用指定包中的函数
|
||||
|
||||
输入:tsl --runpkg=main.tsg --pkg=data.tsg,SumVol.tsg
|
||||
|
||||
输出:运行结果如下
|
||||
|
||||
注:
|
||||
|
||||
包main.tsg对应的TSL代码如下:
|
||||
|
||||
```tsl
|
||||
echo evalData(0);
|
||||
function evalData(n)
|
||||
begin
|
||||
data := data();
|
||||
ret :=
|
||||
case n of
|
||||
0:SumVol(data);
|
||||
1:AvgVol(data);
|
||||
2:SumAmount(data);
|
||||
3:AvgAmount(data);
|
||||
end;
|
||||
return ret;
|
||||
end;
|
||||
```
|
||||
|
||||
包data.tsg对应的TSL代码如下:
|
||||
|
||||
```tsl
|
||||
function data()
|
||||
begin
|
||||
return array(
|
||||
("StockID":"SZ000002", "收盘价":7.79, "成交量":189366181.0, "成交金额":1482908609.8),
|
||||
("StockID":"SZ000002", "收盘价":7.64, "成交量":145843421.0, "成交金额":1110094218.41),
|
||||
("StockID":"SZ000002", "收盘价":7.53, "成交量":136469106.0, "成交金额":1027113710.84),
|
||||
("StockID":"SZ000002", "收盘价":7.77, "成交量":211713302.0, "成交金额":1624520449.34),
|
||||
("StockID":"SZ000002", "收盘价":7.53, "成交量":159372804.0, "成交金额":1205270122.69),
|
||||
("StockID":"SZ000002", "收盘价":7.48, "成交量":97780993.0, "成交金额":732008884.19)
|
||||
);
|
||||
end;
|
||||
```
|
||||
|
||||
包SumVol.tsg对应的TSL代码如下:
|
||||
|
||||
```tsl
|
||||
function SumVol(data)
|
||||
begin
|
||||
return sum(data[:, "成交量"]);
|
||||
end;
|
||||
```
|
||||
|
||||
###### 生成加密串
|
||||
|
||||
命令:-ENCODE configstring
|
||||
|
||||
功能:生成指定字符串的加密串,可用于数据库配置串的加密处理。
|
||||
|
||||
场景:对数据库的连接串进行加密处理
|
||||
|
||||
输入:tsl -encode "Server=127.0.0.1;Database=tsBase;Uid=TinySoft;Pwd=admin;"
|
||||
|
||||
输出:返回加密串
|
||||
|
||||
###### 执行TSL代码串
|
||||
|
||||
命令:-eval tslstring
|
||||
|
||||
功能:执行TSL语言代码串
|
||||
|
||||
场景:执行字符串” datetostr(20231106T)”
|
||||
|
||||
输入:tsl -eval "datetostr(20231106T)"
|
||||
|
||||
输出:返回串执行的结果
|
||||
|
||||
###### 加密密码串
|
||||
|
||||
命令:-ENCODEDEBUGPASS password
|
||||
|
||||
功能:生成密码串加密后的串,用于远程调试配置中对密码信息的加密隐藏
|
||||
|
||||
场景:生成密码“admin”的加密串
|
||||
|
||||
输入:tsl -encodedebugpass admin
|
||||
|
||||
输出:得到加密后的密码串
|
||||
|
||||
###### 执行TSL脚本
|
||||
|
||||
命令:tsl filename
|
||||
|
||||
功能:执行指定tsl程序,若不在当前路径下,需要加上路径信息。
|
||||
|
||||
场景:执行TSLDemo01.tsl
|
||||
|
||||
输入:tsl TSLDemo01.tsl
|
||||
|
||||
####### 内容
|
||||
|
||||
- 可选项:-LIBPATH 扩展函数查找路径
|
||||
- 可选项:-TESTMULTITHREAD多线程执行
|
||||
- 可选项:--pkg= 加载指定资源包
|
||||
|
||||
####### 可选项:-LIBPATH 扩展函数查找路径
|
||||
|
||||
命令:-LIBPATH libpath
|
||||
|
||||
功能:设置函数(.tsf)的搜索路径,多个路径用分号分割,当前路径为.场景:执行TSLDemo01.tsl脚本,程序中有调用函数TsfFuncA(),且该函数不在当前目录下
|
||||
|
||||
输入:tsl TSLDemo01.tsl -libpath .\aaa\
|
||||
|
||||
输出:如下图所示,成功调用TsfFuncA ()函数
|
||||
|
||||
TsfFuncA函数的路径如下:
|
||||
|
||||
####### 可选项:-TESTMULTITHREAD多线程执行
|
||||
|
||||
命令:-TESTMULTITHREAD N
|
||||
|
||||
功能:指定N个线程调用脚本
|
||||
|
||||
场景:起用5个线程调用testMultiThread.tsl,该脚本中执行打印当前线程的id号
|
||||
|
||||
输入:tsl testMultiThread.tsl -TestMultiThread 5
|
||||
|
||||
输出:如下图,打印了5个不同线程的id号,说明函数被调用了5次
|
||||
|
||||
其它更多请查看命令列表的介绍。
|
||||
|
||||
####### 可选项:--pkg= 加载指定资源包
|
||||
|
||||
命令:--pkg=pkg1,pkg2…
|
||||
|
||||
功能:加载包文件。
|
||||
|
||||
场景:执行调用包中的函数的脚本
|
||||
|
||||
输入:tsl TestAAA.tsl--pkg=TestB.tsg
|
||||
|
||||
输出:运行结果如下
|
||||
|
||||
注:上述中给出了不加载包时执行的结果,方便功能体现。
|
||||
|
||||
#### 调用效率的测试
|
||||
|
||||
通过上述测试可以看出:调用TSL编译的动态库1千万次,只花费了1.9秒,属于亚微秒级别的调用,可用于交易级别的开发中。
|
||||
|
||||
#### 依赖关系
|
||||
|
||||
##### 内容
|
||||
|
||||
- 查找执行文件的依赖关系
|
||||
- SysGetFuncdepends
|
||||
|
||||
##### 查找执行文件的依赖关系
|
||||
|
||||
在实现编译成可执行文件以及动态库的过程中,有一个重要的过程,即查找执行文件的依赖关系。
|
||||
|
||||
因此,天软提供了SysGetFuncdepends模型,专门获取指定目标的依赖关系。
|
||||
|
||||
查找的依赖关系范围包括如下:
|
||||
|
||||
##### SysGetFuncdepends
|
||||
|
||||
范例
|
||||
|
||||
范例01:查找函数的依赖关系
|
||||
|
||||
```tsl
|
||||
obj := Findfunction("stockzf");
|
||||
v := SysGetFuncdepends(obj, 2 + 4 + 8, v1, v2);
|
||||
return array("依赖的函数信息":v, "二进制函数信息":v1, "二进制类信息":v2);
|
||||
```
|
||||
|
||||
其中,依赖的函数信息结果截图如下:
|
||||
|
||||
二进制函数信息截图如下:
|
||||
|
||||
范例02:查找类相关函数的依赖关系
|
||||
|
||||
```tsl
|
||||
obj := Findfunction("getPYStringList");
|
||||
v := SysGetFuncdepends(obj, 2 + 4 + 8, v1, v2);
|
||||
return array("依赖的函数信息":v, "二进制函数信息":v1, "二进制类信息":v2);
|
||||
```
|
||||
|
||||
其中,函数getPYStringList调用了天软内置类THashedStringList。
|
||||
|
||||
返回:
|
||||
|
||||
其中,二进制类信息展开如下:
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,738 +0,0 @@
|
||||
### Web开发支撑
|
||||
|
||||
#### 内容
|
||||
|
||||
- TSL的Web支持
|
||||
- Web 工具(.Web Tools)
|
||||
|
||||
#### TSL的Web支持
|
||||
|
||||
##### 内容
|
||||
|
||||
- 介绍
|
||||
- 运行模式
|
||||
- WEB服务器配置方法
|
||||
- 程序结构
|
||||
- 输出
|
||||
- HTML表单处理
|
||||
|
||||
##### 介绍
|
||||
|
||||
TSL 可用于 Web 开发,下面是一个简单示例:
|
||||
|
||||
```text
|
||||
<?tslx>
|
||||
<html>
|
||||
<title>TSL Web Page</title>
|
||||
<body>
|
||||
<?tsl
|
||||
WriteLn("First TSL Web page");
|
||||
?>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
与 PHP类似, TSL代码被嵌入HTML代码中做一些事情,
|
||||
|
||||
与JAVAScript客户端不同的是,TSL代码在服务器端执行,在客户端看不到TSL代码,只能看到由TSL生成的HTML代码。
|
||||
|
||||
##### 运行模式
|
||||
|
||||
Tsl脚本可以以纯cgi的模式执行,也可以用Apache 1.x, 2.x的Module运行,还可以支持以IIS的过滤器来运行,此外,还内置支持了纯CGI对FastCGI的支撑。
|
||||
|
||||
##### WEB服务器配置方法
|
||||
|
||||
如需要使用TSL的WEB解释器,请将安装TSL的目录加入系统路径中。
|
||||
|
||||
以下是各类WEB服务器的配置方法:
|
||||
|
||||
###### 内容
|
||||
|
||||
- IIS
|
||||
- Apache 2.2
|
||||
- Apache 1.x
|
||||
|
||||
###### IIS
|
||||
|
||||
注意:需要在IIS管理器里的Web服务扩展里允许所有CGI扩展和所有未知ISAPI
|
||||
|
||||
####### 内容
|
||||
|
||||
- IIS Module模式
|
||||
- IIS CGI模式
|
||||
|
||||
####### IIS Module模式
|
||||
|
||||
请在IIS管理器里加入IIS_TSL.dll模块关联.tsl类型。
|
||||
|
||||
####### IIS CGI模式
|
||||
|
||||
请在IIS管理器里加入TSLCGI.exe关联.tsl类型。
|
||||
|
||||
###### Apache 2.2
|
||||
|
||||
Apache 2.2与其2.0版本做了比较大的修改,所以TSL取消了模块对2.0的支持,当然CGI模式在各种版本下均支持。如需要使用模块,请下载Apache 2.2的版本。
|
||||
|
||||
####### 内容
|
||||
|
||||
- Apache 2.2 Module模式:
|
||||
- Apache 2.X CGI模式:
|
||||
|
||||
####### Apache 2.2 Module模式:
|
||||
|
||||
在 httpd.conf 中加入:
|
||||
|
||||
```text
|
||||
LoadModule tsl_module C:/Tinysoft/tsl/MOD_TSL2.dll
|
||||
AddType tslscript-handler .tsl
|
||||
AddHandler tslscript-handler .tsl
|
||||
```
|
||||
|
||||
####### Apache 2.X CGI模式:
|
||||
|
||||
在 httpd.conf 中加入:
|
||||
|
||||
```text
|
||||
<Directory "C:/Tinysoft/tsl">
|
||||
AllowOverride None
|
||||
Options None
|
||||
Order allow,deny
|
||||
Allow from all
|
||||
</Directory>
|
||||
|
||||
AddHandler tslscript-handler .tsl
|
||||
ScriptAlias /tsl/ "c:/Tinysoft/tsl/"
|
||||
Action tslscript-handler "/tsl/TSLCgi.exe"
|
||||
```
|
||||
|
||||
或者:
|
||||
|
||||
```text
|
||||
AddHandler cgi-script .tsl
|
||||
```
|
||||
|
||||
并在 `.tsl` 第一行加入:
|
||||
|
||||
```text
|
||||
#!C:/Tinysoft/tsl/tslCgi.exe
|
||||
```
|
||||
|
||||
###### Apache 1.x
|
||||
|
||||
虽然目前Apache的主要版本已经升级为2.2,但是Apache 1.x的版本使用依然很广泛,由于Apache 1.x的版本与2.2版本差异非常之大,所以TSL语言会继续支持Apache 1.x版本。
|
||||
|
||||
####### 内容
|
||||
|
||||
- Apache 1.x Module模式:
|
||||
- Apache 1.x CGI模式:
|
||||
|
||||
####### Apache 1.x Module模式:
|
||||
|
||||
在 httpd.conf 中加入:
|
||||
|
||||
```text
|
||||
LoadModule tsl_module C:/tsl/mod_tsl1.dll
|
||||
AddModule mod_tsl.c
|
||||
AddType application/tslscript .tsl
|
||||
AddHandler tslscript-handler .tsl
|
||||
```
|
||||
|
||||
####### Apache 1.x CGI模式:
|
||||
|
||||
在 httpd.conf 中加入:
|
||||
|
||||
```text
|
||||
<Directory "C:/Tinysoft/tsl">
|
||||
AllowOverride None
|
||||
Options None
|
||||
Order allow,deny
|
||||
Allow from all
|
||||
</Directory>
|
||||
|
||||
ScriptAlias /tsl/ "c:/Tinysoft/tsl/"
|
||||
AddHandler application/tslcgi .tsl
|
||||
Action application/tslcgi "/tsl/tslcgi.exe"
|
||||
```
|
||||
|
||||
或者:
|
||||
|
||||
```text
|
||||
AddHandler cgi-script .tsl
|
||||
```
|
||||
|
||||
并在 `.tsl` 第一行加入:
|
||||
|
||||
```text
|
||||
#!C:/Tinysoft/tsl/tslCgi.exe
|
||||
```
|
||||
|
||||
##### 程序结构
|
||||
|
||||
与 PHP 不同,TSL 脚本默认是程序而非 HTML 文本。
|
||||
|
||||
下面的脚本会直接执行:
|
||||
|
||||
```tsl
|
||||
message := "this is a tsl script";
|
||||
WriteLn(message);
|
||||
```
|
||||
|
||||
若要输出完整 HTML 结构,可显式输出:
|
||||
|
||||
```tsl
|
||||
Write(
|
||||
"<html>\n" +
|
||||
"<body>\n" +
|
||||
"<p>TSL Script</p>\n" +
|
||||
"</body>\n" +
|
||||
"</html>\n"
|
||||
);
|
||||
```
|
||||
|
||||
###### 内容
|
||||
|
||||
- <?tslx> 标记
|
||||
- <?tsl … ?>块
|
||||
|
||||
- <?= ?>块
|
||||
|
||||
###### <?tslx> 标记
|
||||
|
||||
标记后续文本为 HTML 代码,原文输出到网页上,直到出现 `<?tsl`。
|
||||
|
||||
上面的代码可以使用这种标记方式:
|
||||
|
||||
```text
|
||||
<?tslx>
|
||||
<html>
|
||||
<body>
|
||||
<p>TSL Script</p>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
###### <?tsl … ?>块
|
||||
|
||||
```text
|
||||
<?tsl
|
||||
这里可以写 TSL 代码…
|
||||
?>
|
||||
```
|
||||
|
||||
当代码应用了<?tslx>标记后,以后的代码都被解析成文本,如果仍然需要在<?tslx>后执行TSL代码,就需要把代码写在<?tsl和 ?>中间。标识符和代码可以写在一行或多行,如果写在一行,<?tsl和代码必须用空格分开。代码中可以出现多次<?tsl … ?>块。但是不能嵌套。
|
||||
|
||||
上面的代码可以写成:
|
||||
|
||||
```text
|
||||
<?tslx>
|
||||
<html>
|
||||
<body>
|
||||
<p>
|
||||
<?tsl Write("TSL Script");?>
|
||||
</p>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
###### <?= ?>块
|
||||
|
||||
在 `<?tslx>` 环境下,可以使用 `<?= ?>` 简化输出,模式为:
|
||||
|
||||
```text
|
||||
<?= <p1>[, p2 .. pn] ?>
|
||||
```
|
||||
|
||||
例如要输出当前时间:
|
||||
|
||||
```text
|
||||
<?="现在是:", DateTimeToStr(Now())?>
|
||||
```
|
||||
|
||||
##### 输出
|
||||
|
||||
TSL 使用 `Write()`/`WriteLn()` 输出内容,格式为 `Write(p1, p2, ..., pn)`。
|
||||
`WriteLn()` 会追加换行,但浏览器可能忽略连续空白。
|
||||
|
||||
TSL 也支持 `echo` 操作符:`echo <p1>[, p2 .. pn]`。
|
||||
在 `<?tslx>` 块中还可使用 `<?= <p1>[, p2 .. pn] ?>` 简化输出。
|
||||
|
||||
##### HTML表单处理
|
||||
|
||||
当一个表单体交给 TSL 脚本时,表单中的信息会自动在脚本中可用。TSL可以轻松的访问这些信息,例如下面的表单:
|
||||
|
||||
```text
|
||||
<form action="foo.tsl" method="POST">
|
||||
Name: <input type="text" name="username"><br />
|
||||
Email: <input type="text" name="email"><br />
|
||||
<input type="submit" name="submit" value="Submit me!" />
|
||||
</form>
|
||||
```
|
||||
|
||||
TSL 可以通过 `HttpGetQueryValueByName(name: string): string` 取表单字段。
|
||||
|
||||
示例:
|
||||
|
||||
```tsl
|
||||
Write("Name:", HttpGetQueryValueByName("name"), "<br>");
|
||||
Write("Email:", HttpGetQueryValueByName("email"));
|
||||
```
|
||||
|
||||
为了使用简单,TSL使用HttpGetQueryValueByName方法,也可以提取get表单数据,和
|
||||
|
||||
Query_String 方式(URL中在之后的信息)的数据。
|
||||
|
||||
示例:
|
||||
|
||||
```text
|
||||
http://www.webiste.com/foo.tsl?name=jack&email=jack@abc.com
|
||||
```
|
||||
|
||||
可以用上面的方式提取数据
|
||||
|
||||
#### Web 工具(.Web Tools)
|
||||
|
||||
##### 内容
|
||||
|
||||
- 表格样式
|
||||
- 单元格
|
||||
- 图形配置
|
||||
- 展示范例
|
||||
- 中间函数
|
||||
|
||||
##### 表格样式
|
||||
|
||||
###### 内容
|
||||
|
||||
- Web_tb_arrow
|
||||
- Web_tb_bar
|
||||
- Web_tb_gradient
|
||||
- Web_tb_npbar
|
||||
- Web_tb_npgridbar
|
||||
|
||||
###### Web_tb_arrow
|
||||
|
||||
- Web_tb_arrow
|
||||
- Web_tb_bar
|
||||
- Web_tb_gradient
|
||||
- Web_tb_npbar
|
||||
- Web_tb_npgridbar
|
||||
|
||||
###### Web_tb_bar
|
||||
|
||||
- Web_tb_arrow
|
||||
- Web_tb_bar
|
||||
- Web_tb_gradient
|
||||
- Web_tb_npbar
|
||||
- Web_tb_npgridbar
|
||||
|
||||
###### Web_tb_gradient
|
||||
|
||||
- Web_tb_arrow
|
||||
- Web_tb_bar
|
||||
- Web_tb_gradient
|
||||
- Web_tb_npbar
|
||||
- Web_tb_npgridbar
|
||||
|
||||
###### Web_tb_npbar
|
||||
|
||||
- Web_tb_arrow
|
||||
- Web_tb_bar
|
||||
- Web_tb_gradient
|
||||
- Web_tb_npbar
|
||||
- Web_tb_npgridbar
|
||||
|
||||
###### Web_tb_npgridbar
|
||||
|
||||
- Web_tb_arrow
|
||||
- Web_tb_bar
|
||||
- Web_tb_gradient
|
||||
- Web_tb_npbar
|
||||
- Web_tb_npgridbar
|
||||
|
||||
##### 单元格
|
||||
|
||||
###### 内容
|
||||
|
||||
- 背景
|
||||
- 富文本
|
||||
- 迷你图
|
||||
|
||||
###### 背景
|
||||
|
||||
####### 内容
|
||||
|
||||
- Web_css_bgbar
|
||||
- Web_css_bgcolor
|
||||
- Web_css_bghist
|
||||
|
||||
####### Web_css_bgbar
|
||||
|
||||
- Web_css_bgbar
|
||||
- Web_css_bgcolor
|
||||
- Web_css_bghist
|
||||
|
||||
####### Web_css_bgcolor
|
||||
|
||||
- Web_css_bgbar
|
||||
- Web_css_bgcolor
|
||||
- Web_css_bghist
|
||||
|
||||
####### Web_css_bghist
|
||||
|
||||
- Web_css_bgbar
|
||||
- Web_css_bgcolor
|
||||
- Web_css_bghist
|
||||
|
||||
###### 富文本
|
||||
|
||||
####### 内容
|
||||
|
||||
- Web_richtext_zdbgcolor
|
||||
|
||||
####### Web_richtext_zdbgcolor
|
||||
|
||||
- Web_richtext_zdbgcolor
|
||||
|
||||
###### 迷你图
|
||||
|
||||
####### 内容
|
||||
|
||||
- Web_spark_hist
|
||||
- Web_spark_nphist
|
||||
|
||||
####### Web_spark_hist
|
||||
|
||||
- Web_spark_hist
|
||||
- Web_spark_nphist
|
||||
|
||||
####### Web_spark_nphist
|
||||
|
||||
- Web_spark_hist
|
||||
- Web_spark_nphist
|
||||
|
||||
##### 图形配置
|
||||
|
||||
###### 内容
|
||||
|
||||
- Web_fig_box
|
||||
- Web_fig_heatmap
|
||||
- Web_fig_histogram
|
||||
- Web_fig_radar
|
||||
- Web_fig_tree_decomp
|
||||
- Web_fig_violin
|
||||
|
||||
###### Web_fig_box
|
||||
|
||||
- Web_fig_box
|
||||
- Web_fig_heatmap
|
||||
- Web_fig_histogram
|
||||
- Web_fig_radar
|
||||
- Web_fig_tree_decomp
|
||||
- Web_fig_violin
|
||||
|
||||
###### Web_fig_heatmap
|
||||
|
||||
- Web_fig_box
|
||||
- Web_fig_heatmap
|
||||
- Web_fig_histogram
|
||||
- Web_fig_radar
|
||||
- Web_fig_tree_decomp
|
||||
- Web_fig_violin
|
||||
|
||||
###### Web_fig_histogram
|
||||
|
||||
- Web_fig_box
|
||||
- Web_fig_heatmap
|
||||
- Web_fig_histogram
|
||||
- Web_fig_radar
|
||||
- Web_fig_tree_decomp
|
||||
- Web_fig_violin
|
||||
|
||||
###### Web_fig_radar
|
||||
|
||||
- Web_fig_box
|
||||
- Web_fig_heatmap
|
||||
- Web_fig_histogram
|
||||
- Web_fig_radar
|
||||
- Web_fig_tree_decomp
|
||||
- Web_fig_violin
|
||||
|
||||
###### Web_fig_tree_decomp
|
||||
|
||||
- Web_fig_box
|
||||
- Web_fig_heatmap
|
||||
- Web_fig_histogram
|
||||
- Web_fig_radar
|
||||
- Web_fig_tree_decomp
|
||||
- Web_fig_violin
|
||||
|
||||
###### Web_fig_violin
|
||||
|
||||
- Web_fig_box
|
||||
- Web_fig_heatmap
|
||||
- Web_fig_histogram
|
||||
- Web_fig_radar
|
||||
- Web_fig_tree_decomp
|
||||
- Web_fig_violin
|
||||
|
||||
##### 展示范例
|
||||
|
||||
###### 内容
|
||||
|
||||
- Demo_framestyle_constyle_dotweb
|
||||
- Demo_framestyle_constyle_net
|
||||
- Demo_framestyle_heatmaptb_net
|
||||
- Demo_framestyle_net
|
||||
- Demo_framestyle_web
|
||||
- Demo_framestyle_data
|
||||
|
||||
###### Demo_framestyle_constyle_dotweb
|
||||
|
||||
- Demo_framestyle_constyle_dotweb
|
||||
- Demo_framestyle_constyle_net
|
||||
- Demo_framestyle_heatmaptb_net
|
||||
- Demo_framestyle_net
|
||||
- Demo_framestyle_web
|
||||
- Demo_framestyle_data
|
||||
|
||||
###### Demo_framestyle_constyle_net
|
||||
|
||||
- Demo_framestyle_constyle_dotweb
|
||||
- Demo_framestyle_constyle_net
|
||||
- Demo_framestyle_heatmaptb_net
|
||||
- Demo_framestyle_net
|
||||
- Demo_framestyle_web
|
||||
- Demo_framestyle_data
|
||||
|
||||
###### Demo_framestyle_heatmaptb_net
|
||||
|
||||
- Demo_framestyle_constyle_dotweb
|
||||
- Demo_framestyle_constyle_net
|
||||
- Demo_framestyle_heatmaptb_net
|
||||
- Demo_framestyle_net
|
||||
- Demo_framestyle_web
|
||||
- Demo_framestyle_data
|
||||
|
||||
###### Demo_framestyle_net
|
||||
|
||||
- Demo_framestyle_constyle_dotweb
|
||||
- Demo_framestyle_constyle_net
|
||||
- Demo_framestyle_heatmaptb_net
|
||||
- Demo_framestyle_net
|
||||
- Demo_framestyle_web
|
||||
- Demo_framestyle_data
|
||||
|
||||
###### Demo_framestyle_web
|
||||
|
||||
- Demo_framestyle_constyle_dotweb
|
||||
- Demo_framestyle_constyle_net
|
||||
- Demo_framestyle_heatmaptb_net
|
||||
- Demo_framestyle_net
|
||||
- Demo_framestyle_web
|
||||
- Demo_framestyle_data
|
||||
|
||||
###### Demo_framestyle_data
|
||||
|
||||
- Demo_framestyle_constyle_dotweb
|
||||
- Demo_framestyle_constyle_net
|
||||
- Demo_framestyle_heatmaptb_net
|
||||
- Demo_framestyle_net
|
||||
- Demo_framestyle_web
|
||||
- Demo_framestyle_data
|
||||
|
||||
##### 中间函数
|
||||
|
||||
###### 内容
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
|
||||
###### Kerneldensityestimator
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
|
||||
###### Web_color_theme
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
|
||||
###### Web_color_triscale
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
|
||||
###### Web_dict2tabletree
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
|
||||
###### Web_format
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
|
||||
###### Web_getcolorscalebyrgbarr
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
|
||||
###### Web_getdefultcolor
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
|
||||
###### Web_getlineargradient
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
|
||||
###### Web_gettdbar
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
|
||||
###### Web_html_span
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
|
||||
###### Web_html_table
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
|
||||
###### Web_table2dicttree
|
||||
|
||||
- Kerneldensityestimator
|
||||
- Web_color_theme
|
||||
- Web_color_triscale
|
||||
- Web_dict2tabletree
|
||||
- Web_format
|
||||
- Web_getcolorscalebyrgbarr
|
||||
- Web_getdefultcolor
|
||||
- Web_getlineargradient
|
||||
- Web_gettdbar
|
||||
- Web_html_span
|
||||
- Web_html_table
|
||||
- Web_table2dicttree
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,38 +0,0 @@
|
||||
#### 数据提取
|
||||
|
||||
##### 内容
|
||||
|
||||
- GetDataByMd
|
||||
- GetDataByMd2
|
||||
- StockIndustryLowerArr
|
||||
|
||||
##### GetDataByMd
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// "MA110C2375"在20210322日的开仓手续费额
|
||||
SetSysParam(PN_Date(), 20210322T);
|
||||
return GetDataByMd("MA110C2375.SP", 1);
|
||||
// 结果:0.5
|
||||
```
|
||||
|
||||
##### GetDataByMd2
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// "MA110C2375"在20210322日的开仓手续费额
|
||||
SetSysParam(PN_Date(), 20210322T);
|
||||
return GetDataByMd2("MA110C2375.SP", 1);
|
||||
// 结果:0.5
|
||||
```
|
||||
|
||||
##### StockIndustryLowerArr
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 在20201207的申万一级行业列表
|
||||
return StockIndustryLowerArr("SWHY110000", 20201207T);
|
||||
```
|
||||
@@ -1,15 +0,0 @@
|
||||
#### 评价分析算法函数
|
||||
|
||||
##### 内容
|
||||
|
||||
- Hurst
|
||||
|
||||
##### Hurst
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
data := spec(FundNAWZFQk(20240308t, 20240831t, cy_day(), 0, 0), "OF000001");
|
||||
t := sselect ["净值收益率(%)"] from data end;
|
||||
return Hurst(t); // 0.47
|
||||
```
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,92 +0,0 @@
|
||||
#### 外汇
|
||||
|
||||
##### 内容
|
||||
|
||||
- 汇率
|
||||
|
||||
##### 汇率
|
||||
|
||||
###### 内容
|
||||
|
||||
- ForExrateMidPrice
|
||||
- ForExrateMidPriceBegTEndT
|
||||
- GetCurrencyCodeBySecurityCode
|
||||
- ForExRateZf
|
||||
|
||||
###### ForExrateMidPrice
|
||||
|
||||
用途:汇率相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 2020年4月20日美元/人民币的中间价
|
||||
SetSysParam(PN_Stock(), 'FXUSDCNY');
|
||||
return ForExrateMidPrice(20200420T);
|
||||
// 返回7.0657
|
||||
```
|
||||
|
||||
###### ForExrateMidPriceBegTEndT
|
||||
|
||||
用途:汇率相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 2020年4月20日到4月30日美元/人民币的中间价数据
|
||||
SetSysParam(PN_Stock(), 'FXUSDCNY');
|
||||
begt := 20200420T;
|
||||
endt := 20200430T;
|
||||
return ForExrateMidPriceBegTEndT(begt, endt);
|
||||
```
|
||||
|
||||
| 日期 | 代码 | 中间价 |
|
||||
| -------- | -------- | ------ |
|
||||
| 20200420 | FXUSDCNY | 7.0657 |
|
||||
| 20200421 | FXUSDCNY | 7.0752 |
|
||||
| 20200422 | FXUSDCNY | 7.0903 |
|
||||
| 20200423 | FXUSDCNY | 7.0887 |
|
||||
| 20200424 | FXUSDCNY | 7.0803 |
|
||||
| 20200427 | FXUSDCNY | 7.0703 |
|
||||
| 20200428 | FXUSDCNY | 7.071 |
|
||||
| 20200429 | FXUSDCNY | 7.0704 |
|
||||
| 20200430 | FXUSDCNY | 7.0571 |
|
||||
|
||||
###### GetCurrencyCodeBySecurityCode
|
||||
|
||||
用途:汇率相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 港股长和00001对应的货币对代码
|
||||
return GetCurrencyCodeBySecurityCode('HK00001');
|
||||
// 返回 HKD
|
||||
```
|
||||
|
||||
###### ForExRateZf
|
||||
|
||||
用途:汇率相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
算法
|
||||
|
||||
(V2-V1)/V1
|
||||
|
||||
其中V2是货币对在endt的中间价,V1是begt(需要大于首个交易日,否则begt=首个交易日)的中间价。范例
|
||||
|
||||
```tsl
|
||||
// 2020年4月20日到4月30日美元/人民币的收益率
|
||||
SetSysParam(PN_Stock(), 'FXUSDCNY');
|
||||
begt := 20200420T;
|
||||
endt := 20200430T;
|
||||
return ForExRateZf(BegT, EndT);
|
||||
// 返回 -0.20786786956644
|
||||
```
|
||||
@@ -1,67 +0,0 @@
|
||||
#### 框架构造Tools
|
||||
|
||||
##### 内容
|
||||
|
||||
- 数据分析
|
||||
- 参数调整
|
||||
|
||||
##### 数据分析
|
||||
|
||||
###### 内容
|
||||
|
||||
- 树形表格遍历
|
||||
|
||||
###### 树形表格遍历
|
||||
|
||||
####### 内容
|
||||
|
||||
- GetTreeSumByClassPath
|
||||
|
||||
####### GetTreeSumByClassPath
|
||||
|
||||
用途:进行数值统计计算。
|
||||
参数:arg1,arg2,arg3,arg4,arg5,arg6(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
Data := array(
|
||||
("名称":"风格收益(%)", "取值":1.2, "分类路径":"总收益(%)"),
|
||||
("名称":"Alpha(%)", "取值":0.6, "分类路径":"总收益(%)\\选股Alpha(%)"),
|
||||
("名称":"残差(%)", "取值":0.2, "分类路径":"总收益(%)\\选股Alpha(%)"));
|
||||
NodeName := "名称";
|
||||
PathName := "分类路径";
|
||||
SumName := "取值";
|
||||
IfLever0 := 0;
|
||||
IfTreeID := 1;
|
||||
return GetTreeSumByClassPath(Data, NodeName, PathName, SumName, IfLever0, IfTreeID);
|
||||
```
|
||||
|
||||
##### 参数调整
|
||||
|
||||
###### 内容
|
||||
|
||||
- pmstand_array
|
||||
|
||||
###### pmstand_array
|
||||
|
||||
用途:参数调整相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
范例1
|
||||
|
||||
```tsl
|
||||
V := 2;
|
||||
return pmstand_array(v); // array(2);
|
||||
```
|
||||
|
||||
范例2
|
||||
|
||||
```tsl
|
||||
V := "abc";
|
||||
return pmstand_array(v); // array("abc");
|
||||
```
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,231 +0,0 @@
|
||||
#### 网格池
|
||||
|
||||
##### 内容
|
||||
|
||||
- MultiProc_unit
|
||||
|
||||
##### MultiProc_unit
|
||||
|
||||
功能描述:封装网格常用操作
|
||||
|
||||
接口汇总:
|
||||
|
||||
| 所属分类 | 接口名称 | 说明 | 备注 |
|
||||
| ------------ | ---------------- | ---------------- | ------------------- |
|
||||
| 总接口 | fastmap | 调用网格执行函数 | |
|
||||
| 日志 | gridLogo | 网格写日志 | |
|
||||
| 等分划分方式 | splitDiv | 度等分划分 | 参数为度(int) |
|
||||
| | splitDiv2 | 长度等分划分 | |
|
||||
| | SplitArrayQK | 数组等分划分 | 参数为数组(array) |
|
||||
| | SplitArrayQK2 | 数组等分划分 | |
|
||||
| 用户数据相关 | DeleteTablebyReg | 批量删除用户数据 | 正则匹配 |
|
||||
| | GettablebyReg | 获取用户数据 | 正则匹配 |
|
||||
| | TryInsetTable | 添加用户数据 | 正则匹配 |
|
||||
|
||||
网格使用经验:
|
||||
|
||||
1、网格嵌套(网格模型再去调用开网格),容易有效率问题
|
||||
|
||||
2、耗时小于0.2s~1s的函数,不建议用网格,因为此时网格调度耗时将会很耗时
|
||||
|
||||
3、在测试网格时使用Timeit 测试比较耗时的网络节点,不同网络节点耗时差异可以为0.02s
|
||||
VS 0.4s
|
||||
|
||||
通过设置fastmap的sysparm参数,指定运算网格
|
||||
|
||||
###### 内容
|
||||
|
||||
- Fastmap
|
||||
- 范例
|
||||
- 工具函数
|
||||
- 中间函数
|
||||
|
||||
###### Fastmap
|
||||
|
||||
- Fastmap
|
||||
- 范例
|
||||
- 工具函数
|
||||
- 中间函数
|
||||
|
||||
###### 范例
|
||||
|
||||
####### 内容
|
||||
|
||||
- 提取50的5日涨幅
|
||||
- 提取50的历史涨幅矩阵
|
||||
|
||||
####### 提取50的5日涨幅
|
||||
|
||||
```tsl
|
||||
// **********************参数设置***********************//
|
||||
N := 5;
|
||||
endt := today();
|
||||
stocks := getbk("上证50");
|
||||
// **********************网格模版*********************//
|
||||
gridNo := 3; // 网格个数,0:表示只使用本地服务器
|
||||
func := FunctionName() + '.tsubbystocks'; // 网格函数
|
||||
parms := array(N, endt, stocks);
|
||||
parmstype := array(0, 0, 1);
|
||||
return unit(MultiProc_unit).fastmap(gridNo, func, parms, parmstype);
|
||||
// ***********************子函数**********************//
|
||||
function tsubbystocks(N, endt, stocks);
|
||||
begin
|
||||
sp_s(pn_date(), endt);
|
||||
i := 0;
|
||||
ret := array();
|
||||
for _, stk in stocks do
|
||||
begin
|
||||
sp_s(PN_Stock(), stk);
|
||||
for j := 0 to N do
|
||||
begin
|
||||
ret[I, '截止日'] := ref(sp_time(), j);
|
||||
ret[i, '代码'] := stk;
|
||||
ret[i, '名称'] := stockname(stk);
|
||||
ret[I, '涨幅(%)'] := ref(stockzf3(), j);
|
||||
i++;
|
||||
end;
|
||||
end;
|
||||
return ret;
|
||||
end;
|
||||
```
|
||||
|
||||
返回
|
||||
|
||||
####### 提取50的历史涨幅矩阵
|
||||
|
||||
```tsl
|
||||
// **********************参数设置***********************//
|
||||
N := 5;
|
||||
endt := today();
|
||||
stocks := getbk("上证50");
|
||||
// **********************网格模版*********************//
|
||||
// **********************网格模版*********************//
|
||||
gridNo := 3; // 网格个数,0:表示只使用本地服务器
|
||||
func := FunctionName() + '.tsubbystock'; // 网格函数
|
||||
parms := array(N, endt, stocks);
|
||||
parmstype := array(0, 0, 2);
|
||||
return unit(MultiProc_unit).fastmap(gridNo, func, parms, parmstype);
|
||||
end;
|
||||
function tsubbystock(N, endt, stock);
|
||||
begin
|
||||
sp_s(PN_Stock(), stock);
|
||||
sp_s(pn_date(), endt);
|
||||
ret := array(
|
||||
"代码":stock,
|
||||
"名称":stockname(stock),
|
||||
"截止日":endt,
|
||||
);
|
||||
for i := 1 to N do ret["T_"$ i] := ref(stockzf3(), i);
|
||||
return ret;
|
||||
end;
|
||||
```
|
||||
|
||||
###### 工具函数
|
||||
|
||||
####### 内容
|
||||
|
||||
- GridLogo
|
||||
|
||||
####### GridLogo
|
||||
|
||||
用途:MultiProc_unit相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 在C:\\temp\\Gridlog默认路径下写日志文件
|
||||
return unit(MultiProc_unit).gridLogo('测试');
|
||||
```
|
||||
|
||||
###### 中间函数
|
||||
|
||||
####### 内容
|
||||
|
||||
- SplitDiv
|
||||
- SplitDiv2
|
||||
- SplitArrayQK
|
||||
- SplitArrayQK2
|
||||
- DeleteTablebyReg
|
||||
- GettablebyReg
|
||||
- TryInsetTable
|
||||
|
||||
####### SplitDiv
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
return unit(MultiProc_unit).splitDiv(14, 5); // array(0,2,4,6,8,14)
|
||||
```
|
||||
|
||||
####### SplitDiv2
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
return unit(MultiProc_unit).splitDiv2(14, 5); // array(0,3,6,9,12,14)
|
||||
```
|
||||
|
||||
####### SplitArrayQK
|
||||
|
||||
用途:MultiProc_unit相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
arr := array(2, 1, 3, 4, 9, 5, 7, 8, 9, 10, 11, 12, 13, 15);
|
||||
return unit(MultiProc_unit).SplitArrayQK(arr, 5); // array((2,1),(3,4),(9,5),(7,8),(9,15))
|
||||
```
|
||||
|
||||
####### SplitArrayQK2
|
||||
|
||||
用途:MultiProc_unit相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
arr := array(2, 1, 3, 4, 9, 5, 7, 8, 9, 10, 11, 12, 13, 15);
|
||||
return unit(MultiProc_unit).SplitArrayQK2(arr, 5);
|
||||
// array((2,3),(4,5),(7,9),(10,12),(13,15))
|
||||
```
|
||||
|
||||
####### DeleteTablebyReg
|
||||
|
||||
用途:MultiProc_unit相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
return unit(MultiProc_unit).DeleteTablebyReg('test');
|
||||
```
|
||||
|
||||
####### GettablebyReg
|
||||
|
||||
用途:MultiProc_unit相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
return unit(MultiProc_unit).GettablebyReg('test');
|
||||
```
|
||||
|
||||
####### TryInsetTable
|
||||
|
||||
用途:MultiProc_unit相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
return unit(MultiProc_unit).TryInsetTable('test', array(1, 2, 3));
|
||||
```
|
||||
@@ -1,102 +0,0 @@
|
||||
# 金融函数
|
||||
|
||||
> 本文档从 [TSL 函数参考](../index.md) 拆分而来
|
||||
|
||||
金融函数涵盖股票、行情、技术分析、财务等金融专用功能,是量化分析和金融建模的核心函数库。
|
||||
|
||||
## 目录
|
||||
|
||||
### 行情数据
|
||||
|
||||
- **[股票](./stock.md)** (20,893行) - 股票代码、名称、上市信息、交易状态等
|
||||
- **[行情](./market_data.md)**
|
||||
(11,748行) - 实时行情、历史行情、K线数据、成交量价
|
||||
- **[指数](./index_data.md)** (2,237行) - 指数数据、指数成分股、指数计算
|
||||
|
||||
### 技术分析
|
||||
|
||||
- **[技术分析](./technical_analysis.md)** (11,373行)
|
||||
- 均线、MACD、KDJ、RSI等技术指标
|
||||
- 形态识别、趋势判断、支撑阻力
|
||||
|
||||
### 资产类别
|
||||
|
||||
- **[债券](./bond.md)** (2,827行) - 债券信息、收益率曲线、债券估值
|
||||
- **[期权](./option.md)** (1,573行) - 期权定价、希腊字母、隐含波动率
|
||||
- **[基金](./fund.md)** (10,681行) - 基金净值、持仓、业绩、基金公司
|
||||
- **[期货](./futures.md)** (1,248行) - 期货合约、持仓量、基差
|
||||
- **[权证](./warrant.md)** (125行) - 权证信息、行权价、到期日
|
||||
- **[外汇](./forex.md)** (116行) - 汇率、外汇行情
|
||||
|
||||
### 财务与基本面
|
||||
|
||||
- **[财务分析](./financial_analysis.md)** (46,778行) ⚠️ **最大文件**
|
||||
|
||||
- 资产负债表、利润表、现金流量表
|
||||
- 财务比率、财务指标、财务预测
|
||||
|
||||
- **[基本面](./fundamentals.md)** (6,139行)
|
||||
|
||||
- 公司基本信息、行业分类、股东结构
|
||||
- 分红、配股、增发等公司行为
|
||||
|
||||
- **[宏观](./macro.md)** (789行) - 宏观经济数据、GDP、CPI、利率
|
||||
|
||||
### 板块与分类
|
||||
|
||||
- **[板块](./sector.md)** (24,819行) ⚠️ **大文件**
|
||||
- 行业板块、概念板块、地域板块
|
||||
- 板块涨跌、板块轮动、板块成分股
|
||||
|
||||
### 量化分析
|
||||
|
||||
- **[金融工程](./financial_engineering.md)** (6,564行)
|
||||
|
||||
- 风险模型、因子模型、组合优化
|
||||
- 回测框架、绩效归因
|
||||
|
||||
- **[组合评价](./portfolio_evaluation.md)** (3,656行)
|
||||
|
||||
- 夏普比率、最大回撤、收益波动
|
||||
- 组合绩效评估、风险调整收益
|
||||
|
||||
- **[天软因子](./ts_factor.md)** (186行) - 天软自定义因子库
|
||||
|
||||
### 工具与框架
|
||||
|
||||
- **[框架构造Tools](./framework_tools.md)** (71行) - 策略框架构建工具
|
||||
- **[网格池](./grid_pool.md)** (301行) - 网格交易、池化管理
|
||||
- **[日志](./logging.md)** (53行) - 交易日志、事件日志
|
||||
- **[数据提取](./data_extraction.md)** (50行) - 批量数据提取工具
|
||||
- **[评价分析算法函数](./evaluation_algorithms.md)** (18行) - 评价算法接口
|
||||
|
||||
## 快速索引
|
||||
|
||||
### 按应用场景
|
||||
|
||||
| 应用场景 | 推荐文件 | 说明 |
|
||||
| ---------- | ------------------------------------------------------------------------------ | ------------------ |
|
||||
| 选股策略 | [股票](./stock.md) + [技术分析](./technical_analysis.md) | 基于技术指标的选股 |
|
||||
| 基本面分析 | [财务分析](./financial_analysis.md) + [基本面](./fundamentals.md) | 财务数据+公司信息 |
|
||||
| 行业轮动 | [板块](./sector.md) + [行情](./market_data.md) | 板块强弱、行业配置 |
|
||||
| 量化回测 | [金融工程](./financial_engineering.md) + [组合评价](./portfolio_evaluation.md) | 回测框架+绩效评估 |
|
||||
| 资产配置 | [基金](./fund.md) + [债券](./bond.md) | 多资产组合配置 |
|
||||
|
||||
### 超大文件提示
|
||||
|
||||
以下两个文件内容较多,建议使用全局搜索定位具体函数:
|
||||
|
||||
- ⚠️ **财务分析** (46,778行) - 包含大量财务报表字段和计算函数
|
||||
- ⚠️ **板块** (24,819行) - 包含众多板块分类和成分股函数
|
||||
|
||||
## 使用提示
|
||||
|
||||
1. **实时行情**:使用 [行情](./market_data.md) 获取最新价格、成交量等
|
||||
2. **历史数据**:使用 [股票](./stock.md) + [行情](./market_data.md) 获取历史K线
|
||||
3. **财务数据**:[财务分析](./financial_analysis.md) 包含完整的财务报表访问函数
|
||||
4. **技术指标**:[技术分析](./technical_analysis.md) 包含常用技术指标计算函数
|
||||
5. **搜索建议**:在当前目录(`function/financial/`)使用全局搜索查找特定函数
|
||||
|
||||
---
|
||||
|
||||
**返回**: [函数参考首页](../index.md)
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,43 +0,0 @@
|
||||
#### 日志
|
||||
|
||||
##### 内容
|
||||
|
||||
- Logger_debug
|
||||
- logger_info
|
||||
- logger_warning
|
||||
- logger_info2
|
||||
|
||||
##### Logger_debug
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
logger_debug(1234);
|
||||
return 1;
|
||||
```
|
||||
|
||||
##### logger_info
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
logger_info("当前执行第100个");
|
||||
return 1;
|
||||
```
|
||||
|
||||
##### logger_warning
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
logger_warning("当前执行第100个");
|
||||
return 1;
|
||||
```
|
||||
|
||||
##### logger_info2
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
logger_info2("异常", "类型不能大于", 3);
|
||||
```
|
||||
@@ -1,803 +0,0 @@
|
||||
#### 宏观
|
||||
|
||||
##### 内容
|
||||
|
||||
- 基本信息
|
||||
- 财政支出
|
||||
- 国家银行存款\_贷款
|
||||
- 货币供应
|
||||
- 金融机构存款\_贷款
|
||||
- 居民消费价格指数
|
||||
- 商品零售价格指数
|
||||
- 生产资料价格指数
|
||||
- 银证转账
|
||||
- 行业宏观
|
||||
- 人民币存贷款利率
|
||||
|
||||
##### 基本信息
|
||||
|
||||
###### 内容
|
||||
|
||||
- CU_ChinaCode
|
||||
|
||||
###### CU_ChinaCode
|
||||
|
||||
用途:基本信息相关函数。
|
||||
参数:无。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
return CU_ChinaCode();
|
||||
// 结果:SS.000001
|
||||
```
|
||||
|
||||
##### 财政支出
|
||||
|
||||
###### 内容
|
||||
|
||||
- HG_CZSZ1_1
|
||||
- HG_CZSZ1_2
|
||||
- HG_CZSZ1_3
|
||||
- HG_CZSZ1_4
|
||||
- HG_CZSZ1_5
|
||||
- HG_CZSZ2_1
|
||||
- HG_CZSZ2_2
|
||||
- HG_CZSZ2_3
|
||||
- HG_CZSZ2_4
|
||||
- HG_CZSZ2_5
|
||||
|
||||
###### HG_CZSZ1_1
|
||||
|
||||
###### HG_CZSZ1_2
|
||||
|
||||
###### HG_CZSZ1_3
|
||||
|
||||
###### HG_CZSZ1_4
|
||||
|
||||
###### HG_CZSZ1_5
|
||||
|
||||
###### HG_CZSZ2_1
|
||||
|
||||
###### HG_CZSZ2_2
|
||||
|
||||
###### HG_CZSZ2_3
|
||||
|
||||
###### HG_CZSZ2_4
|
||||
|
||||
###### HG_CZSZ2_5
|
||||
|
||||
##### 国家银行存款\_贷款
|
||||
|
||||
###### 内容
|
||||
|
||||
- HG_GJYHCDK1_1
|
||||
- HG_GJYHCDK1_2
|
||||
- HG_GJYHCDK1_3
|
||||
- HG_GJYHCDK1_4
|
||||
- HG_GJYHCDK1_5
|
||||
- HG_GJYHCDK1_6
|
||||
- HG_GJYHCDK1_7
|
||||
- HG_GJYHCDK1_8
|
||||
- HG_GJYHCDK1_9
|
||||
- HG_GJYHCDK2_1
|
||||
- HG_GJYHCDK2_2
|
||||
- HG_GJYHCDK2_4
|
||||
- HG_GJYHCDK2_3
|
||||
- HG_GJYHCDK2_5
|
||||
- HG_GJYHCDK2_6
|
||||
- HG_GJYHCDK2_7
|
||||
- HG_GJYHCDK2_8
|
||||
- HG_GJYHCDK2_9
|
||||
|
||||
###### HG_GJYHCDK1_1
|
||||
|
||||
###### HG_GJYHCDK1_2
|
||||
|
||||
###### HG_GJYHCDK1_3
|
||||
|
||||
###### HG_GJYHCDK1_4
|
||||
|
||||
###### HG_GJYHCDK1_5
|
||||
|
||||
###### HG_GJYHCDK1_6
|
||||
|
||||
###### HG_GJYHCDK1_7
|
||||
|
||||
###### HG_GJYHCDK1_8
|
||||
|
||||
###### HG_GJYHCDK1_9
|
||||
|
||||
###### HG_GJYHCDK2_1
|
||||
|
||||
###### HG_GJYHCDK2_2
|
||||
|
||||
###### HG_GJYHCDK2_4
|
||||
|
||||
###### HG_GJYHCDK2_3
|
||||
|
||||
###### HG_GJYHCDK2_5
|
||||
|
||||
###### HG_GJYHCDK2_6
|
||||
|
||||
###### HG_GJYHCDK2_7
|
||||
|
||||
###### HG_GJYHCDK2_8
|
||||
|
||||
###### HG_GJYHCDK2_9
|
||||
|
||||
##### 货币供应
|
||||
|
||||
###### 内容
|
||||
|
||||
- HG_HB1_1
|
||||
- HG_HB1_2
|
||||
- HG_HB1_3
|
||||
- HG_HB1_4
|
||||
- HG_HB2_1
|
||||
- HG_HB2_2
|
||||
- HG_HB2_3
|
||||
- HG_HB2_4
|
||||
|
||||
###### HG_HB1_1
|
||||
|
||||
###### HG_HB1_2
|
||||
|
||||
###### HG_HB1_3
|
||||
|
||||
###### HG_HB1_4
|
||||
|
||||
###### HG_HB2_1
|
||||
|
||||
###### HG_HB2_2
|
||||
|
||||
###### HG_HB2_3
|
||||
|
||||
###### HG_HB2_4
|
||||
|
||||
##### 金融机构存款\_贷款
|
||||
|
||||
###### 内容
|
||||
|
||||
- HG_JRJGCDK1_1
|
||||
- HG_JRJGCDK1_2
|
||||
- HG_JRJGCDK1_3
|
||||
- HG_JRJGCDK1_4
|
||||
- HG_JRJGCDK1_6
|
||||
- HG_JRJGCDK1_5
|
||||
- HG_JRJGCDK2_1
|
||||
- HG_JRJGCDK2_2
|
||||
- HG_JRJGCDK2_3
|
||||
- HG_JRJGCDK2_4
|
||||
- HG_JRJGCDK2_5
|
||||
- HG_JRJGCDK2_6
|
||||
|
||||
###### HG_JRJGCDK1_1
|
||||
|
||||
###### HG_JRJGCDK1_2
|
||||
|
||||
###### HG_JRJGCDK1_3
|
||||
|
||||
###### HG_JRJGCDK1_4
|
||||
|
||||
###### HG_JRJGCDK1_6
|
||||
|
||||
###### HG_JRJGCDK1_5
|
||||
|
||||
###### HG_JRJGCDK2_1
|
||||
|
||||
###### HG_JRJGCDK2_2
|
||||
|
||||
###### HG_JRJGCDK2_3
|
||||
|
||||
###### HG_JRJGCDK2_4
|
||||
|
||||
###### HG_JRJGCDK2_5
|
||||
|
||||
###### HG_JRJGCDK2_6
|
||||
|
||||
##### 居民消费价格指数
|
||||
|
||||
###### 内容
|
||||
|
||||
- HG_JMXFJGZS1_1
|
||||
- HG_JMXFJGZS1_2
|
||||
- HG_JMXFJGZS1_3
|
||||
- HG_JMXFJGZS2_1
|
||||
- HG_JMXFJGZS2_2
|
||||
- HG_JMXFJGZS2_3
|
||||
|
||||
###### HG_JMXFJGZS1_1
|
||||
|
||||
###### HG_JMXFJGZS1_2
|
||||
|
||||
###### HG_JMXFJGZS1_3
|
||||
|
||||
###### HG_JMXFJGZS2_1
|
||||
|
||||
###### HG_JMXFJGZS2_2
|
||||
|
||||
###### HG_JMXFJGZS2_3
|
||||
|
||||
##### 商品零售价格指数
|
||||
|
||||
###### 内容
|
||||
|
||||
- HG_SPLSJGZS1_1
|
||||
- HG_SPLSJGZS1_2
|
||||
- HG_SPLSJGZS1_3
|
||||
- HG_SPLSJGZS2_1
|
||||
- HG_SPLSJGZS2_2
|
||||
- HG_SPLSJGZS2_3
|
||||
|
||||
###### HG_SPLSJGZS1_1
|
||||
|
||||
###### HG_SPLSJGZS1_2
|
||||
|
||||
###### HG_SPLSJGZS1_3
|
||||
|
||||
###### HG_SPLSJGZS2_1
|
||||
|
||||
###### HG_SPLSJGZS2_2
|
||||
|
||||
###### HG_SPLSJGZS2_3
|
||||
|
||||
##### 生产资料价格指数
|
||||
|
||||
###### 内容
|
||||
|
||||
- HG_SCZLJGZS1_1
|
||||
- HG_SCZLJGZS1_2
|
||||
- HG_SCZLJGZS1_3
|
||||
- HG_SCZLJGZS2_1
|
||||
- HG_SCZLJGZS2_2
|
||||
- HG_SCZLJGZS2_3
|
||||
|
||||
###### HG_SCZLJGZS1_1
|
||||
|
||||
###### HG_SCZLJGZS1_2
|
||||
|
||||
###### HG_SCZLJGZS1_3
|
||||
|
||||
###### HG_SCZLJGZS2_1
|
||||
|
||||
###### HG_SCZLJGZS2_2
|
||||
|
||||
###### HG_SCZLJGZS2_3
|
||||
|
||||
##### 银证转账
|
||||
|
||||
###### 内容
|
||||
|
||||
- HG_StockSettlementBalance
|
||||
- HG_StockSettlementBalanceByEndT
|
||||
- HG_StockPeriodBalance
|
||||
- HG_OptionMarginBalanceByEndT
|
||||
- HG_MoneyRollIn
|
||||
- HG_OptionMarginBalance
|
||||
- HG_StockGuaranteeBalanceByEndT
|
||||
- HG_MoneyNetRollIn
|
||||
- HG_MoneyRollOut
|
||||
- HG_StockGuaranteeBalance
|
||||
|
||||
###### HG_StockSettlementBalance
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间证券交易结算资金余额
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_StockSettlementBalance(20170101T, 20181008T);
|
||||
// 结果:
|
||||
```
|
||||
|
||||
###### HG_StockSettlementBalanceByEndT
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 返回2018年10月8日的证券交易结算资金余额
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_StockSettlementBalanceByEndT(20181008T);
|
||||
// 结果:1220500000000
|
||||
```
|
||||
|
||||
###### HG_StockPeriodBalance
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
算法
|
||||
|
||||
从证券及股票期权投资者资金余额及变动(813)表中获取三个表:
|
||||
|
||||
表1:满足条件:‘开始日’>=begt,‘截止日’<=endt且‘资金类别’为‘证券交易结算资金’的‘截止日’和‘证券交易结算资金余额’数据。
|
||||
|
||||
表2:满足条件:‘开始日’>=begt,‘截止日’<=endt且‘资金类别’为‘融资融券担保资金’的‘截止日’和‘融资融券担保资金余额’数据。
|
||||
|
||||
表3:满足条件:
|
||||
‘开始日’>=begt,‘截止日’<=endt且‘资金类别’为‘股票期权保证金’的‘截止日’和‘股票期权保证金余额’数据。
|
||||
|
||||
返回三个表中‘截止日’相同的数据。范例
|
||||
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间证券交易结算资金、融资融券担保资金、股票期权保证金余额情况
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_StockPeriodBalance(20170101T, 20181008T);
|
||||
// 结果:
|
||||
```
|
||||
|
||||
###### HG_OptionMarginBalanceByEndT
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 返回2018年10月8日的股票期权保证金余额
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_OptionMarginBalanceByEndT(20181008T);
|
||||
// 结果:5974000000
|
||||
```
|
||||
|
||||
###### HG_MoneyRollIn
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间资金转入额
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_MoneyRollIn(20170101T, 20181008T);
|
||||
// 结果:11452969000000
|
||||
```
|
||||
|
||||
###### HG_OptionMarginBalance
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间股票期权保证金余额
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_OptionMarginBalance(20170101T, 20181008T);
|
||||
// 结果:
|
||||
```
|
||||
|
||||
###### HG_StockGuaranteeBalanceByEndT
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 返回2018年10月8日的融资融券担保资金余额
|
||||
setsysparam(pn_stock(), "HG000001");
|
||||
return HG_StockGuaranteeBalanceByEndT(20181008T);
|
||||
// 结果:147600000000
|
||||
```
|
||||
|
||||
###### HG_MoneyNetRollIn
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间资金净转入额
|
||||
return HG_MoneyNetRollIn(20170101T, 20181008T);
|
||||
// 结果:-248651000000
|
||||
```
|
||||
|
||||
###### HG_MoneyRollOut
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间资金转出额
|
||||
return HG_MoneyRollOut(20170101T, 20181008T);
|
||||
// 结果:11701620000000
|
||||
```
|
||||
|
||||
###### HG_StockGuaranteeBalance
|
||||
|
||||
用途:银证转账相关函数。
|
||||
参数:arg1,arg2(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 返回2017年1月1日到2018年10月8日的区间融资融券担保资金余额列表。
|
||||
return HG_StockGuaranteeBalance(20170101T, 20181008T);
|
||||
```
|
||||
|
||||
##### 行业宏观
|
||||
|
||||
###### 内容
|
||||
|
||||
- 偿债能力
|
||||
- 成长能力
|
||||
- 行情
|
||||
- 产品产量
|
||||
- 盈利能力
|
||||
|
||||
###### 偿债能力
|
||||
|
||||
####### 内容
|
||||
|
||||
- HY_42
|
||||
- HY_43
|
||||
- HY_44
|
||||
|
||||
####### HY_42
|
||||
|
||||
算法
|
||||
|
||||
资产负债率=负债合计/资产合计\*100%
|
||||
|
||||
####### HY_43
|
||||
|
||||
算法
|
||||
|
||||
固定资产比例=固定资产净值平均余额/资产合计\*100
|
||||
|
||||
####### HY_44
|
||||
|
||||
算法
|
||||
|
||||
流动资产比例=流动资产平均余额/资产合计\*100%
|
||||
|
||||
###### 成长能力
|
||||
|
||||
####### 内容
|
||||
|
||||
- HY_24
|
||||
- HY_07
|
||||
- HY_10
|
||||
- HY_25
|
||||
- HY_17
|
||||
- HY_12
|
||||
- HY_26
|
||||
- HY_06
|
||||
- HY_28
|
||||
- HY_15
|
||||
- HY_21
|
||||
- HY_01
|
||||
- HY_13
|
||||
- HY_16
|
||||
- HY_11
|
||||
- HY_09
|
||||
- HY_20
|
||||
- HY_23
|
||||
- HY_29
|
||||
- HY_30
|
||||
- HY_18
|
||||
- HY_14
|
||||
- HY_27
|
||||
- HY_22
|
||||
- HY_19
|
||||
- HY_08
|
||||
|
||||
####### HY_24
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得财务费用同比(%)
|
||||
|
||||
####### HY_07
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获取亏损企业单位数量同比(%)
|
||||
|
||||
####### HY_10
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得工业销售产值(当年价格)同比(%)
|
||||
|
||||
####### HY_25
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得利息支出同比(%)
|
||||
|
||||
####### HY_17
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得资产总计同比(%)
|
||||
|
||||
####### HY_12
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得企业亏损总额同比(%)
|
||||
|
||||
####### HY_26
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得利润总额同比(%)
|
||||
|
||||
####### HY_06
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获取企业单位数量同比(%)
|
||||
|
||||
####### HY_28
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得应交增值税同比(%)
|
||||
|
||||
####### HY_15
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得流动资产平均余额同比(%)
|
||||
|
||||
####### HY_21
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得产品销售费用同比(%)
|
||||
|
||||
####### HY_01
|
||||
|
||||
算法
|
||||
|
||||
亏损企业比例=亏损企业单位数量/企业单位数量\*100%
|
||||
|
||||
####### HY_13
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获取应收帐款净额同比(%)
|
||||
|
||||
####### HY_16
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得固定资产净值平均余额同比(%)
|
||||
|
||||
####### HY_11
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获取出口交货值同比(%)
|
||||
|
||||
####### HY_09
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得工业总产值(不变价格)同比(%)
|
||||
|
||||
####### HY_20
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得产品销售成本同比(%)
|
||||
|
||||
####### HY_23
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得管理费用同比(%)
|
||||
|
||||
####### HY_29
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得工业产品出厂价格指数同比(%)
|
||||
|
||||
####### HY_30
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得全部从业人员平均人数同比(%)
|
||||
|
||||
####### HY_18
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得负债合计同比(%)
|
||||
|
||||
####### HY_14
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得产成品同比(%)
|
||||
|
||||
####### HY_27
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得税金总额同比(%)
|
||||
|
||||
####### HY_22
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得产品销售税金及附加同比(%)
|
||||
|
||||
####### HY_19
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得产品销售收入同比(%)
|
||||
|
||||
####### HY_08
|
||||
|
||||
算法
|
||||
|
||||
函数通过对应的字段ID和报告期获得工业总产值(当年价格)同比(%)
|
||||
|
||||
###### 行情
|
||||
|
||||
####### 内容
|
||||
|
||||
- IndustryRPS_Ext3
|
||||
|
||||
####### IndustryRPS_Ext3
|
||||
|
||||
算法
|
||||
|
||||
通过行情(收盘价或结算价、昨结算)等计算N日涨幅,并进行排序,根据排序打分(0-100),获得其分值即RPS,涨幅越高,RPS分值越大。
|
||||
|
||||
###### 产品产量
|
||||
|
||||
####### 内容
|
||||
|
||||
- HYCL_02
|
||||
- HYCL_00
|
||||
- HYCL_01
|
||||
|
||||
####### HYCL_02
|
||||
|
||||
算法
|
||||
|
||||
获取报告期产品产量同比(%)
|
||||
|
||||
####### HYCL_00
|
||||
|
||||
算法
|
||||
|
||||
获取报告期产品计量单位
|
||||
|
||||
####### HYCL_01
|
||||
|
||||
算法
|
||||
|
||||
获取报告期产品产量
|
||||
|
||||
###### 盈利能力
|
||||
|
||||
####### 内容
|
||||
|
||||
- HY_34
|
||||
- HY_37
|
||||
- HY_31
|
||||
- HY_38
|
||||
- HY_41
|
||||
- HY_39
|
||||
- HY_33
|
||||
- HY_36
|
||||
- HY_40
|
||||
- HY_35
|
||||
- HY_32
|
||||
|
||||
####### HY_34
|
||||
|
||||
算法
|
||||
|
||||
主营业务利润率=利润总额/产品销售收入\*100%
|
||||
|
||||
####### HY_37
|
||||
|
||||
算法
|
||||
|
||||
管理费用比例=管理费用/产品销售收入\*100%
|
||||
|
||||
####### HY_31
|
||||
|
||||
算法
|
||||
|
||||
净资产收益率=利润总额/资产总计\*100%
|
||||
|
||||
####### HY_38
|
||||
|
||||
算法
|
||||
|
||||
财务费用比例=财务费用/产品销售收入\*100%
|
||||
|
||||
####### HY_41
|
||||
|
||||
算法
|
||||
|
||||
成本费用利润率=利润总额/(产品销售成本+产品销售税金及附加+产品销售费用+管理费用+财务费用)\*100%
|
||||
|
||||
####### HY_39
|
||||
|
||||
算法
|
||||
|
||||
三项费用比例=(产品销售费用+管理费用+财务费用)/产品销售收入\*100%
|
||||
|
||||
####### HY_33
|
||||
|
||||
算法
|
||||
|
||||
销售税金率=税金总额/产品销售收入\*100%
|
||||
|
||||
####### HY_36
|
||||
|
||||
算法
|
||||
|
||||
营业费用比例=产品销售费用/产品销售收入\*100%
|
||||
|
||||
####### HY_40
|
||||
|
||||
算法
|
||||
|
||||
总资产报酬率=利润总额/资产合计\*100%
|
||||
|
||||
####### HY_35
|
||||
|
||||
算法
|
||||
|
||||
主营成本比例=产品销售成本/产品销售收入\*100%
|
||||
|
||||
####### HY_32
|
||||
|
||||
算法
|
||||
|
||||
销售毛利率=(产品销售收入-产品销售成本)/产品销售收入\*100
|
||||
|
||||
##### 人民币存贷款利率
|
||||
|
||||
###### 内容
|
||||
|
||||
- HG_DL_InterestRate
|
||||
|
||||
###### HG_DL_InterestRate
|
||||
|
||||
用途:人民币存贷款利率相关函数。
|
||||
参数:无。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
// 活期存款在20210302的人民币存贷款利率
|
||||
setsysparam(pn_stock(), "IR000001");
|
||||
setsysparam(pn_date(), 20210302T);
|
||||
return HG_DL_InterestRate(); // 结果: 0.35
|
||||
```
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,171 +0,0 @@
|
||||
#### 天软因子
|
||||
|
||||
##### 内容
|
||||
|
||||
- 基金经理
|
||||
- 基金
|
||||
- 指数
|
||||
|
||||
##### 基金经理
|
||||
|
||||
###### 内容
|
||||
|
||||
- 持仓偏好
|
||||
|
||||
###### 持仓偏好
|
||||
|
||||
####### 内容
|
||||
|
||||
- 持仓风格
|
||||
|
||||
####### 持仓风格
|
||||
|
||||
######## 内容
|
||||
|
||||
- 计算
|
||||
|
||||
######## 计算
|
||||
|
||||
######### 内容
|
||||
|
||||
- 中间函数
|
||||
|
||||
######### 中间函数
|
||||
|
||||
########## 内容
|
||||
|
||||
- FundManager_GetStockHoldings
|
||||
- FundManager_js_gpgmjz
|
||||
- FundManager_js_hyjqd
|
||||
|
||||
########## FundManager_GetStockHoldings
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
ManagerID := "1533";
|
||||
FMtype := 1; // 股混型
|
||||
RDate := 20220630;
|
||||
return FundManager_GetStockHoldings(ManagerID, FMtype, RDate);
|
||||
```
|
||||
|
||||
########## FundManager_js_gpgmjz
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
EndT := 20220812T;
|
||||
return FundManager_js_gpgmjz(EndT);
|
||||
```
|
||||
|
||||
########## FundManager_js_hyjqd
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
RDate := 20220630;
|
||||
return FundManager_js_hyjqd(RDate);
|
||||
```
|
||||
|
||||
##### 基金
|
||||
|
||||
###### 内容
|
||||
|
||||
- 业绩
|
||||
- 中间函数
|
||||
|
||||
###### 业绩
|
||||
|
||||
####### 内容
|
||||
|
||||
- 持有体验
|
||||
|
||||
####### 持有体验
|
||||
|
||||
######## 内容
|
||||
|
||||
- Fund_PF_HoldFeeling_Stat
|
||||
- Fund_PF_HoldFeeling_Trend
|
||||
|
||||
######## Fund_PF_HoldFeeling_Stat
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
FundID := "OF000001";
|
||||
begt := 20200101t;
|
||||
endt := 20240301t;
|
||||
RollNYearArr := array(1, 3); // 持有1年,持有3年
|
||||
return Fund_PF_HoldFeeling_Stat(FundID, begt, endt, RollNYearArr);
|
||||
```
|
||||
|
||||
返回:
|
||||
|
||||
######## Fund_PF_HoldFeeling_Trend
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
FundID := "OF000001";
|
||||
begt := 20200101t;
|
||||
endt := 20240301t;
|
||||
MANum := 60;
|
||||
delta := 20;
|
||||
return Fund_PF_HoldFeeling_Trend(FundID, begt, endt, MANum, delta);
|
||||
```
|
||||
|
||||
返回:
|
||||
|
||||
###### 中间函数
|
||||
|
||||
####### 内容
|
||||
|
||||
- GetAllThemespools
|
||||
|
||||
####### GetAllThemespools
|
||||
|
||||
用途:基金相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
EndT := 20230919T;
|
||||
return GetAllThemespools(EndT);
|
||||
```
|
||||
|
||||
##### 指数
|
||||
|
||||
###### 内容
|
||||
|
||||
- ETF净流入金额
|
||||
|
||||
###### ETF净流入金额
|
||||
|
||||
####### 内容
|
||||
|
||||
- ETF_MT_NetInflowAmount
|
||||
|
||||
####### ETF_MT_NetInflowAmount
|
||||
|
||||
范例
|
||||
|
||||
范例01:获取指定ETF在指定日的资金净流入
|
||||
|
||||
```tsl
|
||||
return ETF_MT_NetINflowAmount(20250922T, array("OF512000"));
|
||||
```
|
||||
|
||||
返回:920.088,单位为:万元
|
||||
|
||||
范例02:获取2022-02-17所有跟踪沪深300ETF基金资金净流入金额
|
||||
|
||||
```tsl
|
||||
fundArr := getbk("上证基金;深证基金;开放式基金;已退市基金");
|
||||
etfArr := sselect ["StockID"] from infotable 302 of fundArr
|
||||
where ["交易方式"] = "ETF" and ["标的指数代码"] = "SH000300"end;
|
||||
endt := 20220217t;
|
||||
return ETF_MT_NetInflowAmount(endt, ETFArr, r); // -223296.48
|
||||
```
|
||||
@@ -1,124 +0,0 @@
|
||||
#### 权证
|
||||
|
||||
##### 内容
|
||||
|
||||
- 创设
|
||||
- 定价
|
||||
- 行权变动
|
||||
|
||||
##### 创设
|
||||
|
||||
###### 内容
|
||||
|
||||
- WarrantCCirculation1
|
||||
- WarrantCCirculation2
|
||||
- WarrantCCirculation3
|
||||
- WarrantCCirculation4
|
||||
- WarrantCCirculation5
|
||||
- WarrantCCirculation6
|
||||
|
||||
###### WarrantCCirculation1
|
||||
|
||||
算法
|
||||
|
||||
当权证创设生效日在指定开始日和截止日之间,且一次增减规模大于0时,从表404(权证.权证创设)中获取股票每次规模增减之和/10000。
|
||||
|
||||
###### WarrantCCirculation2
|
||||
|
||||
算法
|
||||
|
||||
当权证创设生效日在指定开始日和截止日之间,且一次增减规模小于0时,从表404(权证.权证创设)中获取股票每次规模增减之和/10000。
|
||||
|
||||
###### WarrantCCirculation3
|
||||
|
||||
算法
|
||||
|
||||
当权证创设生效日在指定开始日和截止日之间时,从表404(权证.权证创设)中获取股票每次规模增减之和/10000。
|
||||
|
||||
###### WarrantCCirculation4
|
||||
|
||||
算法
|
||||
|
||||
当权证创设生效日在上市日和指定截止日之间,且一次增减规模小于0时,从表404(权证.权证创设)中获取股票每次规模增减之和/10000。
|
||||
|
||||
###### WarrantCCirculation5
|
||||
|
||||
算法
|
||||
|
||||
当权证创设生效日在上市日和指定截止日之间,且一次增减规模小于0时,从表404(权证.权证创设)中获取股票每次规模增减之和/10000。
|
||||
|
||||
###### WarrantCCirculation6
|
||||
|
||||
算法
|
||||
|
||||
当权证创设生效日在上市日和指定截止日之间时,从表404(权证.权证创设)中获取股票每次规模增减之和/10000。
|
||||
|
||||
##### 定价
|
||||
|
||||
###### 内容
|
||||
|
||||
- WarrantGearing
|
||||
- WarrantPriceByBS
|
||||
- Warrant_OptionTypeByBS
|
||||
- WarrantBenchId
|
||||
- WarrantBenchVolatility
|
||||
- WarrantBenchClose
|
||||
- WarrantYHBDL
|
||||
- WarrantYJL
|
||||
- WarrantSJJZ
|
||||
- WarrantNZJZ
|
||||
- WarrantDurationDay
|
||||
- WarrantDurationMonth
|
||||
|
||||
###### WarrantGearing
|
||||
|
||||
###### WarrantPriceByBS
|
||||
|
||||
###### Warrant_OptionTypeByBS
|
||||
|
||||
###### WarrantBenchId
|
||||
|
||||
###### WarrantBenchVolatility
|
||||
|
||||
###### WarrantBenchClose
|
||||
|
||||
###### WarrantYHBDL
|
||||
|
||||
###### WarrantYJL
|
||||
|
||||
算法
|
||||
|
||||
(1)若权证性质为认购,溢价率(%)=(权证行权价 + 权证现价 / 行权比例 - 标的收盘)/标的收盘\*100;
|
||||
|
||||
(2)若权证性质不为认购,溢价率(%)=(标的收盘 + 权证现价 / 行权比例 - 权证行权价)/ 标的收盘\*100;
|
||||
|
||||
###### WarrantSJJZ
|
||||
|
||||
###### WarrantNZJZ
|
||||
|
||||
算法
|
||||
|
||||
(1)若权证性质为认购,内在价值=(正股价格 - 执行价格)与0中的最大值\*行权比例;
|
||||
|
||||
(2)若权证性质不为认购,内在价值=(执行价格 - 正股价格)与0中的最大值\*行权比例;
|
||||
|
||||
###### WarrantDurationDay
|
||||
|
||||
###### WarrantDurationMonth
|
||||
|
||||
##### 行权变动
|
||||
|
||||
###### 内容
|
||||
|
||||
- WarrantECirculation
|
||||
- WarrantEPrice
|
||||
- WarrantExerciseQk
|
||||
- WarrantERate
|
||||
|
||||
###### WarrantECirculation
|
||||
|
||||
###### WarrantEPrice
|
||||
|
||||
###### WarrantExerciseQk
|
||||
|
||||
###### WarrantERate
|
||||
@@ -1,82 +0,0 @@
|
||||
# TSL 函数参考(Function Reference)
|
||||
|
||||
本章从天软金融分析 .NET 函数大全整理而来,保留原始函数说明结构。
|
||||
|
||||
> ⚠️
|
||||
> **重要提示**:由于函数数量庞大(22万+行),已按功能模块拆分为多个文件。建议使用编辑器的全局搜索功能查找特定函数。
|
||||
|
||||
## 快速导航
|
||||
|
||||
### 核心函数库
|
||||
|
||||
- **[01 TSL函数](./01_tsl_functions.md)** - 数学、系统、基础、图形等通用函数
|
||||
- 详细内容:[tsl/index.md](./tsl/index.md) (10个子文件,34,113行)
|
||||
- **[02 金融函数](./02_financial_functions.md)** - 股票、行情、技术分析、财务等金融专用函数
|
||||
- 详细内容:[financial/index.md](./financial/index.md) (23个子文件,169,893行)
|
||||
- **[03 数据仓库函数](./03_datawarehouse.md)**
|
||||
(7,270行) - 数据查询、时间序列、市场板块函数
|
||||
|
||||
### 专业领域
|
||||
|
||||
- **[算法交易支撑函数](./04_algo_trading.md)**
|
||||
(2,913行) - 算法交易服务器支撑、交易开发类
|
||||
- **[服务器交互函数](./05_server_interaction.md)**
|
||||
(312行) - 连接、登录、执行、订阅等服务器交互
|
||||
- **[文档处理函数](./06_document_processing.md)** (10,790行) -
|
||||
Office访问、Excel/Word/PDF处理、图片导出
|
||||
- **[金融报表分析](./10_financial_reports.md)**
|
||||
(10,382行) - 个股、板块、基金、债券报表分析
|
||||
|
||||
### 开发工具
|
||||
|
||||
- **[CGI控制台相关函数](./07_cgi_console.md)** (185行) - CGI输入输出、环境变量
|
||||
- **[GUI函数](./08_gui.md)** (1,244行) - 消息对话框、图形界面交互
|
||||
- **[TSL编译工具](./09_compiler.md)** (936行) - 编译范围、TSL指令、依赖关系
|
||||
- **[Web开发支撑](./11_web_development.md)** (747行) - TSL的Web支持、Web Tools
|
||||
|
||||
## 使用建议
|
||||
|
||||
1. **新手入门**:从 [TSL函数 → 基础函数](./tsl/base.md) 开始
|
||||
2. **金融分析**:查阅 [金融函数](./financial/index.md)
|
||||
3. **搜索函数**:使用编辑器全局搜索 `function/` 目录(推荐使用 `Ctrl+Shift+F` 或
|
||||
`Cmd+Shift+F`)
|
||||
4. **API查询**:按功能模块浏览对应文件
|
||||
|
||||
## 拆分说明
|
||||
|
||||
原 `function.md` 文件有 221,389 行,已拆分为:
|
||||
|
||||
- **9个独立章节文件**(数据仓库、算法交易、服务器交互等)
|
||||
- **TSL函数** → 10个子文件(数学、基础、系统等)
|
||||
- **金融函数** → 23个子文件(股票、行情、技术分析等)
|
||||
|
||||
共计 **42个独立文件**,便于浏览和维护。
|
||||
|
||||
---
|
||||
|
||||
<details>
|
||||
<summary>📖 函数使用说明(点击展开)</summary>
|
||||
|
||||
## 类型声明说明
|
||||
|
||||
注意:
|
||||
|
||||
1. **类型声明**:TSL的函数定义无需参数类型声明,也无需返回类型声明,在以下函数说明里,我们采用了PASCAL的函数声明模式,只是为了让用户更容易地理解各个函数的具体含义和对参数的要求。
|
||||
|
||||
2. **VAR**:在函数参数声明中,有的使用了VAR作为前缀,这表示该函数会修改该VAR管辖的定义域内的参数,如果没有VAR前缀,则表示其变量不会被该函数修改。在TSL中,所有的函数变量都是允许被修改的,也不支持VAR前缀。
|
||||
|
||||
## 表达式类型说明
|
||||
|
||||
3. **表达式类型**:许多系统函数的参数类型是表达式类型,系统为了方便用户使用,这些参数并不需要使用表达式类型,而只需要使用表达式语句,TSL语言会直接为用户将表达式语句转换为表达式类型,典型函数如:Spec,SpecDate,Ma,hhv,llv等,例如我们要求SZ000001的收盘价,我们使用
|
||||
`Spec('SZ000001',Close())` 而不是
|
||||
`Spec('SZ000001',@Close())`,如果我们由于应用需要而必需使用表达式类型变量,我们可以配合使用Eval函数,例如exp为表达式类型,其值为@Close(),我们可以
|
||||
`Spec('SZ000001',eval(exp))`
|
||||
来求值;一般地,在系统函数里,除了isExp,eval等明显必需使用表达式类型作为参数的函数以外,大部分符合以上规则。
|
||||
|
||||
4. **重名函数**:TSL并不支持用户函数重名,如果存在用户函数与其他类型函数重名,则用户函数优先。在以下文档中,有函数重名现象,这表示该系统函数有多种参数模式。
|
||||
|
||||
</details>
|
||||
|
||||
---
|
||||
|
||||
**原始文档**:本文档由 221,389 行的 `function.md` 拆分而来,原始大文件不在当前仓库保留;如需查看,请从历史版本获取。
|
||||
File diff suppressed because it is too large
Load Diff
@@ -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
|
||||
|
||||
用途:作图函数相关函数。
|
||||
参数:arg1,arg2,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
|
||||
|
||||
用途:作图函数相关函数。
|
||||
参数:arg1,arg2,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
|
||||
|
||||
用途:作图函数相关函数。
|
||||
参数:arg1,arg2,arg3,arg4,arg5(按示例顺序传入)。
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```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
|
||||
|
||||
用途:作图函数相关函数。
|
||||
参数:arg1,arg2,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
|
||||
@@ -1,83 +0,0 @@
|
||||
# TSL函数
|
||||
|
||||
> 本文档从 [TSL 函数参考](../index.md) 拆分而来
|
||||
|
||||
TSL函数包含数学、系统、基础、图形等通用函数,适用于各种TSL脚本开发场景。
|
||||
|
||||
## 目录
|
||||
|
||||
### 数学与计算
|
||||
|
||||
- **[数学函数](./math.md)** (14,396行)
|
||||
- 数值计算、常用数学函数、位运算函数
|
||||
- 三角函数、角度量转换、双曲线函数
|
||||
- 指数对数函数、随机数、统计函数
|
||||
|
||||
### 系统与平台
|
||||
|
||||
- **[系统相关函数](./system.md)** (1,647行)
|
||||
|
||||
- 系统信息、环境变量、进程控制
|
||||
- 内存管理、性能监控
|
||||
|
||||
- **[平台函数](./platform.md)** (553行)
|
||||
|
||||
- 平台特定功能、系统调用
|
||||
|
||||
- **[客户端函数](./client.md)** (409行)
|
||||
- 客户端交互、界面控制
|
||||
|
||||
### 基础功能
|
||||
|
||||
- **[基础函数](./base.md)** (10,660行)
|
||||
|
||||
- 字符串处理、数组操作、日期时间
|
||||
- 类型转换、条件判断、数据结构
|
||||
- 文件操作、流程控制
|
||||
|
||||
- **[图形函数](./graphics.md)** (698行)
|
||||
- 绘图、图表、可视化
|
||||
|
||||
### 资源与交互
|
||||
|
||||
- **[资源访问函数](./resource.md)** (4,897行)
|
||||
|
||||
- 文件读写、数据库访问、网络通信
|
||||
- 配置文件、资源管理
|
||||
|
||||
- **[第三方交互函数](./third_party.md)** (610行)
|
||||
- 第三方库调用、外部程序交互
|
||||
|
||||
### 工具函数
|
||||
|
||||
- **[压缩和解压函数](./compression.md)** (108行)
|
||||
|
||||
- 数据压缩、解压缩、归档
|
||||
|
||||
- **[信息摘要及编码](./digest_encoding.md)** (172行)
|
||||
- 哈希算法、加密、编码转换
|
||||
|
||||
## 快速索引
|
||||
|
||||
### 常用函数分类
|
||||
|
||||
| 功能类别 | 文件 | 典型函数示例 |
|
||||
| ---------- | ---------------------------- | --------------------------------------- |
|
||||
| 数学计算 | [math.md](./math.md) | Abs, Sqrt, Sin, Cos, Log, Exp, Round... |
|
||||
| 字符串处理 | [base.md](./base.md) | Len, Mid, Left, Right, Trim, Replace... |
|
||||
| 日期时间 | [base.md](./base.md) | Now, Date, Time, DateAdd, DateDiff... |
|
||||
| 文件操作 | [resource.md](./resource.md) | FileExists, ReadFile, WriteFile... |
|
||||
| 数组操作 | [base.md](./base.md) | Array, UBound, LBound, Sort... |
|
||||
| 类型转换 | [base.md](./base.md) | CStr, CInt, CFloat, CBool... |
|
||||
|
||||
## 使用提示
|
||||
|
||||
1. **数学函数**:`math.md` 包含了所有数学计算相关的函数,是数值处理的基础
|
||||
2. **基础函数**:`base.md`
|
||||
最为常用,包含了字符串、数组、日期时间等日常开发必需的函数
|
||||
3. **资源访问**:`resource.md` 涉及文件、数据库、网络等外部资源的访问
|
||||
4. **搜索建议**:在当前目录(`function/tsl/`)使用全局搜索查找特定函数
|
||||
|
||||
---
|
||||
|
||||
**返回**: [函数参考首页](../index.md)
|
||||
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支持函数相关函数。
|
||||
参数:arg1,arg2,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 First LETTER won't be replaced by 'one', but the Second letter will.
|
||||
```
|
||||
|
||||
###### TextToURL
|
||||
|
||||
用途:Html相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
ASrc := "#abcd 10";
|
||||
return TextToURL(ASrc);
|
||||
// 结果:%23abcd%20%2010
|
||||
```
|
||||
|
||||
###### HtmlToText
|
||||
|
||||
用途:Html相关函数。
|
||||
参数:
|
||||
|
||||
返回:处理后的结果值。
|
||||
|
||||
范例
|
||||
|
||||
```tsl
|
||||
Src := "The First LETTER won't be replaced by 'one', but the Second letter 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访问天软平台,可以支撑包括MATLAB,SAS,EXCEL
|
||||
VBA,SPLUS,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[]
|
||||
|
||||
如存在有需要显式转换的其他类型今后将会根据具体需求进行升级
|
||||
|
||||
=========================================================
|
||||
@@ -1,24 +0,0 @@
|
||||
# TSL 语法手册
|
||||
|
||||
本手册由原始语法/机制内容整理而来,已拆分为独立章节,阅读不再依赖外部跳转。
|
||||
|
||||
定位与边界:
|
||||
|
||||
- 本手册关注:语法结构、关键字、语言机制(函数/控制流/unit/class/异常/矩阵/TS-SQL/集合等)。
|
||||
- 本手册不覆盖:数学/统计教程等教学内容;函数库的详细 API 说明集中在
|
||||
[函数参考](function/index.md)。
|
||||
- 代码风格与命名属于工程规范:见
|
||||
`docs/tsl/code_style.md`、`docs/tsl/naming.md`。
|
||||
- 函数参考已拆分为42个模块化文件,建议使用索引导航或全局搜索查找特定函数。
|
||||
|
||||
## 目录
|
||||
|
||||
- [01 语言基础](01_language_basics.md)
|
||||
- [02 控制流与异常](02_control_flow.md)
|
||||
- [03 函数](03_functions.md)
|
||||
- [04 单元/命名空间/函数文件](04_modules_and_namespace.md)
|
||||
- [05 对象模型(class/unit)](05_object_model.md)
|
||||
- [06 扩展语法(矩阵/集合/结果集过滤/TS-SQL)](06_extended_syntax.md)
|
||||
- [07 运行时与性能工具](07_debug_and_profiler.md)
|
||||
- [08 高级语言(新一代)](08_new_generation.md)
|
||||
- [TSL 函数参考(已拆分为42个模块)](function/index.md)
|
||||
Reference in New Issue
Block a user