Do estado ao evento: cruzamentos
Distinga estar acima da média do instante em que o preço passa para cima dela.
Se o preço ficar acima da média por dez candles, close > average poderá ser verdadeiro dez vezes. Para marcar apenas o evento em que o preço passa de baixo para cima da média, você também precisa da relação no candle anterior.
Uma situação e seu início
Suponha que a média seja 100 tanto agora quanto no candle anterior. O fechamento anterior foi 99 e o atual é 101. No candle atual, o preço está acima da média e também a cruzou em relação ao candle anterior.
Se o próximo fechamento for 102, o preço continuará acima da média. Porém, não haverá um novo cruzamento para cima, pois no candle anterior ele já estava acima dela.
ta.crossover(first, second) é verdadeiro quando o primeiro valor está acima do segundo agora e, na execução anterior, estava abaixo ou era igual a ele. ta.crossunder é o equivalente para o cruzamento para baixo.
Uma igualdade atual ainda não é um cruzamento. Se o primeiro valor apenas atingir o segundo, a condição > não será verdadeira. Já uma igualdade no candle anterior permite que a passagem atual para cima seja um cruzamento.
Cruzamento de duas médias móveis
Vamos continuar com as duas médias do capítulo Médias móveis. A mais curta e rápida será azul; a mais longa e lenta, laranja. Um triângulo verde marca o cruzamento da média rápida para cima; um vermelho, para baixo.
Crie o arquivo cross_signals.py:
"""
@pyne edge
"""
from pynecore.lib import close, color, input, location, plot, plotshape, script, shape, ta
@script.indicator("Average Crossings", overlay=True)
def main(
fast_length: int = input.int(5, title="Fast length", minval=1, maxval=200),
slow_length: int = input.int(20, title="Slow length", minval=1, maxval=200),
):
fast_average = ta.sma(close, fast_length)
slow_average = ta.sma(close, slow_length)
crosses_up = ta.crossover(fast_average, slow_average)
crosses_down = ta.crossunder(fast_average, slow_average)
plot(fast_average, "Fast average", color=color.blue, linewidth=2)
plot(slow_average, "Slow average", color=color.orange, linewidth=2)
plotshape(crosses_up, "Cross up", style=shape.triangleup,
location=location.belowbar, color=color.green)
plotshape(crosses_down, "Cross down", style=shape.triangledown,
location=location.abovebar, color=color.red)Execute com os dados de demonstração e os valores padrão 5 e 20. As marcações aparecem apenas nos candles dos cruzamentos. Em um trecho longo no qual a linha azul permanece acima da laranja, você não recebe um novo sinal verde a cada candle.

Por que calcular os cruzamentos em linhas separadas?
ta.crossover e ta.crossunder são executados em cada candle. Assim, a execução anterior de cada chamada corresponde ao candle processado anteriormente.
Se você chamasse o cálculo de cruzamento apenas quando outra condição fosse atendida, o estado anterior da chamada poderia vir de um candle mais antigo. A linha desenhada e a marcação poderiam estar examinando séries temporais diferentes.
Por isso, seguimos a regra do capítulo anterior: calculamos os resultados que usam estado em todos os candles e depois tomamos decisões com os valores prontos.
O aquecimento também aparece aqui
A SMA de vinte só é válida a partir do vigésimo candle. No primeiro valor válido, a SMA de vinte do candle anterior ainda está ausente. Portanto, ainda não é possível determinar um cruzamento com dois candles completos.
A condição precisa dos valores das duas médias tanto no candle atual quanto no anterior.
Não vale substituir na por zero só para produzir um sinal. Uma média zero poderia criar um cruzamento artificial em um ponto em que a média real ainda não pode ser calculada.
O momento dos dados
No livro, executamos os programas em candles históricos já encerrados. Um sinal calculado com o fechamento de um candle diário usa os dados conhecidos no encerramento desse candle.
O fechamento de um candle em formação ainda pode mudar. Um cruzamento observado durante o candle pode desaparecer até seu encerramento. Não confunda isso com a verificação feita em candles fechados.
Um sinal no gráfico histórico não corresponde automaticamente a uma operação executada no mesmo candle. O indicador desenha um sinal; a ordem e o momento de sua execução serão definidos na estratégia.
Tente por conta própria
Crie uma cópia chamada price_crossings.py. Em vez dos cruzamentos entre as duas médias, marque quando o fechamento passa para cima ou para baixo da média lenta. Mantenha a média lenta no gráfico.
Solução do exercício
crosses_up = ta.crossover(close, slow_average)
crosses_down = ta.crossunder(close, slow_average)As marcações usam as duas variáveis lógicas, por isso você não precisa alterar as linhas de plotshape. Convém, porém, mudar os títulos para Price cross up e Price cross down.
Se não usar mais a média rápida, exclua seu cálculo, desenho e input correspondente. Assim, a interface oferece apenas a configuração realmente usada.
Acompanhe um cruzamento
Escolha um candle com uma marcação verde. Confira os valores das duas linhas nesse candle e no anterior. Descreva as duas comparações que tornaram o sinal verdadeiro. Essa verificação também será útil ao conferir uma estratégia.