
Para estratégias de depuração em um sistema de backtesting, geralmente apenasLog()função. Esse tipo de eficiência de DEBUG é muito baixa e difícil para iniciantes com pouca experiência em testes de programas. paraJavaScriptEstratégia de depuração da linguagemChromeOs navegadores têm melhor suporte. Ele pode realizar depuração de ponto de interrupção, depuração de etapa única, monitoramento de valor de variável, monitoramento de expressão, etc. durante o backtesting. Então vamos aprender como usar esse método para controlar a FMZ.JavascriptDEBUG ao testar estratégias na linguagem. Observe que somente na FMZJavascriptAs políticas da linguagem dão suporte a essa abordagem de depuração.
debuggerinstruçãoInserir no código de política da linguagem JavaScript no FMZdebuggerInstrução que pode interromper a execução do programa durante o backtesting.
Usamos o seguinte código de estratégia de teste:
/*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)
}
}
Do código de configuração do backtest
/*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"}]
*/
Você pode ver que a exchange que adicionamos durante o backtest é a Binance Spot, e a configuração é como mostrada na captura de tela:

Continuando a olhar para o código da estratégia, podemos ver quevar t = exchange.GetTicker()Abaixo desta frase escrevemosdebuggerA instrução é equivalente a definir um ponto de interrupção aqui, e o programa irá parar quando atingir essa posição. Múltiplodebugger, mas não é recomendado fazer isso. Basta definir um ponto de interrupção em um determinado local. Os pontos de interrupção subsequentes podem ser definidos na função de depuração DevTools do navegador.
Você precisa abrir o navegador Chrome primeiroDevToolsEm seguida, execute o backtest, o conjunto de códigos de estratégiadebuggerentrará em vigor, caso contráriodebuggerEle será ignorado e o programa de estratégia de backtest não poderá ser interrompido e parado no ponto de interrupção. AbrirDevToolsApós o backtest da estratégia, o programa de estratégia será interrompido no primeiro conjuntodebuggerLocalização,debuggerTambém pode ser definido no escopo global do código de política.
Abrimos o navegador ChromeDevToolsExistem dois tipos de ferramentas:

Quando clicarmos em “Inspecionar”, a interface do DevTools será exibida.
Você também pode usar a tecla de atalho para abri-lo.Command+Option+I (Mac)ouControl+Shift+I(Windows、Linux)Abrir DevTools。
AbrirDevToolsDepois, conforme mostrado na figura:

Após o teste acima, quando clicamos no botão “Start Backtesting” para fazer o backtest da estratégia, devido à configuração no códigodebuggerInstrução, a estratégia interrompe e espera na posição correspondente. O backtest parece estar travado, conforme mostrado abaixo:

Pode-se observar que na estratégiadebuggerMarque a posição de interrupção. O programa inteiro executa apenas n atribuído a 1 e t atribuído aGetTickerOs dados de mercado retornados pela função. Na caixa vermelha na imagem acima, você pode ver os valores de variáveis específicas, o que torna muito conveniente observar os valores de várias variáveis quando a estratégia está em execução.
Podemos clicar no número da linha no lado esquerdo do código para adicionar um ponto de interrupção.

Clique em “resumir execução do script” para retomar a execução do script. O programa será executado até o próximo ponto de interrupção. Se não houver ponto de interrupção ou se o programa tiver um erro e causar uma exceção, o backtest será encerrado.

Também há botões que podem ser usados para: pular a próxima função, entrar na próxima chamada de função, sair da chamada de função atual, dar um passo a mais, ignorar todos os pontos de interrupção, etc.


Neste ponto, quando continuamos clicando no botão “retomar execução do script” para continuar a execução, o programa de estratégia terá uma exceção, o backtest será encerrado e uma mensagem de erro de exceção será impressa.
main:17:31 - TypeError: Cannot convert "undefined" to double
Este é um erro comum cometido por novatos, que não distinguem entre letras maiúsculas e minúsculas em um nome de atributo de estrutura.
var id = exchange.Buy(t.buy, 0.1) // 下买单,此处有错误,会报错,返回null,GetTicker返回数据t,只有Buy属性,没有buy属性。
Como resultado, o preço passou para a bolsa. A função Buy é uma variável indefinida, causando uma exceção no programa e o backtest termina.
Quando o programa para em um ponto de interrupção, esta linha de código não é executada. Continuamos clicando no botão “entrar na próxima chamada de função”.

Vá para a chamada da função exchange.Buy.

Veja que o preço é uma variável indefinida.
Usando o método acima, é fácil encontrar bugs no programa passo a passo. Muitos erros que novatos costumam cometer: por exemplo, acesso fora dos limites a índices de array, referências a variáveis indefinidas, escrita incorreta de expressões, etc. Dessa forma, é fácil depurar o programa.