Agora vamos desenhar o preço de abertura junto com o de fechamento. Para isso, ampliaremos o programa do capítulo anterior: vamos importar um novo dado da biblioteca e acrescentar outra chamada de desenho ao código.

Antes de modificar o programa, vamos examinar suas linhas para entender a função de cada uma.

O código é uma descrição precisa

Em um programa, você dá instruções ao computador. Por exemplo: “Use o preço de fechamento do candle e mostre-o como uma linha azul.” Para isso, o computador espera nomes e sinais de pontuação exatos.

Em Pyne code, escrevemos essas instruções com a sintaxe Python. Os parênteses das chamadas de função, os dois-pontos e a indentação das linhas fazem parte dessa sintaxe. Nas próximas seções, você conhecerá o papel de cada um.

Abra o arquivo first_chart.py criado no segundo capítulo. Se você mudou o nome do indicador, isso não interfere na explicação a seguir.

A marcação Pyne no início do arquivo

As três primeiras linhas do arquivo:

"""
@pyne edge
"""

As aspas triplas indicam o início e o fim de um bloco de texto. No começo do arquivo, esse bloco também pode conter uma descrição do programa. Python chama esse texto de docstring.

O PyneCore lê a marcação @pyne nesse bloco. Ela informa que o arquivo contém Pyne code e que devem ser aplicadas regras diferentes do comportamento habitual de Python. Antes da execução, o PyneCore transforma o código para permitir, por exemplo, acessar os valores de candles anteriores e preservar o valor de uma variável para o próximo candle. Vamos tratar desses recursos em capítulos próprios.

A marcação @pyne também é válida sozinha. Um arquivo de Pyne code pode começar assim:

"""
@pyne
"""

O que significa edge ao lado da marcação?

edge indica que o programa usa um subconjunto definido e restrito da linguagem Pyne code. @pyne ativa o funcionamento candle a candle; edge determina quais recursos da linguagem e funções podem ser usados. O PyneIDE avisa quando o código ultrapassa esses limites.

Programas marcados com @pyne também podem usar outros recursos e bibliotecas de Python. Já os programas @pyne edge usam os recursos permitidos por Pyne, sem importar bibliotecas Python arbitrárias. Isso permite que sejam processados por ambientes de execução que não oferecem um ambiente Python de uso geral.

Todos os programas completos do livro mantêm a marcação @pyne edge e trabalham dentro desses limites da linguagem.

Escolha os recursos

A próxima linha:

from pynecore.lib import close, color, plot, script

A construção from … import … disponibiliza os nomes listados no programa. Neste exemplo, pedimos quatro recursos da biblioteca pynecore.lib:

  • close: o preço de fechamento do candle atual;
  • color: as cores disponíveis;
  • plot: a exibição de um valor no gráfico;
  • script: a definição do tipo e das configurações básicas do programa.

A vírgula separa os nomes. Letras maiúsculas e minúsculas fazem diferença: close e Close são nomes diferentes.

As linhas em branco ajudam a organizar o código. Com elas, fica mais fácil reconhecer onde termina a lista de recursos e onde começa o programa.

Nome e apresentação do programa

@script.indicator("My First Chart", overlay=True)

Essa linha informa que estamos criando um indicador. O indicador faz cálculos com os dados e exibe algo. Neste exemplo, desenhamos o preço de fechamento.

Entre os parênteses, definimos as configurações do indicador:

  • O texto "My First Chart", entre aspas, é o nome do indicador.
  • overlay=True pede que o desenho apareça no mesmo gráfico dos candles.

True representa verdadeiro. Seu oposto é False. Se você definir overlay como False, o indicador aparecerá em um painel separado. Vamos usar isso no capítulo sobre cálculos próprios.

Onde o cálculo acontece

def main():
    plot(close, "Close", color=color.blue, linewidth=2)

def marca o início de uma função. Uma função é uma sequência de operações com um nome. Aqui, seu nome é main.

O PyneCore executa o corpo de main() nos candles dos dados. Esse é o ponto de entrada do nosso programa. Depois dos parênteses, há dois-pontos; a linha abaixo, deslocada para a direita, pertence ao corpo da função.

