Até agora, para experimentar outro comprimento de média, você alterava o número no código-fonte. Vamos transformar esse número em uma configuração do indicador. Assim, você poderá executar o mesmo programa com comprimentos diferentes.

O que é um input?

Um input é uma entrada com nome, modificável de fora do programa. O código-fonte define seu tipo, valor padrão e intervalo permitido. O usuário escolhe um valor dentro desses limites.

Nossa entrada se chama length e tem valor padrão 20. A variável length será o comprimento da média móvel. O código também precisa do namespace input, do módulo pynecore.lib.

length: int = input.int(20, title="Average length", minval=1, maxval=200)

Essa linha fica entre os parâmetros de main(). int significa número inteiro: aqui, por exemplo, são válidos 1, 20 ou 200, mas não 2,5. input.int descreve uma entrada de número inteiro.

20 é o valor padrão; Average length, o título exibido na interface. minval e maxval são o menor e o maior valor permitidos. Uma janela de média com comprimento zero não faz sentido, por isso a excluímos.

O programa completo

Crie o arquivo adjustable_average.py:

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


@script.indicator("Adjustable Average", overlay=True)
def main(
    length: int = input.int(20, title="Average length", minval=1, maxval=200),
):
    average = ta.sma(close, length)
    plot(average, "Average", color=color.blue, linewidth=2)

Distribuímos a lista de parâmetros em várias linhas depois do parêntese de abertura de main. ): encerra essa lista e inicia o corpo da função. O cálculo e o desenho abaixo começam com quatro espaços de indentação.

A vírgula no fim da linha do input permite acrescentar outros parâmetros. Ela também pode ser usada com um único parâmetro. As duas partes indentadas têm papéis diferentes: dentro dos parênteses, definimos as entradas; depois deles, vêm as instruções executadas.

Execute o programa com os dados de demonstração. Na primeira execução, a média azul usa vinte candles.

Abra a tela Inputs

  1. Deixe o arquivo adjustable_average.py ativo.
  2. No canto superior direito do editor, na barra de ferramentas ao lado da aba do arquivo, clique no ícone de engrenagem. Ao passar o ponteiro sobre ele, aparece Edit Inputs….
  3. Na tela que abrir, encontre o campo Average length.
  4. Altere seu valor para 5 e clique em Save.

Você também pode abrir essa tela pelo grupo Scripts do painel Pyne, à esquerda: clique com o botão direito em adjustable_average.py e escolha Edit Inputs…. A opção também aparece no menu aberto com o botão direito dentro do código.

Ao lado de adjustable_average.py, a tela Inputs está aberta com o campo Average length e o botão Save.
A entrada Average length pode ser alterada na tela Inputs do PyneIDE.

Ao clicar em Save, o PyneIDE recalcula automaticamente o gráfico aberto com a configuração salva. Aguarde a atualização: a linha azul agora mostra uma média calculada com cinco candles.

O código-fonte continua com 20 como valor padrão. O valor 5 salvo na tela Inputs substitui esse padrão neste projeto.

Agora defina 50 e salve novamente. Compare, no mesmo intervalo, como a linha reage às mudanças de preço. Mover apenas o intervalo visível do gráfico não altera o input do programa.

Onde a configuração é armazenada?

Um arquivo .toml com o mesmo nome, ao lado do programa, armazena as configurações salvas. Neste exemplo, é adjustable_average.toml.

TOML é um formato de configuração em texto. O PyneIDE gerencia esse arquivo, por isso basta usar a tela Inputs neste exercício. Se abrir o arquivo, a parte referente ao comprimento terá esta forma:

[inputs.length]
value = 5

Aqui, os colchetes indicam um grupo de configurações. Esse não é o histórico de candles apresentado no capítulo sobre valores anteriores: estamos em outro arquivo, seguindo as regras de outra linguagem.

O nome do parâmetro no código e seu título na interface também são diferentes. No arquivo, temos length; na tela, Average length. Para o funcionamento do programa, o nome no código é o que importa.

Se você renomear um input no código-fonte, o valor salvo com o nome antigo não será a configuração do novo input. Nesse caso, reabra a tela Inputs e confira o valor. Ao copiar um programa, copie também o arquivo .toml ao lado dele somente se quiser preservar as configurações salvas.

Valor padrão e valor efetivo

Se mudar o padrão de 20 para 30 no código, mas já tiver salvo o valor cinco, a execução poderá usar cinco. A substituição salva tem prioridade.

Por isso, ao descrever um resultado, registre o input efetivamente usado. O padrão visível no código-fonte não descreve, sozinho, todas as configurações da execução.

Tente por conta própria

Adicione um segundo parâmetro de comprimento ao indicador. O padrão da média curta deve ser 5; o da longa, 20. Ambos devem permitir no mínimo 1 e no máximo 200. Desenhe-os com títulos diferentes.

Solução do exercício

A lista de parâmetros de 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),

O corpo:

fast_average = ta.sma(close, fast_length)
slow_average = ta.sma(close, slow_length)
plot(fast_average, "Fast average", color=color.blue, linewidth=2)
plot(slow_average, "Slow average", color=color.orange, linewidth=2)

Os dois inputs podem ser alterados separadamente. Os limites definidos ainda não exigem que o comprimento rápido seja menor que o lento. Essa relação precisa de uma verificação própria; vamos tratar disso no projeto final.

Confira o salvamento

Defina o comprimento como um. A SMA de um candle é o fechamento daquele candle, por isso a linha deve passar pelos fechamentos. Depois, volte para vinte. Ao reabrir o arquivo, confira se a interface mostra o valor vinte que foi salvo.