No capítulo anterior, você fez cálculos com os dados de um candle. Para calcular a variação do fechamento, já precisamos de dois: o atual e o anterior. Neste capítulo, você vai estabelecer essa relação.

O programa é o mesmo; o candle muda

Quando você executa o programa com os dados de demonstração, o PyneCore percorre os candles em ordem cronológica. main() trabalha com o primeiro candle, depois com o segundo, e assim por diante. A cada vez, close representa o fechamento do candle que está sendo processado.

É por isso que uma única chamada de plot(close, "Close") consegue desenhar uma linha inteira. Cada execução acrescenta um ponto à linha; a sequência de candles forma a linha completa.

A linha midpoint = (high + low) / 2, do capítulo anterior, também é executada novamente a cada candle. A atribuição recalcula o ponto médio daquele candle. O nome da variável continua igual; seu valor pode mudar.

O ambiente de execução garante a ordem do processamento. Você não precisa escrever um laço próprio para percorrer o gráfico inteiro.

Consulte o histórico com colchetes

close[1] é o fechamento de um candle atrás. O número entre colchetes indica quanto devemos voltar no histórico.

ExpressãoQual fechamento representa?
closeO do candle em processamento
close[0]Também o do candle em processamento
close[1]O do candle imediatamente anterior
close[2]O de dois candles atrás

Se três fechamentos consecutivos em dados diários forem 100, 103 e 101, no terceiro candle close vale 101, close[1] vale 103 e close[2] vale 100.

Nesse caso, close - close[1] é 101 - 103, ou seja, −2. Essa é a diferença entre dois fechamentos consecutivos. Já close - open compara abertura e fechamento do mesmo candle. Os dois cálculos respondem a perguntas diferentes.

A consulta ao histórico mede a distância em candles, não em dias do calendário. Em dados diários de mercado, um fim de semana ou um dia sem negociação pode fazer o candle anterior estar vários dias atrás.

Seus próprios valores também podem ter histórico

O histórico dos preços internos já está disponível. Para consultar também os valores anteriores de um cálculo próprio, declare a variável como Series:

midpoint: Series[float] = (high + low) / 2

A parte depois dos dois-pontos é uma anotação de tipo. float indica um número que pode conter uma parte fracionária. Series[float] também solicita ao ambiente de execução que preserve o histórico da variável por candle.

A atribuição continua acontecendo em todos os candles. midpoint é o valor calculado agora; midpoint[1] é o valor armazenado no candle anterior. O nome Series deve ser importado do módulo pynecore.

Dois tipos de variação no gráfico

Crie o arquivo history_change.py na pasta scripts do projeto:

"""
@pyne edge
"""
from pynecore import Series
from pynecore.lib import close, color, high, low, plot, script


@script.indicator("Changes Between Candles", overlay=False)
def main():
    midpoint: Series[float] = (high + low) / 2
    close_change = close - close[1]
    midpoint_change = midpoint - midpoint[1]
    plot(close_change, "Close change", color=color.blue)
    plot(midpoint_change, "Midpoint change", color=color.orange)

Salve, escolha Run Pyne code e selecione os dados demo. Duas linhas aparecem em um painel separado. A azul mostra a variação do fechamento; a laranja, a variação do ponto médio. Um ponto positivo significa que o valor aumentou em relação ao candle anterior.

Ao lado do programa history_change.py, o gráfico do PyneIDE mostra duas linhas de variação.
As variações do fechamento e do ponto médio calculado entre candles, em um painel separado.

Passe o ponteiro sobre um candle. Os valores do gráfico sempre correspondem ao instante sob o ponteiro; você não precisa selecionar esse instante separadamente no arquivo.

O que acontece no primeiro candle?

O primeiro candle não tem um candle anterior no arquivo de dados. Nele, close[1] é um valor ausente: na. A abreviação vem de “not available”.

Um preço ausente não é zero. O resultado de close - close[1] também fica ausente; por isso, o programa não desenha uma variação válida no primeiro candle. Esse resultado está correto: não podemos calcular a diferença entre dois candles com apenas um.

A chamada na(value) verifica se um valor está ausente. Você aprenderá a trabalhar com condições no capítulo Condições e marcações. Até lá, não tente corrigir o ponto ausente no começo do gráfico tratando-o como um preço zero.

Essa notação não permite acessar candles futuros. close[-1] também não representa o próximo fechamento. Uma decisão só pode usar os dados disponíveis naquela execução.

Tente por conta própria

Modifique a linha azul para comparar o fechamento com o de cinco candles atrás. No título da linha, indique também essa distância de cinco candles.

Antes de executar, decida: em quantos candles iniciais o resultado estará ausente?

Solução do exercício
close_change = close - close[5]
plot(close_change, "Five-candle change", color=color.blue)

Nos cinco primeiros candles, não existe um fechamento de cinco candles atrás. No sexto, já existe: o fechamento do primeiro candle do arquivo de dados.

A linha laranja não muda com essa alteração. Se quiser calcular as duas variações em cinco candles, será preciso alterar também a expressão midpoint[1].

Confira o cálculo

Escolha três candles consecutivos. Anote os fechamentos e calcule à mão a variação de um candle para o segundo e o terceiro. A linha azul deve mostrar os mesmos valores. Se houver diferença, confira primeiro os instantes selecionados e a distância usada na consulta ao histórico.

Exercício extra: um valor preservado no lugar do histórico

Você também pode usar um único valor anterior armazenando-o para o próximo candle. É para isso que serve uma variável Persistent, apresentada no capítulo O que o programa guarda. Você pode resolver este exercício depois de ler esse capítulo.

Reescreva history_change.py sem usar close[1] nem midpoint[1]. Duas variáveis persistentes devem guardar o fechamento e o ponto médio do candle anterior. As duas linhas devem mostrar os mesmos valores do programa original, e a variação deve continuar ausente no primeiro candle.

Pense na ordem: quando é preciso ler o valor preservado e quando você pode substituí-lo pelo atual?

Solução do exercício

Substitua a importação de Series por Persistent:

from pynecore import Persistent

Acrescente o nome na à importação de pynecore.lib. Mantenha a marcação no início do arquivo e as configurações do indicador, e reescreva a função main() assim:

def main():
    previous_close: Persistent[float] = na
    previous_midpoint: Persistent[float] = na
    midpoint = (high + low) / 2
    close_change = close - previous_close
    midpoint_change = midpoint - previous_midpoint
    plot(close_change, "Close change", color=color.blue)
    plot(midpoint_change, "Midpoint change", color=color.orange)
    previous_close = close
    previous_midpoint = midpoint

O valor inicial das duas variáveis preservadas é na, pois ainda não existe preço anterior no primeiro candle. Por isso, a primeira diferença também fica ausente. No fim da função, armazenamos os valores atuais; no próximo candle, eles servirão de base para o cálculo.

Se colocar a linha previous_close = close antes da subtração, você subtrairá o fechamento atual dele mesmo, obtendo zero. Na solução com persistência, você precisa cuidar da ordem das atualizações.

As duas soluções funcionam para consultar um único candle anterior. A versão com colchetes é mais curta e também permite acessar diretamente valores de vários candles atrás. Essas duas variáveis persistentes guardam apenas os últimos preços armazenados.

Execute as duas versões com os mesmos dados de demonstração e compare as duas linhas em alguns candles selecionados.