JavaScript策略回测在Chrome浏览器DevTools调试

Author: 小小梦, Created: 2022-06-22 14:23:26, Updated: 2023-09-18 20:24:01

img

JavaScript策略回测在Chrome浏览器DevTools调试

对于在回测系统中调试策略,通常只能用Log()函数。这样DEBUG效率非常低,并且对于程序测试经验不多的新手来说有一定难度。对于JavaScript语言的策略调试来说Chrome浏览器有更好的支持。可以实现回测时断点调试、单步调试、变量值监控、表达式监控等等。那么接下来让我们一起来学习如何使用这种方式对FMZ上的Javascript语言的策略回测时DEBUG。注意,在FMZ上仅仅Javascript语言的策略支持此种调试方法。

FMZ平台上的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(币安)现货,配置如截图:

img

继续看策略代码,我们可以看到在var t = exchange.GetTicker()这一句下我们写入了debugger指令,就相当于在这里打上了一个断点,程序执行到这个位置就会停止。策略代码中可以使用多个debugger,但是不建议这样做,只用在某个位置打上一个断点即可,后续断点可以在浏览器的DevTools调试功能中设置。

需要先打开Chrome浏览器的DevTools再执行回测,策略代码中设置的debugger才会生效,否则debugger会被忽略,回测的策略程序无法中断停止在断点位置。打开DevTools后回测策略,策略程序会中断在第一个设置的debugger位置,debugger也可以设置在策略代码全局作用域。

我们打开,Chrome浏览器的DevTools工具的方式有两种:

  • 1、我们使用右键点击页面弹出菜单打开

    img

    我们点击「检查」就会显示出DevTools界面了。

  • 2、使用快捷键

    也可以使用快捷键打开,按Command+Option+I (Mac)Control+Shift+I(Windows、Linux)打开 DevTools

打开DevTools之后如图:

img

JavaScript语言策略的浏览器中DEBUG的界面

接着上面的测试,当我们点击「开始回测」按钮回测策略时,由于代码中设置了debugger指令,策略在对应位置中断等待。回测就像是卡死了一样,如下图:

img

可以看到,在策略debugger标记中断的位置,整个程序只执行了n赋值为1,t赋值为GetTicker函数返回的行情数据。在上图中的红框里可以看到具体的变量值,这样就很方便观察策略运行时各个变量的值了。

手动设置断点调试

我们可以点击代码左侧的行号,添加断点。

img

点击「resume script execution」恢复脚本执行,程序将运行到下一个断点,如果没有断点或者程序有错误引发异常,回测会结束。

img

还有一些按钮可以实现:跳过下一个函数、进入下一个函数调用、跳出当前函数调用、单步执行、忽略所有断点等。

img

给这段测试代码DEBUG

img

此时,当我们继续点击「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」按钮。

img

跳转到exchange.Buy函数调用中。

img

看到价格是一个undefined变量。

使用以上的方式,就很容易一步一步的找出程序BUG了。很多新手经常犯的错误:例如数组的索引访问越界、引用了未定义的变量、表达式书写错误等。通过这种方式就很容易对程序进行DEBUG了。


Related

More

fmzero 卧槽,还能这样,666,骚啊