これまでは、平均の長さを試すためにソースコード内の数値を書き換えていました。今度はこの値を指標の設定項目にします。同じプログラムを、異なる長さで動かせるようになります。

入力とは何か

入力(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は最小値と最大値です。長さ0では平均のウィンドウとして意味を持たないので、範囲から除きます。

プログラム全体

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の開き括弧の後で、パラメーターを複数行に分けています。):で一覧を閉じ、関数の本体を始めます。その下の計算と描画は、4個のスペースで字下げします。

入力の行末のコンマは、さらにパラメーターを加えられる形にしています。1つだけでも使えます。字下げされた2つの部分は役割が異なります。括弧内は入力の指定、括弧の後は実行する文です。

デモデータで実行してください。最初は20本の平均が青い線になります。

Inputs画面を開く

  1. adjustable_average.pyをアクティブにします。
  2. エディター右上、ファイルのタブの横のツールバーにある歯車をクリックします。ポインターを置くと**Edit Inputs…**と表示されます。
  3. 開いた画面でAverage lengthを探します。
  4. 値を5にし、Saveをクリックします。

左のPyneビューのScriptsからも開けます。adjustable_average.pyを右クリックし、**Edit Inputs…**を選んでください。開いたコード上の右クリックメニューにもあります。

adjustable_average.pyの横に、Average length欄とSaveボタンを備えたInputs画面が開いている。
Average lengthは、PyneIDEのInputs画面で変更できます。

Saveを押すと、PyneIDEは保存した設定で開いているチャートを自動的に再計算します。更新を待つと、青い線は5本の平均になります。

ソースの既定値は20のままです。Inputsで保存した5が、このプロジェクトでの値を上書きします。

今度は50にして保存します。同じ期間で、価格変化に対する線の反応を比べてください。チャートの表示期間を動かすだけでは、プログラムの入力値は変わりません。

設定はどこに保存されるか

プログラムの横にある同名の.tomlファイルに保存されます。この例ではadjustable_average.tomlです。

TOMLはテキストの設定形式です。PyneIDEが管理するので、練習ではInputs画面を使うだけで十分です。ファイルを開くと、長さに関する部分は次のようになっています。

[inputs.length]
value = 5

ここでの角括弧は設定グループを表します。履歴の章の参照とは異なります。別のファイルで、別の言語のルールに従って使われています。

コード内のパラメーター名と画面のタイトルも別です。ファイル内はlength、画面上はAverage lengthです。動作で使うのは、コード内の名前です。

ソースで入力名を変更すると、元の名前で保存した値は、新しい入力の設定にはなりません。Inputsを開き直して値を確認してください。プログラムをコピーするとき、保存済みの設定も残したい場合にだけ、隣の.tomlもコピーします。

既定値と実際の値

既定値を20から30に書き換えても、すでに5を保存していれば、実行には5が使われることがあります。保存済みの上書き設定が優先されます。

結果を記録するときは、実際の入力値を残してください。ソースの既定値だけでは、実行時の全設定は分かりません。

自分で試す

長さの入力をもう1つ追加してください。短期平均の既定値は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)

入力は別々に変更できます。この範囲指定だけでは、短期が長期より短いという関係は保証されません。別途確認が必要です。最終プロジェクトで扱います。

保存を確認する

長さを1にしてください。1本のSMAはその足の終値なので、線は終値を通るはずです。その後20に戻します。ファイルを開き直して、画面に保存済みの20が表示されるか確認してください。