Hasta ahora cambiabas un número en el código para probar otra longitud de media. Ahora convertirás ese número en un ajuste del indicador. Podrás ejecutar el mismo programa con distintas longitudes.

¿Qué es un input?

Un input es una entrada del programa con nombre, modificable desde fuera del código. El código define su tipo, valor predeterminado y rango permitido. El usuario elige un valor dentro de esos límites.

La entrada actual se llama length y su valor predeterminado es 20. length será la longitud de la media móvil. También necesitamos el espacio de nombres input de pynecore.lib.

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

Esta línea va entre los parámetros de main(). int significa número entero: aquí se permiten 1, 20 o 200, por ejemplo, pero no 2,5. input.int describe una entrada entera.

20 es el valor predeterminado y Average length el título de la interfaz. minval y maxval son el mínimo y el máximo permitidos. Una longitud cero no define una ventana de media válida, por eso la excluimos.

El programa completo

Crea 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)

Distribuimos la lista de parámetros en varias líneas después del paréntesis de apertura de main. ): cierra la lista e inicia el cuerpo de la función. El cálculo y el dibujo de debajo tienen cuatro espacios de sangría.

La coma al final de la entrada permite añadir más parámetros. También se puede usar con uno solo. Las dos partes sangradas tienen funciones distintas: dentro de los paréntesis definimos las entradas; después vienen las instrucciones que se ejecutan.

Ejecuta el programa con los datos de demostración. En la primera ejecución, la media azul utiliza veinte velas.

Abre la interfaz Inputs

  1. Activa el archivo adjustable_average.py.
  2. En la esquina superior derecha del editor, haz clic en el engranaje de la barra junto a la pestaña del archivo. Al pasar el puntero aparece Edit Inputs….
  3. Busca Average length en la interfaz que se abre.
  4. Cambia su valor a 5 y haz clic en Save.

También puedes abrirla desde Scripts en la vista Pyne de la izquierda: haz clic derecho en adjustable_average.py y elige Edit Inputs…. Asimismo está en el menú contextual al hacer clic derecho en el código abierto.

Inputs está abierto junto a adjustable_average.py y muestra Average length y el botón Save.
La entrada Average length se modifica en la interfaz Inputs de PyneIDE.

Al pulsar Save, PyneIDE recalcula automáticamente el gráfico abierto con el ajuste guardado. Espera la actualización: la línea azul mostrará una media de cinco velas.

En el código sigue figurando 20 como valor predeterminado. El 5 guardado en Inputs lo sustituye en este proyecto.

Ahora ajústalo a 50 y guarda de nuevo. Compara la reacción de la línea al precio en el mismo período. Desplazarte a otro período del gráfico no cambia por sí solo el input del programa.

¿Dónde se guarda el ajuste?

Un archivo .toml del mismo nombre, junto al programa, almacena los ajustes guardados. En este ejemplo es adjustable_average.toml.

TOML es un formato de configuración en texto. PyneIDE gestiona el archivo, así que basta con usar Inputs para el ejercicio. Si lo abres, la parte de la longitud tiene este aspecto:

[inputs.length]
value = 5

Los corchetes indican aquí un grupo de ajustes. No es el historial de velas del capítulo sobre valores anteriores: está en otro archivo y sigue las reglas de otro lenguaje.

El nombre del parámetro en el código y su título en la interfaz tampoco son iguales. El archivo contiene length y la interfaz muestra Average length. Para el funcionamiento cuenta el nombre del código.

Si cambias el nombre de un input en el código, el valor guardado para el nombre antiguo no configura la nueva entrada. Vuelve a abrir Inputs y comprueba su valor. Al copiar un programa, copia su .toml solo si también quieres conservar los ajustes guardados.

Valor predeterminado y valor efectivo

Si cambias el valor predeterminado de 20 a 30, pero ya has guardado un cinco, la ejecución puede utilizar cinco. El valor guardado tiene prioridad.

Por eso, al describir un resultado, anota el input efectivo. El valor predeterminado visible en el código no describe por sí solo todos los ajustes de la ejecución.

Pruébalo por tu cuenta

Añade un segundo parámetro de longitud al indicador. La media corta debe tener un valor predeterminado de 5 y la larga de 20. Ambas admiten valores de 1 a 200. Dibújalas con títulos distintos.

Solución del ejercicio

La 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),

El cuerpo:

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)

Las entradas se pueden modificar por separado. Los límites no exigen todavía que la longitud rápida sea menor que la lenta. Esa relación necesita otra comprobación; la veremos en el proyecto final.

Comprueba que se ha guardado

Ajusta la longitud a uno. La SMA de una vela es su cierre, así que la línea debe pasar por los cierres. Después vuelve a veinte. Al abrir de nuevo el archivo, comprueba que la interfaz muestra el veinte guardado.