如果一根 K 线的最高价为 108、最低价为 101,差值就是 7。我们将为每根 K 线计算并绘制这个价格区间。

第二个程序计算两者之间的中间值。两个示例都会使用变量和简单算术。

一根 K 线代表什么?

一根 K 线汇总一个时间段的数据。时间段的长度由时间周期决定。例如,在一小时数据中,一根 K 线对应一小时。

你会遇到五项基本数据:

  • open:该时间段的开盘价;
  • high:该时间段的最高价;
  • low:该时间段的最低价;
  • close:该时间段的收盘价;
  • volume:该时间段的成交量,单位由数据源决定。

英文名称的首字母组成 OHLCV。本书最初的示例使用已经收盘的 K 线示例数据。

close 始终表示程序当前处理的 K 线收盘价。处理下一根时,它就表示下一根的收盘价。其他基本数据也是如此。

计算价格区间

最高价为 108、最低价为 101 时,价格经过的区间宽度为 7:

108 − 101 = 7

代码写法是:

candle_range = high - low

high - low 是一个表达式:程序对它求值,得到结果。- 表示减法。

candle_range 是变量名。= 将右侧表达式的结果赋给它,这项操作称为赋值。

可以把这一行读成:“计算 high 与 low 的差,把结果叫作 candle_range。”后面的程序行就能通过这个名称使用结果。

选择容易理解的名称

candle_range 表明数值是一根 K 线的区间。像 x 这样的名称,对阅读代码帮助较小。

本书使用小写英文变量名,单词之间以下划线分隔。名称不能以数字开头,也不能包含空格。candle_range 与 Candle_range 是两个不同名称。

创建单独面板的指标

在 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 左右的价格,不是同一数量级。

保存程序,用相同演示数据运行。

candle_range.py 代码旁,K 线下方显示单独的 Range 面板。
Range 线在单独面板中显示 high 与 low 的差。值越大,表示这根 K 线内的价格区间越宽。

如何阅读结果?

较高的点对应更大的价差,较低的点对应更小的区间。计算使用整根 K 线的最高价和最低价,包括影线。

上涨和下跌的 K 线可以具有相同区间,所以这个值无法告诉你价格变化方向。high 至少与 low 一样大,因此数据正确时,结果不会为负。

下一根 K 线上,变量会怎样?

每处理一根 K 线,程序都会重新执行两个步骤:

  1. 根据该 K 线的 high 和 low 计算 candle_range。
  2. 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 线共享价格刻度。

candle_midpoint.py 旁的图表显示连接各根 K 线中间价的 Midpoint 线。
Midpoint 线标记每根 K 线 high 与 low 之间的中点。

运行后选一根 K 线,查看该位置的线条点。它在整根 K 线(包括影线)价格区间的中间。这可能不同于实体中点,因为实体由开盘价和收盘价决定。

为什么括号很重要?

下面两个表达式描述不同的计算:

(high + low) / 2
high + low / 2

第二行先将 low 除以二,再加上 high。用上面的 108 和 101 计算,会得到 158.5,这并不是两者的中点。

两个表达式的语法都正确,结果却不同。选一个可以手算的例子,就能快速检查代码是否表达了原本的意图。

自己试一试

绘制 K 线实体带方向的变化:用收盘价减去开盘价。

  1. 文件名为 candle_change.py。
  2. 指标标题为 "Candle Change",显示在单独面板。
  3. 计算结果命名为 candle_change。
  4. 图形名称为 "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 线的数据。