#### 第三方交互函数

##### 内容

- 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&#160;First&#160;LETTER&#160;won't&#160;be&#160;replaced&#160;by&#160;'one',&#160;but&#160;the&#160;Second&#160;letter&#160;will.
```

###### TextToURL

用途：Html相关函数。
参数：

返回：处理后的结果值。

范例

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

###### HtmlToText

用途：Html相关函数。
参数：

返回：处理后的结果值。

范例

```tsl
Src := "The&#160;First&#160;LETTER&#160;won't&#160;be&#160;replaced&#160;by&#160;'one',&#160;but&#160;the&#160;Second&#160;letter&#160;will.";
return HtmlToText(Src);
// 结果：The First LETTER won't be replaced by 'one', but the Second letter will.
```

###### URLToText

用途：Html相关函数。
参数：

返回：处理后的结果值。

范例

```tsl
aSrc := "%23abcd%20%2010";
return URLToText(aSrc);
// 结果：#abcd 10
```

##### do方式对外部语言的调用

语法：do extlanguage [paramlist] <scriptstring> [by config]

说明：

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

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

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

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

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

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

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

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

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

结果c为6,b为36

##### COM接口

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

天软客户端也提供了COM服务，服务名为TSExpert.CoExec。利用COM访问天软平台，可以支撑包括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[]

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

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