Um código pode seguir as regras da linguagem e ainda calcular um resultado diferente do desejado. Com o depurador, você pode pausar a execução, examinar as variáveis e acompanhar as instruções uma a uma.

Neste capítulo, você vai examinar a distância entre o fechamento e a média móvel de cinco. Primeiro, fará uma previsão; depois, verá o que o programa calculou.

Três tipos de erro

Um erro de sintaxe viola uma regra de escrita do código. Pode ser a falta de dois-pontos ou uma indentação incorreta. O editor costuma apontá-lo enquanto você digita.

Um erro de execução acontece enquanto o programa é executado. Por exemplo, você tenta ler um índice do array para o qual não existe elemento. Nesse caso, a execução pode parar com uma mensagem de erro.

Com um erro de lógica, o programa pode continuar funcionando. Se o código usar average - close em vez de close - average, o sinal do resultado será invertido. As regras da linguagem não proíbem isso; cabe a você comparar o resultado com o objetivo.

O painel View → Problems do Visual Studio Code reúne os problemas indicados pelo editor. Clique em uma linha para ir ao local do erro. Leia a mensagem detalhada antes de começar a alterar várias linhas.

Um programa para examinar

Crie o arquivo debug_average.py:

"""
@pyne edge
"""
from pynecore import Series
from pynecore.lib import bar_index, close, color, log, plot, script, ta


@script.indicator("Average Distance", overlay=False)
def main():
    average: Series[float] = ta.sma(close, 5)
    gap = close - average
    if bar_index == 10:
        log.info("close={0}, average={1}, gap={2}", close, average, gap)
    plot(gap, "Distance", color=color.blue)

bar_index é o índice do candle em processamento e começa em zero. O índice 10 corresponde ao décimo primeiro candle. Por isso, a chamada de log escreve apenas uma vez nesta execução histórica.

log.info cria uma mensagem formatada. {0}, {1} e {2} são substituídos pelos três valores fornecidos em seguida, nessa ordem. O sistema de log processa o texto com esses espaços numerados.

Execute o programa uma vez com Run Pyne code. A linha deve ser positiva quando o fechamento estiver acima da média. Nos quatro primeiros candles, tanto a média quanto a distância estão ausentes.

Pause antes de uma linha específica

  1. Clique à esquerda do número da linha de plot(gap, ...). Aparece a marca do ponto de interrupção.
  2. Acima do código, clique em Debug.
  3. Se aparecer a seleção de dados, escolha a linha demo.
  4. O programa para no ponto de interrupção. Abra o painel Run and Debug.

Um ponto de interrupção é um local em que o depurador pausa o programa. A linha destacada ainda não foi executada. Você já pode examinar os resultados das atribuições anteriores a ela.

A primeira pausa pode acontecer no primeiro candle. Nele, gap está ausente, pois não há uma janela completa de cinco candles. O depurador mostra essa situação; a ausência, por si só, não é um erro do programa.

Vá até um candle depois do aquecimento

Na barra flutuante exibida durante a depuração, o botão Next Bar do PyneIDE avança para o próximo candle. Passe o ponteiro sobre os ícones para ler seus nomes. Encontre Run to Bar…, clique nele, digite 10 no campo que aparece e pressione Enter.

No décimo primeiro candle, já há uma janela completa de média de cinco. Na lista Variables, procure average e gap. No grupo Pyne, confira os dados do candle processado, incluindo bar_index e close.

debug_average.py está pausado em um ponto de interrupção no PyneIDE; o painel Run and Debug mostra as variáveis e os dados do candle em Pyne.
Com a execução pausada no depurador, você pode examinar ao mesmo tempo os dados do candle e suas próprias variáveis.

average é uma variável Series, por isso você também pode usar seu valor anterior no código com average[1]. A média do candle anterior não precisa ser igual à atual, pois a janela avançou um candle.

Expressões monitoradas

Na seção Watch, você pode acrescentar uma expressão para examinar a cada pausa. Experimente:

close
close[1]
average
close - average

close[1] é o fechamento anterior ao candle em que a execução está pausada. average é sua própria variável. O resultado de close - average deve coincidir com o valor de gap já calculado.

Monitore variáveis e cálculos simples. Não coloque em Watch chamadas de ta.sma, operações que enviam ordens ou chamadas que modificam arrays. A conferência no depurador não deve alterar o estado do programa.

Linha a linha e candle a candle

Step Over avança até a próxima instrução sem entrar nos detalhes de uma função chamada. Step Into pode entrar em uma função sua. Continue retoma a execução até a próxima pausa; Disconnect encerra a conexão com o depurador e termina a depuração.

Next Bar trabalha em outra escala: leva ao próximo candle. O avanço linha a linha mostra em detalhes o cálculo de um único candle; o avanço candle a candle mostra como o resultado muda no tempo.

O processamento do candle pausado ainda não terminou, por isso o gráfico pode mostrar o estado concluído anteriormente. Confira o índice e os dados do candle atual no grupo Pyne.

Antes de ler uma variável, observe a linha destacada. Se a atribuição ainda estiver adiante, a variável não contém o resultado que você espera agora.

Encontre um erro de sinal

Pare o depurador. Modifique esta linha:

gap = average - close

Inicie a depuração novamente e vá até o mesmo candle. Se o preço estiver acima da média, gap será negativo, embora o exercício peça uma distância positiva.

Em Watch, close - average continua mostrando a direção original, desejada. Comparar os valores revela a diferença imediatamente. Restaure a subtração correta e confira novamente no mesmo candle.

Tente por conta própria

Acrescente a variável previous_close = close[1] ao programa e examine-a no depurador. No candle de índice 10, o fechamento de qual índice ela deve conter? Qual é seu valor no primeiro candle?

Solução do exercício
previous_close = close[1]

No candle 10, ela fornece o fechamento do candle 9. No primeiro candle, de índice 0, o valor está ausente porque não há um candle anterior no arquivo de dados.

Escreva a linha antes do ponto de interrupção para que ela já tenha sido executada na pausa. Depois da conferência, você pode remover a variável auxiliar e a linha de log usada apenas para verificar o programa.

Uma boa descrição de erro

Ao pedir ajuda, informe o arquivo, os dados usados, os inputs efetivos e o instante do candle examinado. Descreva tanto o valor esperado quanto o obtido. Em vez de “a linha está errada”, por exemplo: “neste candle, o fechamento é 101 e a média é 100, mas a distância ficou em −1”. Isso permite conferir o cálculo.