Agora você vai criar um programa que distingue candles de alta e de baixa. Ele verifica a relação entre abertura e fechamento e mostra o resultado com uma cor e uma marcação.

Verdadeiro ou falso

O resultado da comparação close > open é True se o fechamento for maior que a abertura; caso contrário, é False. Esse é um valor lógico, de tipo bool.

A comparação não altera nenhum dos preços. Apenas responde a uma pergunta.

SinalSignificadoExemplo
>Maiorclose > open
<Menorclose < open
>=Maior ou igualclose >= open
<=Menor ou igualclose <= open
==Igualclose == open
!=Diferenteclose != open

= atribui um valor a uma variável; == compara dois valores. A linha bullish = close > open coloca o resultado da comparação na variável bullish.

Se abertura e fechamento forem iguais, nem close > open nem close < open será verdadeiro. Para completar a decisão, também vamos tratar esse caso.

if, elif e else

A condição depois de if determina se o bloco indentado será executado:

if bullish:
    line_color = color.green
elif bearish:
    line_color = color.red
else:
    line_color = color.gray

Primeiro, verificamos a condição de if. Se for verdadeira, escolhemos verde e ignoramos os demais ramos. Se for falsa, passamos a elif. O bloco de else é executado quando nenhuma condição anterior foi verdadeira.

Cada ramo termina com dois-pontos. Seu conteúdo recebe mais quatro espaços de indentação. Dentro de main(), portanto, a linha de if começa com quatro espaços; a atribuição dentro dela, com oito.

O programa completo

Crie o arquivo candle_conditions.py:

"""
@pyne edge
"""
from pynecore.lib import close, color, location, open, plot, plotshape, script, shape


@script.indicator("Candle Conditions", overlay=True)
def main():
    bullish = close > open
    bearish = close < open
    if bullish:
        line_color = color.green
    elif bearish:
        line_color = color.red
    else:
        line_color = color.gray
    plot(close, "Close", color=line_color, linewidth=2)
    plotshape(bullish, "Bullish candle", style=shape.triangleup,
              location=location.belowbar, color=color.green)

Execute com os dados de demonstração. A cor da linha de fechamento muda de um candle para outro. Triângulos verdes aparecem abaixo dos candles de alta.

O gráfico de candle_conditions.py mostra a linha de fechamento com cores variáveis e marcações de triângulos verdes.
A condição lógica escolhe uma cor e desenha triângulos abaixo dos candles de alta.

O primeiro argumento de plotshape informa quando a marcação deve aparecer. style controla seu formato; location, sua posição em relação ao candle. Aqui, o candle marcado simplesmente fechou acima da própria abertura. A marcação não implica uma ordem de compra.

Também não é preciso decorar os parâmetros: passe o mouse sobre o nome plotshape no código e consulte a ajuda. Os passos estão no capítulo Ajuda enquanto você escreve código, junto com a opção de ir para a definição.

O lugar do cálculo importa

plot e plotshape são executados em todos os candles. Alteramos o valor, a cor ou a condição a desenhar. Assim, a exibição recebe um resultado para cada candle.

A mesma ordem é adequada para a média móvel:

average = ta.sma(close, 20)
above_average = close > average

Primeiro, calculamos a média a cada candle. A condição a usa depois. Não coloque a chamada ta.sma dentro do ramo if bullish:, pois ela só seria executada nos candles de alta.

Enquanto o valor inicial da SMA estiver ausente, a condição close > average não produz um sinal verdadeiro. Se o código precisar reagir especificamente à ausência, use a verificação na(average). average == na não é uma forma adequada de verificar valores ausentes.

Combine várias condições

and é verdadeiro quando os dois lados são verdadeiros. or é verdadeiro quando pelo menos um deles é verdadeiro. not inverte o valor lógico.

strong_bullish = close > open and close > close[1]

Essa condição exige duas coisas ao mesmo tempo: que o candle seja de alta e que seu fechamento esteja acima do fechamento anterior. Um candle de alta ainda pode fechar abaixo do fechamento do candle anterior; por isso, são duas condições diferentes.

and e or usam avaliação de curto-circuito: se a primeira parte já determina o resultado, a segunda não é avaliada. Com and, isso ocorre quando a primeira parte é falsa; com or, quando a primeira é verdadeira. Por isso, execute cálculos que usam estado em linhas separadas e combine os valores lógicos obtidos.

Escolha de valor em uma expressão

Você também pode escolher entre dois valores em uma única expressão:

line_color = color.green if bullish else color.red

Ela escolhe verde se bullish for verdadeiro; caso contrário, vermelho. Também escolheria vermelho quando abertura e fechamento fossem iguais. Se quiser marcar esse caso com cinza, mantenha a decisão completa com três ramos.

Tente por conta própria

Desenhe um triângulo vermelho voltado para baixo acima dos candles de baixa. Preserve a marcação verde. Depois, torne as condições das duas marcações mais restritivas, comparando também com o fechamento anterior.

Solução do exercício
bullish_signal = bullish and close > close[1]
bearish_signal = bearish and close < close[1]
plotshape(bullish_signal, "Bullish signal", style=shape.triangleup,
          location=location.belowbar, color=color.green)
plotshape(bearish_signal, "Bearish signal", style=shape.triangledown,
          location=location.abovebar, color=color.red)

Substitua a chamada original de plotshape verde pelas duas novas chamadas. A escolha da cor continua usando apenas abertura e fechamento do candle. As marcações também passam a comparar com o fechamento anterior.

Encontre um candle sem marcação

Procure um candle de alta que ficou sem marcação verde na versão mais restritiva. Confira sua abertura e o fechamento anterior. Explique em qual parte de and a condição falhou.