Type/to search
8
Follow
1364
Followers
Depuração de backtesting de estratégia JavaScript no navegador Chrome DevTools
Discussions
Created 2022-06-22 14:23:26  Updated 2023-09-18 20:24:01
 1
 2020

img

Depuração de backtesting de estratégia JavaScript no navegador Chrome DevTools

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.

Na plataforma FMZdebuggerinstrução

Inserir 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:

javascript
/*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:

img

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:

    1. Clicamos com o botão direito na página para abrir o menu pop-up

    img

    Quando clicarmos em "Inspecionar", a interface do DevTools será exibida.

    1. Use teclas de atalho

    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:

img

A interface de depuração no navegador da estratégia de linguagem JavaScript

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:

img

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.

Definir manualmente pontos de interrupção para depuração

Podemos clicar no número da linha no lado esquerdo do código para adicionar um ponto de interrupção.

img

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.

img

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.

img

Dê este código de teste DEBUG

img

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".

img

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

img

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.

Related Recommendations
Comment
All comments (1)

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

    4 years ago
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)