Variables y cálculos propios
Calcula el rango y el punto medio de las velas y representa los resultados.
Si el máximo de una vela es 108 y su mínimo es 101, la diferencia es 7. Calcularemos y dibujaremos este rango de precios para cada vela.
El segundo programa calcula el punto medio entre los dos precios. Ambos ejemplos utilizan variables y operaciones aritméticas sencillas.
¿Qué representa una vela?
Una vela resume los datos de un período. La temporalidad determina su duración. Por ejemplo, en datos de una hora, cada vela corresponde a una hora.
Encontrarás cinco datos básicos:
open: el precio de apertura del período;high: el precio más alto del período;low: el precio más bajo del período;close: el precio de cierre del período;volume: el volumen del período, en la unidad utilizada por la fuente de datos.
Sus iniciales en inglés forman la abreviatura OHLCV. En los primeros ejemplos trabajamos con datos de ejemplo de velas ya cerradas.
close siempre representa el cierre de la vela que el programa procesa en ese momento. En la siguiente vela usará el cierre de esa otra vela. Lo mismo ocurre con los demás datos básicos.
Un poco de historia: ¿de dónde vienen las velas japonesas?
La representación con velas tiene sus raíces en los mercados japoneses de arroz del siglo XVIII. Los métodos de análisis de precios desarrollados allí dieron lugar a los gráficos de velas en el siglo XIX. Steve Nison los dio a conocer a un público occidental más amplio con su libro Japanese Candlestick Charting Techniques, publicado en 1991.
El «cuerpo», más grueso, muestra la zona entre la apertura y el cierre; las «mechas», finas, señalan el máximo y el mínimo del período.
Contexto histórico e ilustraciones: AAII Journal (en inglés).
Calcula el rango
Si el máximo es 108 y el mínimo 101, el precio ha recorrido un rango de 7 unidades:
108 − 101 = 7
En código lo escribimos así:
candle_range = high - lowhigh - low es una expresión: el programa la evalúa y produce un resultado. - significa resta.
candle_range es el nombre de una variable. = le asigna el resultado de la expresión de la derecha. Esta operación se llama asignación.
Lee la línea así: «Calcula la diferencia entre high y low y llama candle_range al resultado». A partir de ahí puedes utilizar ese valor con ese nombre en el resto del programa.
Elige un nombre claro
candle_range indica que el valor es el rango de una vela. Un nombre como x ayuda menos a entender el código.
En el libro usamos nombres de variables en inglés y minúsculas, con guiones bajos entre palabras. El nombre no puede empezar con un número ni contener espacios. candle_range y Candle_range serían nombres distintos.
¿Por qué usamos nombres en inglés y sin acentos?
Las palabras clave del lenguaje y los nombres de la biblioteca Pyne también se basan en el inglés: por ejemplo, def, close o plot. Los nombres de variables en inglés encajan con ellos y facilitan que personas de distintos países entiendan el código. Esto ayuda si compartes el programa o trabajas en él con otras personas.
Pyne code también permite letras acentuadas y de otros alfabetos en los nombres de variables. Utilizar nombres en inglés y sin acentos es, por tanto, una recomendación. Son más fáciles de escribir con teclados de otros idiomas y facilitan compartir el código en un entorno internacional. Por eso mantendremos este criterio en el libro.
Crea un indicador en un panel separado
Crea candle_range.py en la carpeta scripts y escribe este programa:
"""
@pyne edge
"""
from pynecore.lib import color, high, low, plot, script
@script.indicator("Candle Range", overlay=False)
def main():
candle_range = high - low
plot(candle_range, "Range", color=color.orange, linewidth=2)La primera línea de main() calcula el valor; la segunda lo pasa a plot con el nombre candle_range. La asignación debe ocurrir antes de usar el valor.
overlay=False solicita un panel separado. Así ves el rango en su propia escala: por ejemplo, un rango de 7 unidades y un precio cercano a 100 tienen magnitudes distintas.
Guarda y ejecuta el programa sobre los mismos datos de demostración.

