对于在回测系统中调试策略,通常只能用Log()
函数。这样DEBUG效率非常低,并且对于程序测试经验不多的新手来说有一定难度。对于JavaScript
语言的策略调试来说Chrome
浏览器有更好的支持。可以实现回测时断点调试、单步调试、变量值监控、表达式监控等等。那么接下来让我们一起来学习如何使用这种方式对FMZ上的Javascript
语言的策略回测时DEBUG。注意,在FMZ上仅仅Javascript
语言的策略支持此种调试方法。
debugger
指令在FMZ上的JavaScript语言的策略代码中插入debugger
指令,可以在回测时让程序执行中断。
我们使用以下测试策略代码:
/*backtest
start: 2022-03-21 09:00:00
end: 2022-06-21 15:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
function main() {
var n = 1
while (true) {
var t = exchange.GetTicker()
debugger
var r = exchange.GetRecords()
if (n == 1) {
// 下买单,此处有错误,会报错,返回null,GetTicker返回数据t,只有Buy属性,没有buy属性,属性名区分大小写
var id = exchange.Buy(t.buy, 0.1)
var orderBuy = exchange.GetOrder(id)
}
Sleep(500)
}
}
从回测配置代码
/*backtest
start: 2022-03-21 09:00:00
end: 2022-06-21 15:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Binance","currency":"BTC_USDT"}]
*/
可以看到我们回测时添加的交易所是Binance(币安)现货,配置如截图:
继续看策略代码,我们可以看到在var t = exchange.GetTicker()
这一句下我们写入了debugger
指令,就相当于在这里打上了一个断点,程序执行到这个位置就会停止。策略代码中可以使用多个debugger
,但是不建议这样做,只用在某个位置打上一个断点即可,后续断点可以在浏览器的DevTools调试功能中设置。
需要先打开Chrome浏览器的DevTools
再执行回测,策略代码中设置的debugger
才会生效,否则debugger
会被忽略,回测的策略程序无法中断停止在断点位置。打开DevTools
后回测策略,策略程序会中断在第一个设置的debugger
位置,debugger
也可以设置在策略代码全局作用域。
我们打开,Chrome浏览器的DevTools
工具的方式有两种:
1、我们使用右键点击页面弹出菜单打开
我们点击「检查」就会显示出DevTools界面了。
2、使用快捷键
也可以使用快捷键打开,按Command+Option+I (Mac)
或Control+Shift+I(Windows、Linux)
打开 DevTools
。
打开DevTools
之后如图:
接着上面的测试,当我们点击「开始回测」按钮回测策略时,由于代码中设置了debugger
指令,策略在对应位置中断等待。回测就像是卡死了一样,如下图:
可以看到,在策略debugger
标记中断的位置,整个程序只执行了n赋值为1,t赋值为GetTicker
函数返回的行情数据。在上图中的红框里可以看到具体的变量值,这样就很方便观察策略运行时各个变量的值了。
我们可以点击代码左侧的行号,添加断点。
点击「resume script execution」恢复脚本执行,程序将运行到下一个断点,如果没有断点或者程序有错误引发异常,回测会结束。
还有一些按钮可以实现:跳过下一个函数、进入下一个函数调用、跳出当前函数调用、单步执行、忽略所有断点等。
此时,当我们继续点击「resume script execution」按钮继续执行时,策略程序会发生异常,回测结束,打印了一个异常错误信息。
main:17:31 - TypeError: Cannot convert "undefined" to double
这个是新手经常犯的错误,对于某个结构属性名称没有区分大小写。
var id = exchange.Buy(t.buy, 0.1) // 下买单,此处有错误,会报错,返回null,GetTicker返回数据t,只有Buy属性,没有buy属性。
导致传入exchange.Buy函数的价格是一个undefined变量,引起程序异常,回测结束。
当程序停止在断点位置,这一行的代码是没有执行的。我们继续点击「step into next function call」按钮。
跳转到exchange.Buy函数调用中。
看到价格是一个undefined变量。
使用以上的方式,就很容易一步一步的找出程序BUG了。很多新手经常犯的错误:例如数组的索引访问越界、引用了未定义的变量、表达式书写错误等。通过这种方式就很容易对程序进行DEBUG了。
fmzero 卧槽,还能这样,666,骚啊