O tempo e os candles anteriores
Entenda a execução candle a candle e calcule variações com base em valores anteriores.
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ão | Qual fechamento representa? |
|---|---|
close | O 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) / 2A 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.

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 PersistentAcrescente 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 = midpointO 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.