onexit()
函数用于处理策略停止时的扫尾工作,最长执行时间为5分钟,需由用户自行实现。
”`javascript 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)
}
}
python
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)
cpp
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()函数的基本用法:
javascript
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(“执行扫尾函数”)
}
python
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(“执行扫尾函数”)
cpp
#include
#include
#include
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()“`函数的执行。