模板类库
模板类库是发明者量化交易平台中可复用的代码模块,是策略代码的一种类别。支持模板类库的语言有:JavaScript(含 TypeScript)、Python、Rust;Blockly可视化策略可以使用 JavaScript 模板类库提供的积木。创建策略时如果类别设置为模板类库,会在当前登录账号的策略库中创建一个模板类库,创建后不能再修改类别为普通策略。

各语言中导出、调用模板函数的方式:
| 语言 | 模板中导出 | 策略中调用 |
|---|---|---|
| JavaScript | 挂到$上:$.Test = function() {...} | $.Test() |
| Python | 挂到ext上:ext.Test = Test | ext.Test() |
| Rust | 模板代码并入ext模块,供策略调用的函数声明为pub fn | ext::Test() |
- 模板中的
main()函数在策略中不会执行,只作为单独回测、调试模板时的入口。 JavaScript模板可以定义init()和destroy():init()在模板加载时执行(早于策略的init()),destroy()在策略退出时、onexit()或onerror()之后执行。Python模板可以定义init(),在模板加载时执行。Rust模板和策略都可以用 frontmatter 声明第三方 crate,但依赖块只能写在其中一处,两处都写会编译失败。
模板类库的导出函数
导出函数为模板类库的接口函数,可以被引用该模板类库的策略调用。
示例
-
不同的编程语言的模板类库书写格式有所不同,导出函数在模板类库中声明以及实现的例子代码如下:
javascript/* -- 策略引用该模板以后直接用 $.Test() 调用此方法 -- main 函数在策略中不会触发, 只做为模板调试的入口 */ $.Test = function() { Log('Test') } function main() { $.Test() }pythondef Test(): Log("template call") # 导出Test函数, 主策略可以通过ext.Test()调用 ext.Test = Testrust// 策略引用该模板以后直接用 ext::Test() 调用此函数 // 供策略调用的函数必须声明为 pub pub fn Test() { Log!("template call"); } -
Blockly可视化方式编写的策略使用类库功能可以藉由JavaScript语言的模板类库编写实现,使用以下书写格式编写。javascript/*blockly { "type": "ext_testA", "message0": "testA|testA", "template": "function(){return 99;}()", "order": "ORDER_ATOMIC", "output": "Number" },{ "type": "ext_MA", "message0": "MA 周期 %1| MA Period %1", "args0": [{ "type": "input_value", "check": "Number" }], "template": "(function(){var r = exchange.GetRecords(); return (!r || r.length < %1) ? false : TA.MA(r, %1); })()", "order": "ORDER_ATOMIC", "output": null, "colour": 85 } */
模板类库的参数
模板类库也可以设置自己的界面参数,模板类库的参数在模板类库代码中是以全局变量的形式使用的(Rust 中为全局常量)。
例如我们设置了一个模板类库的参数:

| 策略代码中参数的变量名 | 策略界面上显示的参数名称 | 类型 | 默认值 |
|---|---|---|---|
| param1 | 模板参数1 | 数字型(number) | 99 |
Rust模板的参数是常量,只能读取,不能修改,所以下面的例子在 Rust 中只能实现读取参数:
rust
// 模板代码
pub fn GetParam1() -> f64 {
Log!("param1:", param1);
param1
}
rust
// 策略代码
fn main() {
Log!("Calling ext::GetParam1:", ext::GetParam1());
}
示例
-
用于测试
param1参数的模板类库代码:javascript$.SetParam1 = function(p1) { param1 = p1 } $.GetParam1 = function() { Log("param1:", param1) return param1 }pythondef SetParam1(p1): global param1 param1 = p1 def GetParam1(): Log("param1:", param1) return param1 ext.SetParam1 = SetParam1 ext.GetParam1 = GetParam1rust// Rust 模板参数是只读常量,不能修改,读取参数的写法见上文 -
引用以上模板类库例子的策略代码,使用模板类库的导出函数获取参数
param1和修改参数param1。javascriptfunction main () { Log("Calling $.GetParam1:", $.GetParam1()) Log("Calling $.SetParam1:", "#FF0000") $.SetParam1(20) Log("Calling $.GetParam1:", $.GetParam1()) }pythondef main(): Log("Calling ext.GetParam1:", ext.GetParam1()) Log("Calling ext.SetParam1:", "#FF0000") ext.SetParam1(20) Log("Calling ext.GetParam1:", ext.GetParam1())rust// Rust 模板参数是只读常量,不能修改,读取参数的写法见上文
