变量与自定义计算
根据 K 线数据计算价格区间和中间价,并显示结果。
如果一根 K 线的最高价为 108、最低价为 101,差值就是 7。我们将为每根 K 线计算并绘制这个价格区间。
第二个程序计算两者之间的中间值。两个示例都会使用变量和简单算术。
一根 K 线代表什么?
一根 K 线汇总一个时间段的数据。时间段的长度由时间周期决定。例如,在一小时数据中,一根 K 线对应一小时。
你会遇到五项基本数据:
open:该时间段的开盘价;high:该时间段的最高价;low:该时间段的最低价;close:该时间段的收盘价;volume:该时间段的成交量,单位由数据源决定。
英文名称的首字母组成 OHLCV。本书最初的示例使用已经收盘的 K 线示例数据。
close 始终表示程序当前处理的 K 线收盘价。处理下一根时,它就表示下一根的收盘价。其他基本数据也是如此。
一点历史:日本蜡烛图从何而来?
蜡烛图的根源可以追溯到 18 世纪日本的稻米市场。在当地形成的价格分析方法基础上,19 世纪逐渐发展出蜡烛图。Steve Nison 于 1991 年出版 Japanese Candlestick Charting Techniques,将它介绍给更广泛的西方读者。
蜡烛较粗的“实体”显示开盘价与收盘价之间的部分,细长的“影线”则标出该时间段的最高价和最低价。
历史背景与图示:AAII Journal(英文)。
计算价格区间
最高价为 108、最低价为 101 时,价格经过的区间宽度为 7:
108 − 101 = 7
代码写法是:
candle_range = high - lowhigh - low 是一个表达式:程序对它求值,得到结果。- 表示减法。
candle_range 是变量名。= 将右侧表达式的结果赋给它,这项操作称为赋值。
可以把这一行读成:“计算 high 与 low 的差,把结果叫作 candle_range。”后面的程序行就能通过这个名称使用结果。
选择容易理解的名称
candle_range 表明数值是一根 K 线的区间。像 x 这样的名称,对阅读代码帮助较小。
本书使用小写英文变量名,单词之间以下划线分隔。名称不能以数字开头,也不能包含空格。candle_range 与 Candle_range 是两个不同名称。
为什么建议使用英文字母、数字和下划线命名?
语言关键字和 Pyne 库名称都建立在英文单词上,例如 def、close 和 plot。英文变量名与它们一致,也便于不懂中文的读者理解源码。当你把程序交给别人,或与他人合作时,这尤其有用。
Pyne code 允许变量名使用重音字母和其他非英文字母。因此,使用英文字母、数字和下划线命名是一项建议,而非语言限制。这种名称更容易在不同语言的键盘上输入,也方便国际交流。本书因此统一采用这种写法。
创建单独面板的指标
在 scripts 文件夹创建 candle_range.py,写入以下程序:
"""
@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)main() 第一行计算结果,第二行通过 candle_range 将结果传给 plot。赋值必须先于值的使用。
overlay=False 要求单独面板。这样,区间就能使用自己的刻度:比如 7 的区间宽度与 100 左右的价格,不是同一数量级。
保存程序,用相同演示数据运行。

如何阅读结果?
较高的点对应更大的价差,较低的点对应更小的区间。计算使用整根 K 线的最高价和最低价,包括影线。
上涨和下跌的 K 线可以具有相同区间,所以这个值无法告诉你价格变化方向。high 至少与 low 一样大,因此数据正确时,结果不会为负。
下一根 K 线上,变量会怎样?
每处理一根 K 线,程序都会重新执行两个步骤:
- 根据该 K 线的
high和low计算candle_range。 plot在该 K 线的位置显示这个值。
例如:
- 第一根:
high= 108,low= 101,因此candle_range= 7。 - 第二根:
high= 110,low= 106,因此candle_range= 4。 - 第三根:
high= 109,low= 103,因此candle_range= 6。
图中就会得到分别对应 7、4、6 的三个点。每根 K 线上,变量都接收当前计算的结果。
访问之前 K 线的值和保留状态,将在后面介绍。
加、乘、除运算
代码中使用以下符号进行简单计算:
+:加法;-:减法;*:乘法;/:除法。
乘除先于加减执行。可以用括号指定哪些部分先算。
价格区间的中点是:
midpoint = (high + low) / 2先把两个价格相加,再除以二。high = 108、low = 101 时,中点为 104.5。
代码中的小数点写作 104.5,与通常的中文小数写法相同。不要改为逗号:逗号在代码中有其他用途,例如分隔函数参数。
绘制中间价
创建 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)这里再次使用 overlay=True,因为我们希望中间价与 K 线共享价格刻度。

运行后选一根 K 线,查看该位置的线条点。它在整根 K 线(包括影线)价格区间的中间。这可能不同于实体中点,因为实体由开盘价和收盘价决定。
为什么括号很重要?
下面两个表达式描述不同的计算:
(high + low) / 2
high + low / 2第二行先将 low 除以二,再加上 high。用上面的 108 和 101 计算,会得到 158.5,这并不是两者的中点。
两个表达式的语法都正确,结果却不同。选一个可以手算的例子,就能快速检查代码是否表达了原本的意图。
自己试一试
绘制 K 线实体带方向的变化:用收盘价减去开盘价。
- 文件名为
candle_change.py。 - 指标标题为
"Candle Change",显示在单独面板。 - 计算结果命名为
candle_change。 - 图形名称为
"Change"。
运行前,计算三种情况的预期结果:
open= 100,close= 104;open= 100,close= 97;open= 100,close= 100。
参考答案
三个结果为 4、−3 和 0。正值表示收盘价更高,负值表示更低,零表示开盘价和收盘价相同。
"""
@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)比较三个程序
依次打开计算区间、中间价和变化的程序。它们都根据 OHLC 数据计算一个变量,并在下一行绘制。数据由程序逐根 K 线处理。差别在于计算公式和 overlay 设置。
下一章将比较两根 K 线的值:我们会学习如何访问上一根 K 线的数据。