输入/搜索内容
入门
欢迎使用发明者量化交易平台
快速开始
密钥安全性
平台基础
账号与计费
实盘计费与充值
子账号
交易所
通用协议
本地凭据文件
交易所特殊说明
证券与期货
加密货币
托管者
策略库
实盘
编写策略
开发工具
回测系统
进阶专题
数据与研究
对外接口

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

创建模板类库页面

各语言中导出、调用模板函数的方式:

语言模板中导出策略中调用
JavaScript挂到$上:$.Test = function() {...}$.Test()
Python挂到ext上:ext.Test = Testext.Test()
Rust模板代码并入ext模块,供策略调用的函数声明为pub fnext::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() }
    python
    def Test(): Log("template call") # 导出Test函数, 主策略可以通过ext.Test()调用 ext.Test = Test
    rust
    // 策略引用该模板以后直接用 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 }
    python
    def SetParam1(p1): global param1 param1 = p1 def GetParam1(): Log("param1:", param1) return param1 ext.SetParam1 = SetParam1 ext.GetParam1 = GetParam1
    rust
    // Rust 模板参数是只读常量,不能修改,读取参数的写法见上文
  • 引用以上模板类库例子的策略代码,使用模板类库的导出函数获取参数param1和修改参数param1。

    javascript
    function main () { Log("Calling $.GetParam1:", $.GetParam1()) Log("Calling $.SetParam1:", "#FF0000") $.SetParam1(20) Log("Calling $.GetParam1:", $.GetParam1()) }
    python
    def main(): Log("Calling ext.GetParam1:", ext.GetParam1()) Log("Calling ext.SetParam1:", "#FF0000") ext.SetParam1(20) Log("Calling ext.GetParam1:", ext.GetParam1())
    rust
    // Rust 模板参数是只读常量,不能修改,读取参数的写法见上文

策略引用模板类库时,需要当前登录的发明者量化交易平台账号的策略库中存在可用的模板类库。在策略编辑页面的模板栏中勾选需要引用的模板,保存策略后即可完成引用。

模板引用截图