策略入口函数
对于JavaScript、Python、C++语言的策略,优宽量化交易平台已定义以下入口函数。
| 函数名 | 说明 |
|---|---|
main() | 入口函数,策略的主函数。 |
onexit() | 正常退出时的清理函数,最长执行时间为5分钟,可以不声明。如果超时会报interrupt错误。在实盘中,如果先触发了onerror()函数,则不会再触发onexit()函数。 |
onerror() | 异常退出时触发执行的函数,最长执行时间为5分钟,可以不声明。Python语言、C++语言编写的策略不支持该函数,回测系统也不支持该函数。 |
init() | 初始化函数,策略程序在开始运行时会首先自动调用,可不声明。 |
注意事项:
- 当
main()函数执行结束时,所有创建的子线程会被自动终止。
onexit()
onexit()函数用于处理策略停止时的扫尾工作,最长执行时间为5分钟,需由用户自行实现。
示例
-
测试
onexit()函数的基本用法:javascriptfunction main(){ Log("开始运行, 5秒后停止,并执行扫尾函数!") Sleep(1000 * 5) } // 扫尾函数实现 function onexit(){ // 不使用接口获取数据的测试,就无需使用exchange.IO("status")函数判断连接状态,也不用设置合约代码,因为这里仅仅是测试 var beginTime = new Date().getTime() while(true){ var nowTime = new Date().getTime() Log("程序停止倒计时..扫尾开始,已经过去:", (nowTime - beginTime) / 1000, "秒!") Sleep(1000) } }pythonimport time def main(): Log("开始运行, 5秒后停止,并执行扫尾函数!") Sleep(1000 * 5) def onexit(): beginTime = time.time() * 1000 while True: ts = time.time() * 1000 Log("程序停止倒计时..扫尾开始,已经过去:", (ts - beginTime) / 1000, "秒!") Sleep(1000)c++void main() { Log("开始运行, 5秒后停止,并执行扫尾函数!"); Sleep(1000 * 5); } void onexit() { auto beginTime = Unix() * 1000; while(true) { auto ts = Unix() * 1000; Log("程序停止倒计时..扫尾开始,已经过去:", (ts - beginTime) / 1000, "秒!"); Sleep(1000); } } -
由于回测系统中的策略通常设计为死循环持续轮询执行,这会导致无法触发策略中实现的
onexit()函数。可以通过检测回测系统的结束标记(EOF异常)来触发onexit()函数的执行。javascriptfunction main() { exchange.SetContractType("rb888") if (IsVirtual()) { try { onTick() } catch (e) { Log("error:", e) } } else { onTick() } } function onTick() { while (true) { var ticker = exchange.GetTicker() LogStatus(_D(), ticker ? ticker.Last : "--") Sleep(500) } } function onexit() { Log("执行扫尾函数") }pythondef main(): exchange.SetContractType("rb888") if IsVirtual(): try: onTick() except Exception as e: Log(e) else: onTick() def onTick(): while True: ticker = exchange.GetTicker() LogStatus(_D(), ticker["Last"] if ticker else "--") Sleep(500) def onexit(): Log("执行扫尾函数")c++#include <iostream> #include <exception> #include <string> void onTick() { while (true) { auto ticker = exchange.GetTicker(); LogStatus(_D(), ticker); Sleep(500); } } void main() { exchange.SetContractType("rb888"); if (IsVirtual()) { try { onTick(); } catch (...) { std::cerr << "Caught unknown exception" << std::endl; } } else { onTick(); } } void onexit() { Log("执行扫尾函数"); }
init()
init(),用户实现初始化函数init(),策略开始运行时会首先自动执行init()函数,用于完成策略中设计的初始化任务。
示例
javascript
function main(){
// 不使用接口获取数据的测试时,无需使用exchange.IO("status")函数判断连接状态,也不用设置合约代码,因为这里仅仅是测试
Log("程序第一行代码执行!", "#FF0000")
Log("退出!")
}
// 初始化函数
function init(){
Log("初始化!")
}
python
def main():
Log("程序第一行代码执行!", "#FF0000")
Log("退出!")
def init():
Log("初始化!")
c++
void main() {
Log("程序第一行代码执行!", "#FF0000");
Log("退出!");
}
void init() {
Log("初始化!");
}onerror()
onerror(),当发生异常时会触发onerror()函数执行。该函数不支持Python、C++语言的策略。
onerror()函数可以接收一个msg参数,该参数包含异常触发时的错误信息。
示例
javascript
function main() {
// 不使用接口获取数据的测试,就无需使用exchange.IO("status")函数判断连接状态,也不用设置合约代码,因为这里仅仅是测试
var arr = []
Log(arr[6].Close) // 这里故意引发一个程序异常
}
function onerror(msg) {
Log("错误:", msg)
}
python
# python不支持
c++
// C++不支持