资源加载中... loading...

策略入口函数

对于JavaScriptPythonC++语言的策略,优宽量化交易平台已经定义了以下入口函数。

函数名 说明
main() 入口函数,策略的主函数。
onexit() 正常退出时的扫尾函数,最长执行时间为5分钟,可以不声明,如果超时会报错interrupt错误。在实盘时先触发了onerror()函数,就不会再触发onexit()函数。
onerror() 异常退出触发执行的函数,最长执行时间为5分钟,可以不声明。Python语言、C++语言编写的策略不支持该函数,回测系统不支持该函数。
init() 初始化函数,策略程序会在开始运行时首先自动调用,可不声明。

onexit()

onexit()函数处理扫尾工作,最长执行5分钟,由用户实现。

function 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)
    }
}
import 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)
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()函数:

function 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("执行扫尾函数") 
}
def 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("执行扫尾函数")
#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("执行扫尾函数");
}

由于回测系统中策略通常设计为一个死循环不停轮询执行,会导致在回测系统中无法触发执行策略中实现的onexit()函数。可以通过检测回测系统结束标记(EOF异常)来触发onexit()函数执行。

init()

init(),用户实现初始化函数init(),策略开始运行时首先自动执行init()函数,完成策略中设计的初始化任务。

function main(){
    // 不使用接口获取数据的测试,就无需使用exchange.IO("status")函数判断连接状态,也不用设置合约代码,因为这里仅仅是测试
    Log("程序第一行代码执行!", "#FF0000")
    Log("退出!")
}

// 初始化函数
function init(){     
    Log("初始化!")
}
def main():
    Log("程序第一行代码执行!", "#FF0000")
    Log("退出!")

def init():
    Log("初始化!")
void main() {
    Log("程序第一行代码执行!", "#FF0000");
    Log("退出!");
}

void init() {
    Log("初始化!");
}

onerror()

onerror(),发生异常时会触发onerror()函数执行,该函数不支持PythonC++语言的策略。 onerror()函数可以接收一个msg参数,该msg参数为异常触发时的报错信息。

function main() {
    // 不使用接口获取数据的测试,就无需使用exchange.IO("status")函数判断连接状态,也不用设置合约代码,因为这里仅仅是测试
    var arr = []
    Log(arr[6].Close)  // 这里故意引发一个程序异常
}

function onerror(msg) {
    Log("错误:", msg)
}
# python不支持
// C++不支持
回测系统 策略框架与API函数