Bucles dentro de una vela
Calcula una media móvil con tu propio bucle y compárala con la función incorporada.
El entorno de ejecución recorre la secuencia de velas. Dentro de una sola vela puedes necesitar repetición: por ejemplo, para sumar los últimos cinco cierres. Para eso sirven los bucles.
for y range
for offset in range(5):
total += close[offset]Con range(5), el bucle asigna sucesivamente a offset los valores 0, 1, 2, 3 y 4. El 5 no está incluido. La línea sangrada se ejecuta una vez con cada valor.
Así, close[offset] representa primero el cierre actual y después los de una, dos, tres y cuatro velas antes. Sumamos exactamente cinco valores.
Debes poner total a cero antes del bucle. Es un resultado intermedio del cálculo de una vela, no un contador conservado entre velas.
range(1, 5) produce otra secuencia: 1, 2, 3, 4. Incluye el inicio y excluye el final. Si omites el inicio, empieza en cero.
Una media móvil escrita a mano
Crea manual_average.py:
"""
@pyne edge
"""
from pynecore.lib import close, color, input, plot, script, ta
@script.indicator("Manual Average Check", overlay=False)
def main(
length: int = input.int(5, title="Length", minval=1, maxval=100),
):
total = 0.0
for offset in range(length):
total += close[offset]
manual_average = total / length
builtin_average = ta.sma(close, length)
difference = manual_average - builtin_average
plot(difference, "Difference", color=color.blue)Ejecútalo con los datos de demostración. La línea muestra la diferencia entre tu media y la SMA incorporada. Después del calentamiento debe estar en cero o muy cerca, debido a la representación numérica.

No dibujamos dos líneas superpuestas porque sería difícil detectar diferencias pequeñas. La diferencia muestra directamente si los cálculos coinciden.
¿Qué hace una ejecución?
Con longitud cinco, el orden es:
totalpasa a cero.- El bucle añade el cierre actual y los cuatro anteriores.
- Dividimos la suma entre cinco.
- Calculamos también la SMA incorporada y obtenemos la diferencia entre ambos resultados.
- Dibujamos un punto en la línea de diferencia.
Después, el entorno pasa a la siguiente vela. Allí total vuelve a cero y el bucle suma los cinco valores correspondientes a la nueva vela.
Si cambiaras total a Persistent, la siguiente vela continuaría desde la suma anterior. En cada vela añadirías otros cinco valores al resultado previo y ya no calcularías la media de la ventana actual.
El historial ausente
En las primeras cuatro velas falta al menos un cierre para la ventana de cinco. Un na en la suma hace que tu media también esté ausente. La SMA de cinco tampoco es válida hasta la quinta vela.
Todos los cierres son válidos en los datos de demostración del libro. Si una fuente tiene ausencias también en la parte central, ta.sma puede tratarlas de forma distinta de una suma sencilla que recorre desplazamientos de velas. Por eso comprobamos el ejemplo con los datos indicados aquí.
¿Cuántas repeticiones pides?
Con una ventana de cien velas hacemos cien sumas por vela. Para dos mil velas son doscientas mil iteraciones.
La función ta.sma resuelve esta tarea habitual con un cálculo del entorno diseñado para ella. El bucle propio sirve aquí para comprender y comparar. Usa la función incorporada si hace lo que necesitas.
El final del bucle debe ser conocido y estar limitado. El máximo del input también limita la tarea que puede solicitar el usuario dentro de una vela.
break y continue
break termina el bucle. continue omite lo que queda de la iteración actual y pasa a la siguiente.
Úsalos con cuidado en una ventana de media. Si sumas tres valores y te detienes, no puedes dividir entre cinco como si hubieras sumado cinco. Las omisiones cambian el significado del cálculo.
Pruébalo por tu cuenta
Ajusta la longitud a tres. Anota para una vela los desplazamientos usados en el bucle y sus tres precios. Después modifica el programa para representar también tu media y la incorporada en modo superpuesto, además de calcular la diferencia.
Solución del ejercicio
Los desplazamientos son 0, 1 y 2. El decorador necesita overlay=True y, después del cálculo:
plot(manual_average, "Manual average", color=color.blue, linewidth=2)
plot(builtin_average, "Built-in average", color=color.orange)Elimina el dibujo de la diferencia de esta vista. Una línea alrededor de cero y medias al nivel del precio se leen mal en una misma escala. Puedes conservar el panel original de diferencia en otra versión para comprobar los cálculos.
Busca una ventana desplazada
Piensa qué cambiaría con range(1, length + 1). Seguiría habiendo cinco elementos, pero se excluiría la vela actual y se incluiría la de cinco velas antes. Sería la ventana de la vela anterior, no la actual.