El tiempo y las velas anteriores
Comprende la ejecución vela a vela y calcula variaciones a partir de valores anteriores.
En el capítulo anterior calculaste valores con los datos de una sola vela. Para calcular la variación del cierre hacen falta dos: la actual y la anterior. En este capítulo establecerás esa relación.
El programa es el mismo; la vela cambia
Cuando ejecutas el programa con los datos de demostración, PyneCore recorre las velas en orden temporal. main() trabaja con la primera, después con la segunda y así sucesivamente. En cada ejecución, close representa el cierre de la vela que se está procesando.
Por eso una sola llamada plot(close, "Close") puede dibujar una línea completa. Cada ejecución aporta un punto; la secuencia de velas produce toda la línea.
La línea midpoint = (high + low) / 2 del capítulo anterior también vuelve a ejecutarse en cada vela. La asignación recalcula su punto medio. El nombre de la variable permanece; su valor puede cambiar.
El entorno de ejecución garantiza el orden de procesamiento. No necesitas escribir un bucle para recorrer todo el gráfico.
Mira hacia atrás con corchetes
close[1] es el cierre de una vela antes. El número entre corchetes indica cuánto debemos retroceder.
| Expresión | ¿A qué cierre se refiere? |
|---|---|
close | Al de la vela procesada |
close[0] | También al de la vela procesada |
close[1] | Al de una vela antes |
close[2] | Al de dos velas antes |
Si tres cierres diarios consecutivos son 100, 103 y 101, en la tercera vela close vale 101, close[1] vale 103 y close[2] vale 100.
En este caso, close - close[1] es 101 - 103, es decir, −2. Es la diferencia entre cierres consecutivos. close - open compara apertura y cierre de la misma vela. Son cálculos que responden a preguntas distintas.
El retroceso se mide en velas, no en días naturales. En datos diarios, un fin de semana o un festivo de mercado puede hacer que la vela anterior corresponda a varios días antes.
Tus valores también pueden tener historial
El historial de los precios incorporados ya está disponible. Si quieres consultar valores anteriores de tu propio cálculo, márcalo como variable Series:
midpoint: Series[float] = (high + low) / 2La parte después de los dos puntos es una anotación de tipo. float indica un número que admite parte fraccionaria. Series[float] también pide al entorno que conserve el historial de la variable vela a vela.
La asignación sigue ejecutándose en cada vela. midpoint es el valor calculado actual y midpoint[1] es el que se guardó en la vela anterior. Debes importar Series desde el módulo pynecore.
Dos variaciones en el gráfico
Crea history_change.py en la carpeta scripts del proyecto:
"""
@pyne edge
"""
from pynecore import Series
from pynecore.lib import close, color, high, low, plot, script
@script.indicator("Changes Between Candles", overlay=False)
def main():
midpoint: Series[float] = (high + low) / 2
close_change = close - close[1]
midpoint_change = midpoint - midpoint[1]
plot(close_change, "Close change", color=color.blue)
plot(midpoint_change, "Midpoint change", color=color.orange)Guárdalo y elige Run Pyne code y los datos demo. Aparecen dos líneas en un panel separado. La azul muestra la variación del cierre; la naranja, la del punto medio. Un punto positivo indica que el valor aumentó respecto a la vela anterior.

Sitúa el puntero sobre una vela. Los valores del gráfico siempre corresponden al instante bajo el puntero; no necesitas seleccionar ese momento en el archivo.
¿Qué ocurre en la primera vela?
La primera vela no tiene una vela anterior en el archivo de datos. Ahí close[1] es un valor ausente: na. La abreviatura viene de «not available».
Un precio ausente no es cero. El resultado de close - close[1] también está ausente, así que el programa no dibuja una variación válida en la primera vela. Es lo correcto: no podemos calcular la diferencia entre dos velas a partir de una sola.
Con na(value) puedes comprobar si falta un valor. Aprenderás a manejar condiciones en Condiciones y marcas. Hasta entonces, no intentes corregir el punto ausente del principio del gráfico tratándolo como un precio cero.
Esta notación no permite acceder a velas futuras. close[-1] tampoco significa el siguiente cierre. Solo se pueden usar para una decisión los datos disponibles en esa ejecución.
Pruébalo por tu cuenta
Modifica la línea azul para comparar el cierre actual con el de cinco velas antes. Indica también esa distancia en el título de la línea.
Antes de ejecutarlo, decide: ¿en cuántas velas iniciales faltará el resultado?
Solución del ejercicio
close_change = close - close[5]
plot(close_change, "Five-candle change", color=color.blue)En las cinco primeras velas no existe un cierre de cinco velas antes. En la sexta sí: el cierre de la primera vela del archivo.
La línea naranja no cambia. Para calcular ambas variaciones a cinco velas, también debes modificar midpoint[1].
Comprueba el cálculo
Elige tres velas consecutivas. Anota sus cierres y calcula a mano la variación de una vela para la segunda y la tercera. La línea azul debe mostrar los mismos valores. Si hay diferencias, comprueba primero los instantes seleccionados y el número de velas de retroceso.
Ejercicio adicional: conservar un valor en lugar de usar el historial
También puedes utilizar un único valor anterior guardándolo para la siguiente vela. Para eso sirve Persistent, que conocerás en Lo que recuerda el programa. Puedes resolver este ejercicio después de leer ese capítulo.
Reescribe history_change.py sin utilizar close[1] ni midpoint[1]. Dos variables persistentes deben conservar el cierre y el punto medio de la vela anterior. Las líneas deben mostrar los mismos valores que el programa original y la variación debe seguir ausente en la primera vela.
Piensa en el orden: ¿cuándo debes leer el valor guardado y cuándo puedes sustituirlo por el actual?
Solución del ejercicio
Sustituye la importación de Series por Persistent:
from pynecore import PersistentAñade na a la importación de pynecore.lib. Conserva la marca inicial y los ajustes del indicador, y modifica main() así:
def main():
previous_close: Persistent[float] = na
previous_midpoint: Persistent[float] = na
midpoint = (high + low) / 2
close_change = close - previous_close
midpoint_change = midpoint - previous_midpoint
plot(close_change, "Close change", color=color.blue)
plot(midpoint_change, "Midpoint change", color=color.orange)
previous_close = close
previous_midpoint = midpointLas dos variables empiezan con na, porque en la primera vela aún no hay un precio anterior. Por eso la primera diferencia también está ausente. Al final de la función guardamos los valores actuales; en la siguiente vela calcularemos a partir de ellos.
Si colocas previous_close = close antes de la resta, restas el cierre actual de sí mismo y obtienes cero. En la solución persistente debes controlar el orden de actualización.
Ambas soluciones sirven para retroceder una vela. La versión con corchetes es más corta y también permite acceder directamente a valores de varias velas antes. Estas dos variables persistentes conservan únicamente los últimos precios guardados.
Ejecuta ambas versiones con los mismos datos de demostración y compara las líneas en algunas velas.