对于JavaScript
、Python
、C++
语言的策略,优宽量化交易平台已经定义了以下入口函数。
函数名 | 说明 |
---|---|
main() |
入口函数,策略的主函数。 |
onexit() |
正常退出时的扫尾函数,最长执行时间为5分钟,可以不声明,如果超时会报错interrupt错误。在实盘时先触发了onerror() 函数,就不会再触发onexit() 函数。 |
onerror() |
异常退出触发执行的函数,最长执行时间为5分钟,可以不声明。Python 语言、C++ 语言编写的策略不支持该函数,回测系统不支持该函数。 |
init() |
初始化函数,策略程序会在开始运行时首先自动调用,可不声明。 |
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()
函数,完成策略中设计的初始化任务。
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()
函数执行,该函数不支持Python
、C++
语言的策略。 onerror()
函数可以接收一个msg
参数,该msg
参数为异常触发时的报错信息。
function main() {
// 不使用接口获取数据的测试,就无需使用exchange.IO("status")函数判断连接状态,也不用设置合约代码,因为这里仅仅是测试
var arr = []
Log(arr[6].Close) // 这里故意引发一个程序异常
}
function onerror(msg) {
Log("错误:", msg)
}
# python不支持
// C++不支持
回测系统
策略框架与API函数