¿Cómo interpretar el resultado?
Los puntos más altos corresponden a diferencias de precio mayores. Los más bajos indican rangos menores. El cálculo utiliza el máximo y el mínimo de toda la vela, incluidas las mechas.
Una vela alcista y una bajista pueden tener el mismo rango, por lo que este valor no revela la dirección del movimiento. high es al menos igual a low, de modo que con datos correctos el resultado no es negativo.
¿Qué hace la variable en la siguiente vela?
El programa repite estos dos pasos en cada vela procesada:
- Calcula
candle_rangecon los valoreshighylowde esa vela. plotrepresenta ese valor en la posición de la vela.
Por ejemplo:
- Primera vela:
high= 108,low= 101, así quecandle_range= 7. - Segunda vela:
high= 110,low= 106, así quecandle_range= 4. - Tercera vela:
high= 109,low= 103, así quecandle_range= 6.
De ahí salen tres puntos en el gráfico, con valores 7, 4 y 6. La variable recibe en cada vela el resultado del cálculo actual.
Más adelante veremos cómo acceder a valores de velas anteriores y conservar estado.
Suma, multiplicación y división
En el código hacemos cálculos sencillos con estos signos:
+: suma;-: resta;*: multiplicación;/: división.
La multiplicación y la división se realizan antes que la suma y la resta. Los paréntesis permiten indicar qué debe calcularse primero.
El punto medio del rango de precios:
midpoint = (high + low) / 2Primero sumamos los precios y dividimos el resultado entre dos. Si high = 108 y low = 101, el punto medio es 104,5.
Fíjate en el punto decimal: el código utiliza 104.5, aunque en un texto en español escribamos 104,5. La coma cumple otras funciones en el código, como separar los parámetros de una función.
Dibuja el punto medio
Crea candle_midpoint.py:
"""
@pyne edge
"""
from pynecore.lib import color, high, low, plot, script
@script.indicator("Candle Midpoint", overlay=True)
def main():
midpoint = (high + low) / 2
plot(midpoint, "Midpoint", color=color.purple, linewidth=2)Volvemos a usar overlay=True. Queremos ver el punto medio en la misma escala de precios que las velas.

Después de ejecutarlo, selecciona una vela y observa el punto de la línea en esa posición. Está en el centro de todo el rango de la vela, incluidas las mechas. Puede diferir del centro del cuerpo, determinado por la apertura y el cierre.
¿Por qué importan los paréntesis?
Estas expresiones describen cálculos distintos:
(high + low) / 2
high + low / 2La segunda línea divide primero solo low entre dos y después suma high. Con 108 y 101 obtendrías 158,5. Eso ya no es el punto medio entre los precios.
Ambas expresiones tienen una sintaxis correcta, pero dan resultados distintos. Un ejemplo calculable a mano permite comprobar rápidamente si has escrito lo que querías.
Pruébalo por tu cuenta
Dibuja la variación con signo del cuerpo de la vela: resta la apertura al cierre.
- El archivo debe llamarse
candle_change.py. - El título del indicador debe ser
"Candle Change"y debe aparecer en un panel separado. - Llama
candle_changeal resultado. - El dibujo debe llamarse
"Change".
Antes de ejecutarlo, calcula el resultado esperado en estos casos:
open= 100,close= 104;open= 100,close= 97;open= 100,close= 100.
Solución del ejercicio
Los resultados son 4, −3 y 0. Un valor positivo significa un cierre más alto; uno negativo, un cierre más bajo; cero indica apertura y cierre iguales.
"""
@pyne edge
"""
from pynecore.lib import close, color, open, plot, script
@script.indicator("Candle Change", overlay=False)
def main():
candle_change = close - open
plot(candle_change, "Change", color=color.blue, linewidth=2)Compara los tres programas
Abre sucesivamente los programas que calculan el rango, el punto medio y la variación. Todos calculan una variable a partir de datos OHLC y la dibujan en la siguiente línea. Procesan los datos vela a vela. Las diferencias están en el cálculo y en overlay.
En el siguiente capítulo compararemos valores de dos velas: veremos cómo acceder a los datos de la vela anterior.