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

15 KiB
Raw Blame History

第三方交互函数

内容
  • 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按示例顺序传入。 返回:处理后的结果值。

范例

s := "a=1
b := 1
if a == 1:
b := 2
";
PyRun(s);
return array("a":pygetvar("a"), "b":pygetvar("b"));

本地执行返回结果:

PyCall

用途Python支持函数相关函数。 参数arg1arg2arg3arg4按示例顺序传入。 返回:处理后的结果值。

范例

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:

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 调用错误信息。 参数:无。 返回:错误信息字符串。

范例

本地执行以下脚本

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

范例

范例代码:

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的APITSL封装了一个函数用来从彭博的终端或者SERVER获得数据。

blpcall
BLP测试范例

下属例子为订阅两支指数的最新价格价格到达则回调hello函数。

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相关函数。 参数:

返回:处理后的结果值。

范例

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相关函数。 参数:

返回:处理后的结果值。

范例

ASrc := "#abcd 10";
return TextToURL(ASrc);
// 结果:%23abcd%20%2010
HtmlToText

用途Html相关函数。 参数:

返回:处理后的结果值。

范例

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相关函数。 参数:

返回:处理后的结果值。

范例

aSrc := "%23abcd%20%2010";
return URLToText(aSrc);
// 结果:#abcd 10
do方式对外部语言的调用

语法do extlanguage [paramlist] [by config]

说明:

1、对外部语言的调用in表示只送入out表示只送出var表示送入送出。

2、如果使用变量名天软会默认将同名变量名送入到外部语言中。假如目标语言大小写相关则必须用name关键字明确指定变量名。

3、对于不同的语言而言可能有的语言存在返回值有的语言是无返回值的。例如PYTHON没有返回值而r有返回值。

4、如果只执行代码参数等都可以省略。

5、对于某些语言可能会存在其他配置的可以通过by语法来送入。

6、目前extlanguage已经支持python,r,matlab今后可能更多的语言会被扩展支持底层用户也可以通过接口规范来扩展支持其他语言。

7、配合新的%%非转义字符串语法,对于调用其他语言会更方便。

下面是一个调python语言的示例

a := 3;
c := 2;
do python in a name"A", out b, var c
%%
c := A * c
b := c * c
%%;

结果c为6,b为36

COM接口

TSL内置了COM对象支持支持通过创建外部com对象来调用外部组件的功能。

天软客户端也提供了COM服务服务名为TSExpert.CoExec。利用COM访问天软平台可以支撑包括MATLABSAS,EXCEL VBASPLUS,R等软件。

内容
  • 外部COM对象的创建
  • 天软客户端COM接口
外部COM对象的创建

TSL内置了COM对象支持支持通过创建外部com对象来调用外部组件的功能。

TSL中提供一个简单的方法GetOleObject来创建COM对象。

COM的调用和TSL的对象的调用是没有差异的也非常类似于PASCAL以及VB等对COM对象的调用。每个COM对象方法或者属性的调用要么返回一个TSL基本类型如数组数字字符串NIL等要么返回一个COM对象。

例如:

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的使用范例=============

systemClass := new TJClass("java/lang/System");
properties := systemClass.getProperties();
systemClass.out.println(properties.getProperty("java.class.path"));

==========tjobject使用范例==============

// 构造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范例==================

// 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[]

如存在有需要显式转换的其他类型今后将会根据具体需求进行升级

=========================================================