A indentação indica quais linhas pertencem ao mesmo bloco. Usamos quatro espaços por nível de indentação. No início da linha, pressione Tab: com as configurações padrão do PyneIDE, isso insere quatro espaços de indentação de uma só vez. Shift + Tab recua a linha em um nível. O Visual Studio Code também costuma indentar automaticamente uma nova linha quando você pressiona Enter depois de uma linha terminada em dois-pontos.

O que pedimos a plot?

plot(...) é uma chamada de função. Entre os parênteses, fornecemos os valores e as configurações necessários ao seu funcionamento:

  • close: o valor a exibir;
  • "Close": o nome do desenho;
  • color=color.blue: a cor azul;
  • linewidth=2: a espessura da linha definida como 2.

Nos dois primeiros valores, a ordem determina o papel de cada um. color= e linewidth= informam pelo nome qual configuração está sendo passada. Chamamos essas configurações de parâmetros.

O ponto de color.blue indica que estamos usando a cor blue, pertencente a color. No código, esse ponto faz parte do acesso ao nome; não o substitua por vírgula.

Desenhe duas linhas

Usamos o nome close para o preço de fechamento. O preço de abertura fica disponível pelo nome open.

Crie uma cópia do arquivo chamada two_lines.py na pasta scripts. Assim, você preserva o exemplo do segundo capítulo. Na cópia:

  1. Acrescente open aos recursos importados.
  2. Renomeie o indicador para "Open and Close".
  3. Acrescente uma segunda chamada de plot ao corpo de main().

O programa completo:

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


@script.indicator("Open and Close", overlay=True)
def main():
    plot(close, "Close", color=color.blue, linewidth=2)
    plot(open, "Open", color=color.orange, linewidth=2)

Antes de executar, tente prever onde as duas linhas vão encontrar os candles. Salve o arquivo e clique em Run Pyne code. Use os mesmos dados de exemplo de antes.

Ao lado do código de two_lines.py, o gráfico de preços DEMO mostra linhas separadas para Close e Open.
Duas chamadas de plot, duas linhas: Close mostra o fechamento e Open mostra a abertura no mesmo gráfico.

O que observar?

A linha azul conecta os preços de fechamento dos candles; a laranja conecta os preços de abertura. Os desenhos também receberam nomes: Close e Open. O nome ajuda a identificá-los mesmo que você altere as cores depois.

As duas chamadas de plot começam com a mesma indentação de quatro espaços, pois pertencem à mesma função main().

Se aparecer um erro sob open, confira se você o acrescentou à linha de importação. Para usar um recurso novo, é preciso disponibilizar seu nome.

Comentários no código

Uma linha que começa com um único # é um comentário:

    # Show the opening price of each candle.
    plot(open, "Open", color=color.orange, linewidth=2)

O comentário não executa nenhuma operação. Você pode usá-lo para descrever o objetivo de um passo, para si ou para quem ler o código depois. Os comentários dos exemplos estão em inglês; as explicações do livro estão em português.

Você também pode escrever um comentário no fim de uma instrução:

    plot(open, "Open", color=color.orange, linewidth=2)  # Show the opening price.

Nesse caso, a chamada plot(...) é executada. O texto a partir do # até o fim da linha é um comentário, ignorado pelo ambiente de execução. Deixamos dois espaços entre o código e # para facilitar a leitura.

Tente por conta própria

Crie uma terceira linha que mostre a máxima dos candles. O nome desse dado é high. Use "High" como nome do desenho e color.green como cor.

Pense nos dois lugares em que precisa ampliar o programa. Antes de executar, faça uma previsão: o valor High pode ficar abaixo da abertura ou do fechamento do próprio candle?

Solução do exercício

O nome high também deve ser acrescentado à linha de importação:

from pynecore.lib import close, color, high, open, plot, script

Acrescente esta linha ao corpo de main(), com a mesma indentação das outras duas chamadas:

    plot(high, "High", color=color.green, linewidth=2)

A máxima de um candle é pelo menos igual à abertura e ao fechamento. Por isso, o ponto High não pode ficar abaixo de nenhum dos dois no candle correspondente. Interprete os segmentos que conectam os pontos sempre na posição do candle correto.

Confira sua alteração

Examine o programa com três linhas. Consegue encontrar os dados importados, o nome do indicador e as chamadas de desenho? Confira se todos os dados novos usados aparecem na linha de importação e se as três chamadas têm a mesma indentação.

Antes de fazer cálculos próprios com os preços, vamos ver como o PyneIDE ajuda a usar as funções.