時間と過去のローソク足
ローソク足単位の実行を理解し、過去の値から変化を計算します。
前の章では、1本のローソク足から計算しました。終値の変化を求めるには、現在と1本前の2本が必要です。この章では、両者を関連付けます。
プログラムは同じで、ローソク足が変わる
デモデータでプログラムを実行すると、PyneCoreはローソク足を時間順に処理します。main()は1本目、2本目、その次と順番に動きます。closeは、その都度、処理中のローソク足の終値を表します。
そのため、1つのplot(close, "Close")で線全体を描けます。1回の実行で点を1つ加え、ローソク足の列を通じて1本の線になります。
前の章のmidpoint = (high + low) / 2も、各ローソク足で再実行されます。代入によって、そのローソク足の中間値を計算し直します。変数名は同じでも、値は変わります。
実行環境が処理順を管理するので、チャート全体をたどるためのループを書く必要はありません。
角括弧で過去を参照する
close[1]は、1本前の終値です。角括弧内の数が、何本前まで戻るかを指定します。
| 式 | 参照する終値 |
|---|---|
close | 処理中のローソク足 |
close[0] | 同じく処理中の足 |
close[1] | 1本前の足 |
close[2] | 2本前の足 |
日足で連続する終値が100、103、101なら、3本目ではcloseが101、close[1]が103、close[2]が100です。
このときclose - close[1]は101 - 103、つまり−2です。連続する2つの終値の差を求めています。一方、close - openは、同じローソク足の始値と終値の比較です。2つの計算は、異なる問いに答えています。
さかのぼる単位は暦日ではなく、ローソク足です。日足の市場データでも、週末や休場日があれば、1本前が数日前という場合があります。
自分で計算した値にも履歴を持たせる
組み込みの価格データには、すでに履歴があります。自分の計算結果も過去を参照したい場合は、Series変数にします。
midpoint: Series[float] = (high + low) / 2コロンの後は型の指定です。floatは小数も扱える数値型です。Series[float]は、変数の値をローソク足ごとの履歴として残すことも指定します。
代入は引き続き各ローソク足で行います。midpointは現在の計算値、midpoint[1]は1本前で保存した値です。Seriesはpynecoreモジュールからインポートします。
2種類の変化をチャートに描く
プロジェクトのscriptsにhistory_change.pyを作ってください。
"""
@pyne edge
"""
from pynecore import Series
from pynecore.lib import close, color, high, low, plot, script
@script.indicator("Changes Between Candles", overlay=False)
def main():
midpoint: Series[float] = (high + low) / 2
close_change = close - close[1]
midpoint_change = midpoint - midpoint[1]
plot(close_change, "Close change", color=color.blue)
plot(midpoint_change, "Midpoint change", color=color.orange)保存し、Run Pyne codeを選んで、demoデータで実行します。別パネルに2本の線が現れます。青は終値、オレンジは中間値の変化です。点が正なら、1本前よりその値が上がったことを表します。

ローソク足にポインターを置いてください。チャートの値は、ポインターの位置の時点を示します。ファイル内でその時点を選び直す必要はありません。
最初のローソク足ではどうなるか
データファイルの最初のローソク足には、それ以前の足がありません。その位置のclose[1]は、欠損値のnaです。「not available」の略です。
価格の欠損は0ではありません。close - close[1]の結果も欠損となり、最初の足には有効な変化を描画しません。2本の差を1本から計算できないので、これは正しい結果です。
na(value)で欠損かどうかを調べられます。条件の扱いは条件とマーカーで学びます。それまでは、チャート先頭の欠けた点を、価格0として直そうとしないでください。
この記法で未来の足を参照することはできません。close[-1]も次の終値を表しません。判断には、その実行時点で利用できるデータだけを使います。
自分で試す
青い線を変更し、現在の終値と5本前の終値を比較してください。線の名前にも、5本離れた比較だと分かる名前を付けます。
実行前に、最初の何本で結果が欠損するか考えてください。
解答
close_change = close - close[5]
plot(close_change, "Five-candle change", color=color.blue)最初の5本には、5本前の終値がありません。6本目では、データファイルの1本目の終値を参照できます。
オレンジの線は変わりません。両方を5本前との変化にするには、midpoint[1]も変更します。
計算を確認する
連続する3本を選び、終値を書き出します。2本目と3本目の、1本前からの変化を手計算してください。青い線も同じ値になるはずです。違う場合は、まず選んだ時点と、さかのぼる本数を確認します。
発展課題:履歴の代わりに値を保持する
前の値が1つだけ必要なら、次の足まで保存する方法もあります。そのために使うのがPersistent変数です。プログラムが覚えておくもので学んでから、この課題に戻ってもかまいません。
history_change.pyを、close[1]もmidpoint[1]も使わない形に書き換えます。2つの永続変数に、前の終値と中間値を保持してください。2本の線の値は元のプログラムと同じにし、最初の足の変化は引き続き欠損させます。
どの順番ならよいか考えてください。保持した値をいつ読み、現在の値でいつ上書きすべきでしょうか。
解答
SeriesのインポートをPersistentに置き換えます。
from pynecore import Persistentpynecore.libからのインポートにはnaを加えます。ファイル冒頭の印と指標の設定は残し、main()を次のように書き換えます。
def main():
previous_close: Persistent[float] = na
previous_midpoint: Persistent[float] = na
midpoint = (high + low) / 2
close_change = close - previous_close
midpoint_change = midpoint - previous_midpoint
plot(close_change, "Close change", color=color.blue)
plot(midpoint_change, "Midpoint change", color=color.orange)
previous_close = close
previous_midpoint = midpoint最初の足には前の価格がないので、2つの永続変数の初期値はnaです。最初の差も欠損します。関数の最後で現在の値を保存し、次の足で使います。
previous_close = closeを引き算より前に置くと、現在の終値から同じ値を引くため、結果は0になります。永続変数を使う場合は、更新の順序を自分で管理する必要があります。
1本前の参照には、どちらの方法も使えます。角括弧を使う方が短く、さらに前の値も直接参照できます。この2つの永続変数が保持するのは、最後に保存した価格だけです。
両方を同じデモデータで実行し、いくつかのローソク足で2本の線を比較してください。