playbook/docs/tsl/syntax_book/function/tsl/system.md

24 KiB
Raw Blame History

系统相关函数

内容
  • 数据类型函数
  • 数据类型转换函数
  • 复制函数
  • 随机函数
  • 条件选择函数
  • 表达式相关函数
  • 性能优化相关函数
  • 调用堆栈
数据类型函数
内容
  • 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字符串Labcd
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

定义1random():Real;

说明返回一个0到1之间的随机数

返回:实数。

定义2random(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;//AB均为整型数据

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为10b为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

范例

范例011+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窗口

调用堆栈