此前尝试平均线长度时,你需要修改源码中的数字。现在把这个数字变成指标设置,就能用不同长度运行同一个程序。

什么是 input?

input 是程序中带名称、可从外部调整的输入。源码规定输入类型、默认值和允许范围,用户在其中选择数值。

这次输入名为 length,默认值为 20。length 变量决定移动平均线的长度。代码还需要从 pynecore.lib 模块引入 input 命名空间。

length: int = input.int(20, title="Average length", minval=1, maxval=200)

这一行放在 main() 的参数列表中。int 表示整数,例如这里可以用 1、20 或 200,不能用 2.5。input.int 描述一个整数输入。

20 是默认值,Average length 是界面标题。minval 和 maxval 是允许的最小值与最大值。零长度没有合理的平均窗口含义,因此排除。

完整程序

创建 adjustable_average.py:

"""
@pyne edge
"""
from pynecore.lib import close, color, input, plot, script, ta


@script.indicator("Adjustable Average", overlay=True)
def main(
    length: int = input.int(20, title="Average length", minval=1, maxval=200),
):
    average = ta.sma(close, length)
    plot(average, "Average", color=color.blue, linewidth=2)

我们在 main 的左括号后,将参数列表分成多行。): 结束列表并开始函数体,下方的计算与绘图缩进四个空格。

输入行末尾的逗号便于继续添加参数,即使只有一个参数也允许保留。两个缩进部分的作用不同:括号内定义输入,括号结束后才是要执行的语句。

在演示数据上运行。首次运行时,蓝色平均线使用二十根 K 线。

打开 Inputs 界面

  1. 让 adjustable_average.py 成为当前文件。
  2. 点击编辑器右上角、文件标签附近工具栏的齿轮图标。鼠标悬停时会显示 Edit Inputs…。
  3. 在打开的界面找到 Average length。
  4. 改为 5,然后点击 Save。

也可以从左侧 Pyne 视图的 Scripts 分组打开:右键点击 adjustable_average.py,选择 Edit Inputs…。已打开代码的右键菜单中也有这一项。

adjustable_average.py 旁打开 Inputs 界面,显示 Average length 字段和 Save 按钮。
Average length 输入可在 PyneIDE 的 Inputs 界面调整。

点击 Save 后,PyneIDE 会自动按保存的设置重新计算已打开图表。等待刷新完成,蓝线就会变成五根 K 线的平均值。

源码的默认值仍是 20。在 Inputs 保存的 5 会在当前项目中覆盖它。

现在改为 50 并再次保存。在同一时段比较线条对价格变化的反应。仅拖动图表的可见时段,并不会改变程序的输入。

设置保存在哪里?

程序旁的同名 .toml 文件保存设置。本例中是 adjustable_average.toml。

TOML 是文本配置格式。这份文件由 PyneIDE 管理,练习时用 Inputs 界面就够了。若打开文件,长度对应的部分如下:

[inputs.length]
value = 5

这里的方括号表示设置分组,不是历史值章节讲过的 K 线历史访问:它处于另一种文件中,遵循另一种语言的规则。

代码参数名与界面标题也不一样。文件中是 length,界面上是 Average length。程序执行使用的是代码名称。

如果在源码中重命名输入,旧名称下保存的值不会成为新输入的设置。此时重新打开 Inputs 检查。复制程序时,只有想同时保留已保存设置,才一起复制旁边的 .toml 文件。

默认值与实际值

如果把源码默认值从 20 改为 30,但此前已保存过 5,运行时仍可能使用 5。保存的覆盖值优先。

所以描述结果时,应记录实际输入。源码中可见的默认值本身并不足以说明一次运行的全部设置。

自己试一试

给指标添加第二个长度参数。短平均线默认长度为 5,长平均线为 20。两者最小为 1,最大为 200。分别绘制并设置不同标题。

参考答案

main() 参数列表:

fast_length: int = input.int(5, title="Fast length", minval=1, maxval=200),
slow_length: int = input.int(20, title="Slow length", minval=1, maxval=200),

函数体:

fast_average = ta.sma(close, fast_length)
slow_average = ta.sma(close, slow_length)
plot(fast_average, "Fast average", color=color.blue, linewidth=2)
plot(slow_average, "Slow average", color=color.orange, linewidth=2)

两个输入可分别修改。但这些范围还没有规定快速长度必须小于慢速长度。这个关系需要单独检查,结课项目会处理。

检查保存结果

将长度改为一。单根 K 线的 SMA 就是它自己的收盘价,线应经过各根收盘价。随后改回二十。重新打开文件时,检查界面是否显示保存的二十。