24 KiB
系统相关函数
内容
- 数据类型函数
- 数据类型转换函数
- 复制函数
- 随机函数
- 条件选择函数
- 表达式相关函数
- 性能优化相关函数
- 调用堆栈
数据类型函数
内容
- DataType
- ifInt
- ifInt64
- ifReal
- ifNumber
- ifString
- ifArray
- ifNil
- ifExp
- ifGraph
- ifGraphGroup
- ifBinary
- ifMatrix
- ifObj
- GetOleObject
- CreateComObject
- CreateMatrix
- MatrixToArray
- GetMatrixFields
- CreateBinary
- ConvertDataToBuf
- ConvertBufToData
- None类型
DataType
范例
//当参数为数组型变量时,返回数组类型对应的整数5。
a := Array(34,12); //定义a为一个数组
result:= DataType(a);
Return result; // 5
//当参数为整数型变量时,返回整数类型对应的整数0。
a := 23; //定义a为一个整数
result:= DataType(a);
Return result; //0
//对数组第一维度数据进行类型判断
t:=array(1,3.14,"A",(1,2,3),nil);
return datatype(t,-1);
结果:
//对数组中每一数据进行类型判断
t:=array(1,3.14,"A",(1,2,3),nil);
return datatype(t,1);
//结果:
ifInt
范例
范例一:
//判断是否为32位整数类型
r1:= IfInt(1);
r2:= IfInt(3.14);
r3:= IfInt("A");
r4:= IfInt(array(1,2,3));
return array(r1,r2,r3,r4);
//结果:array(1,0,0,0)
范例二:
//对数组第一维度数据进行类型判断
t:=array(1,3.14,"A",(1,2,3),nil);
return Ifint(t,-1);
//结果:array(1,0,0,0,0)
范例三:
//对数组中每一数据进行类型判断
t:=array(1,3.14,"A",(1,2.1,3),nil);
return Ifint(t,1);
//结果:array(1,0,0,(1,0,1),0)
ifInt64
范例
//当参数为整数类型变量时,返回true。
a := 23L; //定义a为一个64位整数
return ifInt64(a);
//当参数为非整数型变量时,返回false。
a := 2.3; //定义a为一个非64位整数
return ifInt64(a);
//对数组第一维度数据进行类型判断
t:=array(1,3L,"A",(1,2,3),nil);
return Ifint64(t,-1);
//结果:array(0,1,0,0,0)
//对数组中每一数据进行类型判断
t:=array(1,3L,"A",(1,2L,3),nil);
return Ifint64(t,1);
//结果:array(0,1,0,(0,1,0),0)
ifReal
范例
//当参数为实数类型变量时,返回true。
a := 2.233; //定义a为一个实数
result:= ifReal(a);
Return result;
//当参数为非整数型变量时,返回false。
a := array(23,54,67); //定义a为一个非实数
result:= ifReal (a);
Return result;
//对数组第一维度数据进行类型判断
t:=array(1,3.56,"A",(1,2,3),nil);
return Ifint64(t,-1);
//结果:array(0,1,0,0,0)
//对数组中每一数据进行类型判断
t:=array(1,3.56,"A",(1,2.14,3),nil);
return Ifint64(t,1);
//结果:array(0,1,0,(0,1,0),0)
ifNumber
范例
//当参数为数字类型(整数或者实数)变量时,返回true。
a := 2.233; //定义a为一个实数
result:= ifNumber (a);
Return result;
//当参数为非数字类型(整数或者实数)变量时,返回false。
a := array(23,54,67); //定义a为一个非数字类型
result:= ifNumber (a);
Return result;
//对数组第一维度数据进行类型判断
t:=array(1,3.56,"A",(1,2,3),nil);
return IfNumber(t,-1);
//结果:array(1,1,0,0,0)
//对数组中每一数据进行类型判断,nan也为数字类型
t:=array(1,3.56,"A",(nan,2.14, "C"),nil);
return IfNumber(t,1);
//结果:array(1,1,0,(1,1,0),0)
ifString
范例
//当参数为字符串类型变量时,返回true。
a :='test'; //定义a为一个字符串
result:= ifString (a);
Return result;
//当参数为非字符串类型变量时,返回false。
a := array(23,54,67); //定义a为一个非字符串
result:= ifString (a);
Return result;
//对数组第一维度数据进行类型判断
t:=array(1,3.56,"A",(1,2,3),nil);
return IfString(t,-1);
//结果:array(0,0,1,0,0)
//对数组中每一数据进行类型判断
t:=array(1,3.56,"A",(nan,2.14, "C"),nil);
return IfString(t,1);
//结果:array(0,0,1,(0,0,1),0)
ifArray
范例
//当参数为数组类型变量时,返回true。
a :=array(23,54,67); //定义a为一个数组
result:= ifArray (a);
Return result;
//当参数为非数组类型变量时,返回false。
a :=34; //定义a为一个非数组
result:= ifArray (a);
Return result;
//对数组第一维度数据进行类型判断
t:=array(1,3.56,"A",(1,"C",3.14),nil);
return IfArray(t,-1);
//结果:array(0,0,0,1,0)
//对数组中每一数据进行类型判断
t:=array(1,3.56,"A",(nan,2.14,"C"),nil);
return IfArray(t,1);
//结果:array(0,0,0,(0,0,0),0)
ifNil
范例
//当参数为空时,返回true。
result:= ifNil (Nil); //函数参数为空
Return result;
//当参数不为空时,返回false。
a :=34; //函数参数不为空
result:= ifNil (a);
Return result;
//对数组第一维度数据进行类型判断
t:=array(1,3.16,"A",(nil,"C",3.14),nil);
return IfNil(t,-1);
//结果:array(0,0,0,0,1)
//对数组中每一数据进行类型判断
t:=array(1,3.56,"A",(nil,2.14,"C"),nil);
return IfNil(t,1);
//结果:array(0,0,0,(1,0,0),1)
ifExp
范例
//当参数是一个表达式类型时,返回true。
a :=@'dfhdv'+'dbf'; //函数参数a为一个表达式
result:= ifExp (a);
Return result;
//当参数不是一个表达式类型时,返回false。
a :='sdhv'+'dbf'; //函数参数a不为表达式
result:= ifExp (a);
Return result;
//对数组第一维度数据进行类型判断
t:=array(1,3.16,@"A",(nil,@"C",3.14),nil);
return IfExp(t,-1);
//结果:array(0,0,1,0,0)
//对数组中每一数据进行类型判断
t:=array(1,3.56,@"A",(nil,2.14,@"C"),nil);
return IfExp(t,1);
//结果:array(0,0,1,(0,0,1),0)
ifGraph
范例
//当参数是一个图形类型时,返回true。
GData :=Nday2('MA5' , MA( close() , 5 ) );
g1:= graph( gtLine() , "MA5" , Gdata , gfColor() , clBlue() );
result:= ifGraph (g1);
Return result;
//当参数不是一个图形类型时,返回false。
a :='sdhv'+'dbf'; //函数参数a不为图形类型
result:= ifGraph (a);
Return result;
参考TGraph
ifGraphGroup
范例
//当参数是一个图形组合类型时,返回true。
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());
g1:= GraphGroup(VOLGraph,MAVOLGraph,gfMinValue(),0);
//调用函GraphGroup创建一个图形组合类型变量g1
result:= ifGraphgroup (g1);
Return result;
GData :=Nday2('MA5' , MA( close() , 5 ) );
g1:= graph( gtLine() , "MA5" , Gdata , gfColor() , clBlue() );
result:= ifGraphgroup (g1);
Return result;
//返回0
参考TGraphGroup
ifBinary
范例
//当参数是一个二进制类型时,返回true。
a:= binary('111111'); //函数参数a为二进制类型
result:= ifBinary (a);
Return result;
//当参数不是一个二进制类型时,返回false。
a :='sdhv'; //函数参数a不为二进制类型
result:= ifBinary (a);
Return result;
//对数组第一维度数据进行类型判断
b:=Binary("3.14");
t:=array(1,b,"A",(nil,b,3.14),nil);
return IfBinary(t,-1);
//结果:array(0,1,0,0,0)
//对数组中每一数据进行类型判断
b:=Binary("3.14");
t:=array(1,b,"A",(nil,2.14,b),nil);
return IfBinary(t,1);
//结果:array(0,1,0,(0,0,1),0)
参考Binary
ifMatrix
范例
//当参数是一个Matrix类型时,返回true。
a := CreateMatrix(3,4); //使用CreateMatrix创建一个Matrix类型变量
result:= ifMatrix (a);
Return result;
//当参数不是一个Matrix类型时,返回false。
a :='sdhv'; //函数参数a不为Matrix类型
result:= ifMatrix (a);
Return result;
ifObj
范例
//当参数是一个对象类型时,返回true。
Type Function14=Class() //声明类
function SetName(newName);
Begin
name:=newName;
end;
End;
Obj:=CreateObject('Function14'); //使用CreateObject函数创建上面类Function14的对象
result:= ifObj (Obj);
Return result;
//当参数不是一个对象类型时,返回false。
a :='sdhv'; //函数参数a不为对象类型
result:= ifObj (a);
Return result;
参考ComObj
GetOleObject
参考ComObj
CreateComObject
参考ComObj
差异说明 Com对象为windows下的功能,Linux中没有。
CreateMatrix
范例
对比范例一与范例二,即Matrix与矩阵类型的比较
范例一:Matrix
//当没有ColsValue参数,返回的MATRIX的行和列的下标为从0开始的序列
return CreateMatrix(2,3);
//结果:
范例二:矩阵
return nils(3,2);
结果:
范例三:
//有ColsValue参数并初始化该Matrix时,返回的MATRIX的列序列为ColsValue数组中//的字符串或整数
return CreateMatrix(3,4,array('s','d','f'),1,2,3,4,5,6,7,8,9,10,11,12);
返回结果:
MatrixToArray
范例
//使用CreateMatrix创建一个Matrix,把这个Matrix转换为一个数组后返回该数组。
a:=CreateMatrix(3,4,array('s','d','f'),1,2,3,4,5,6,7,8,9,10,11,12);
return MatrixToArray(a);
结果:
//把TS的矩阵转化成Matrix类型数据
a:=ones(5,5);
return mselect * from a end;
结果:
GetMatrixFields
CreateBinary
ConvertDataToBuf
范例
将一个数据转换成内存存贮的BUFFER并返回
return ConvertDataToBuf(1.5343,'Currency');
ConvertBufToData
None类型
None类型是一种极为特殊的特性,不参与运算,仅在特殊场景传递。None类型本身可以包含一个整数。
目前用于对象算符重载[]的数组设置算符时候,重载函数送入的第一个参数是索引值,第二个参数在非最后一级时设置为None类型,用于描述级别信息(最后一级送入的是要设置的值)。
####### 内容
- ifNone
- GetNone
####### ifNone
具体应用可参考:FAQ:对象算符重载数组set算符时none类型的应用实例
####### GetNone
具体应用可参考:FAQ:对象算符重载数组set算符时none类型的应用实例
数据类型转换函数
内容
- Integer
- Int64
- Real
- String
- WideString
- Binary
- SetPrecision
- ToSTM
- ToSTN
- ToXML
- STM
- STN
- XML
- ExportCsv
- ImportCsv
Integer
范例
Return integer(123.456);//返回值为整型数据:123。
Int64
范例
Return int64(123);//返回值为64位整型数据:123。
Real
范例
Return Real(123);//返回值为实数数据:123.00
String
范例
Return string(L'abcd');
//返回值为字符串:abcd。
WideString
范例
Return widestring('abcd');
//返回值为Unicode字符串:L’abcd’。
Binary
范例
Return binary('111111');//返回值为二进制流。
SetPrecision
范例
Return setPrecision(123.4567,3);//返回值为保留3位小数点后的实数:123.457。
ToSTM
范例
return tostm(array(1,23,4,5,6,7,));//返回以.stm为后缀名的二进制文件。
//可选参数的应用
t:=rand(4,5);
s:=toSTM(t,0,1,2);//用新流模式,且保留两位小数
return stm(s);
返回如下:
ToSTN
范例
范例一:
Return toSTN(12345);//返回值为字符串:’12345’。
范例二:
Return toSTN(1.2345,2);//返回值为字符串:’1.23’。
ToXML
范例
Return toXML('this is XML document');
{返回值为字符串:
<?xml version="1.0" encoding="GB2312"?>
<TSXML Copyright="Generated by ShenZhen Tinysoft Corp,Ltd. All rights reserved." TYPE="STRING" VALUE="this is XML document"/>}
差异说明 仅windows中支持,Linux中暂不支持。
STM
STN
XML
范例
Return XML('<?xml version="1.0" encoding="GB2312"?>
<TSXML Copyright="Generated by ShenZhen Tinysoft Corp,Ltd. All rights reserved." TYPE="STRING" VALUE="this is XML document"/>');
//返回值为字符串:’this is a document’。
差异说明 仅windows中支持,Linux中暂不支持。
ExportCsv
范例
范例01:一维数组转换成csv格式字符串
data:=array(1,2,"3","A",9,8);
ret:= ExportCsv(data,s);
if ret then return s;
else return ret;
//结果:
范例02:二维数组转换成csv格式字符串
data:=array((2,5,0),(3,2,1),(4,7,2));
ret:= ExportCsv(data,s);
if ret then return s;
else return ret;
//结果:
范例03:转换成csv格式字符串,结果包含数组下标信息
data:=array("A":(2,5,0),"B":(3,2,1),"C":(4,7,2));
ret:= ExportCsv(data,s,1);
if ret then return s;
else return ret;
//结果:
范例04:转换成csv格式字符串,结果不包含字段头部信息
data:=array((2,5,0),(3,2,1),(4,7,2));
ret:= ExportCsv(data,s,0,0);
if ret then return s;
else return ret;
//结果:
ImportCsv
范例
范例01:将指定csv格式字符串转换成二维数组
s:="0,1,2\r\n2,5,0\r\n3,2,1\r\n4,7,2\r\n";
ret:=ImportCsv(s,data);
if ret then return data;
else return ret;
//结果:
范例02:读取本地csv文件,并将其转换成数组
本地csv文件内容如下:
filepath:="D:\\test\\csv\\data.csv";
rdo2 ReadFile(rwRaw(),"",filepath,0,1000,s);
ret:=ImportCsv(s,data,1);
if ret then return data;
else return ret;
//结果:
复制函数
内容
- dupValue
dupValue
范例
//主函数
function test1();
begin
a:=1;
b:=2;
c:=3;
d:=test2(dupValue (a),b,c);
return array(a,b,c,d);
end;
//返回array(1,20,3,33)
//被调用函数
function test2(a,b,c);
begin
a:=10;
b:=20;
return a+b+c;
end;
由test1执行出来的结果可以知道,a变量,由于使用了dupValue复制值,虽然在子函数test2中改变了其值,但在主函数中的a变量仍然没变。而b变量则发生了改变。
随机函数
内容
- randomize
- random
- RandomFrom
randomize
参考random RandomFrom
random
定义1:random():Real;
说明:返回一个0到1之间的随机数
返回:实数。
定义2:random(value:Integer):Integer;
说明:如果无参数,则返回0->1之间的随机实数,如果参数为整数,则返回0->value之间的随机整数(不包括value),即左闭右开,如random(1)只会返回0。
参数:
value:整数,随机范围。
范例:
//表达式无参数
Return random();//返回值为0到1随机实数:0.124562。
//表达式有参数
Return random(100);//返回值为随机的0到100的整型数据:94。
参考:RandomFrom
RandomFrom
范例
A:=array('a','b','c','d','e','f');
Return randomFrom(A);
//返回值为随机返回A字符串中一个字符:’b’。
参考random
条件选择函数
内容
- IfThen
- IfThen3
IfThen
范例
a:=1;
b:=2;
Return ifthen(a>b,a,b);
//返回:2。
IfThen3
范例
return IfThen3(1,2,'左大','相等','右大');
//返回:’右大’
表达式相关函数
内容
- Eval
- Call
- CallInArray
- Invoke
- Invokeinarray
- SafeEval
- DoubleVariableExecute
- MultipleExecute
- SingleVariableExecute
- SafeSetSysParam
Eval
范例
范例01:
//表达式是字符串表达式。&转换字符串为表达式。
A:='1';
B:='2';
Return eval(&('A+B'));//返回值为表达式的结果:'12'。
范例02:
//表达式是语句表达式
A:=1;
B:=2;//A,B均为整型数据
Return eval(@(A+B));
//返回值为整型数据:3,@(A+B)可以是一个执行语句块,调用该函数会得到执行语句块后的结果。
范例03://字符串表达式中进行return返回。
s:='a:=1;b:=2;return a+b;';
return eval(&s);
//结果:3
范例4:跨函数中传导引用参数和变量
setsysparam(pn_stock(),"SH600507");
return eval_test("StockZf4(t)",20250723t);
function eval_test(e,endt);
begin
t:=specdate(ref(sp_time(),1),endt);
return array(datetostr(t),eval(&e));
end
结果:
参考Call CallInArray
Call
范例
//采用字符串方式来调用函数
return Call("IntTodate",20140101);
//返回41640
//采用函数指针来调用函数
F:=ThisFunction(IntToDate);
Return Call(F, 20140101);
//返回41640
参考Eval THISFUNCTION CallInArray
CallInArray
范例
范例1:根据函数名称调用,第一个参数为函数名称
return callinarray("StrToIntDef",array('1234',999));
//返回1234
范例2:调用匿名函数,第一个参数是指向匿名函数的变量
{func1是一个变量,我们将一个函数体赋值给这个变量,变量型函数我们称为匿名函数,匿名函数的语句段放在某个函数体内,调用的时候,需使用call或callinarray函数进行调用。
这个例子中,a是一个变量,当a在func1匿名函数中,并在匿名函数体重修改a,使a:=a+10; ,但执行完匿名函数后,a参数的值是不变的,即不支持变参,所以最后返回a为10,b为20。
callinarray在这里执行匿名函数func1时,其参数不需要跟在func1之后。}
a:=10;
func1 := function(a) begin
a:=a+10;
return a;
end;
b:=callinarray(func1,array(a));
return array(a,b);
//array(10,20)
范例3:根据函数指针调用,第一个参数为函数指针
{thisfunction()函数可获得函数指针;由于调用的是stockzf3,该函数没有参数,因此,callinarray的第二个参数给空数组}
setsysparam(pn_stock(),'SH000001');
return callinarray(thisfunction(stockzf3),array());
范例04:调用时指定参数传参
Function CCC(a,b,c,d);//展示各参数的值
begin
echo "A:",a," B:",b," C:",c," D:",d;
return b;
end;
//调用
return callINArray("CCC",array("b":1,"d":4));
返回:1
打印结果:A: B:1 C: D:40
解析:callINArray在通过数组传参数时,可以通过指定下标的方式给指定参数进行传参,下标对应函数定义中的变量名。
上面示例中,只对参数b与d进行了传参,其它两参数没有进行传值,所以是nil。
参考Eval THISFUNCTION Call
Invoke
范例
范例01:设置成员变量后调用成员方法并返回结果
obj := new classTest();
//设置成员变量name的值为"张三"
invoke(obj,"name",1,"张三");
//设置成员变量age的值为18
invoke(obj,"age",1,18);
//设置成员变量sid的值为"ts001"
invoke(obj,"sid",1,"ts001");
//执行单参数重载成员方法fun
a:=invoke(obj,"fun",0,"name");
//执行双参数重载成员方法fun
b:=invoke(obj,"fun",0,"name","age");
//执行三参数重载成员方法fun
c:=invoke(obj,"fun",0,"name","age","studentID");
return array(a,b,c);
type classTest = class
name;
age;
sID;
function fun(a);overload;
begin
s:= "\r\n"+a+":"+name;
echo s;
return s;
end
function fun(a,b);overload;
begin
s:="\r\n"+a+":"+name+" "+b+":"+floattostr(age);
echo s;
return s;
end
function fun(a,b,c);overload;
begin
s:="\r\n"+a+":"+name+" "+b+":"+floattostr(age)+" "+c+":"+sID;
echo s;
return s;
end
end
打印:
返回:参考Invokeinarray
Invokeinarray
范例
范例01:设置成员变量后调用成员方法并返回结果
obj := new classTest();
//设置成员变量name的值为"张三"
invokeinarray(obj,"name",1,array("张三"));
//设置成员变量age的值为18
invokeinarray(obj,"age",1,array(18));
//设置成员变量sid的值为"ts001"
invokeinarray(obj,"sid",1,array("ts001"));
//执行单参数重载成员方法fun
a:=invokeinarray(obj,"fun",0,array("name"));
//执行双参数重载成员方法fun
b:=invokeinarray(obj,"fun",0,array("name","age"));
//执行三参数重载成员方法fun
c:=invokeinarray(obj,"fun",0,array("name","age","studentID"));
return array(a,b,c);
type classTest = class
name;
age;
sID;
function fun(a);overload;
begin
s:= "\r\n"+a+":"+name;
echo s;
return s;
end
function fun(a,b);overload;
begin
s:="\r\n"+a+":"+name+" "+b+":"+floattostr(age);
echo s;
return s;
end
function fun(a,b,c);overload;
begin
s:="\r\n"+a+":"+name+" "+b+":"+floattostr(age)+" "+c+":"+sID;
echo s;
return s;
end
end
打印:
name:张三
name:张三 age:18
name:张三 age:18 studentID:ts001返回:
范例02:命名参数调用的方式
//调用
obj:=new classTestB();
return invokeinarray(obj,"fun",0,array("c":3,"b":2,"a":1));//命名参数的调用
//类实现
type classTestB= class
function fun(a,b,c);overload;
begin
return array(a,b,c);
end
end;
返回:array(1,2,3)参考Invoke
SafeEval
DoubleVariableExecute
算法
根据参数Arr和TimeArr的长度设置不同的系统参数,求表达式的值范例
stocks:=array(getbk('上证50'));
Timer:=MarketTradeDayQk(20220101T,20221211T);
return DoubleVariableExecute(stocks,pn_Stock(),Timer,@close());
返回:(部分结果截图)
MultipleExecute
算法
(1)获得'STOCKS','BKS','TIMES'对应的系统参数;
(2)根据以上系统参数是否是数组型,设置不同的系统参数,求表达式的值
SingleVariableExecute
范例
//Arr中存储的是代码,获取2019年3月1日,Arr中所有代码的收盘价
arr:=array('SZ000001','SZ000002');
return SingleVariableExecute(arr,pn_stock(),@close());
SafeSetSysParam
性能优化相关函数
内容
- SetProfiler
- GetProfilerInfo
SetProfiler
范例
范例01:1+2+4的优化信息返回
SetProfiler(7);
a:=array();
SetSysParam(PN_Stock(),'SH000001');
for i:=20000101t to 20200721T do
begin
if not spec(istradeday(i),'SH000001') then continue;
echo specdate(close(),i);
end
return 1;
//结果:times为函数运行的次数,seconds为运行时间,op为指令的优化信息,type为函数类型。
范例02:内置对象的优化信息返回
setprofiler(8);
o := new TStringList();
o.text := "Tinysoft"; //给对象的属性赋值
o.DelimitedText:='A=abc,B=123,C=abc,F=996,E=abd';
o.Add("G=666");
return 1;
优化信息如:
GetProfilerInfo
范例
范例01:不弹出profiler窗口
setprofiler(7); //记录TSL源代码函数调用+二进制函数的调用+指令调用的优化信息
a:=99;
b:=inttostr(a); //inttostr是函数
a:=rand(1000,1); //rand是指令
a:=select * from a where [0]>0.5 end; //select是指令
setsysparam(pn_stock(),"SZ000002");
b:=nday3(100,close()); //nday3也算是指令,不是函数 ,close是函数
return getprofilerinfo(1);
返回结果:
范例02:弹出profiler窗口
setprofiler(7); //记录TSL源代码函数调用+二进制函数的调用+指令调用的优化信息
a:=99;
b:=inttostr(a); //inttostr是函数
a:=rand(1000,1); //rand是指令
a:=select * from a where [0]>0.5 end; //select是指令
setsysparam(pn_stock(),"SZ000002");
b:=nday3(100,close()); //nday3也算是指令,不是函数 ,close是函数
t:= getprofilerinfo();
return b;
返回结果:返回程序结果的同时,另外弹出profiler窗口