あるローソク足の高値が108、安値が101なら、差は7です。この値幅を各ローソク足で計算し、描画します。

もう1つのプログラムでは、2つの価格の中間値を計算します。どちらも、変数と簡単な算術演算を使います。

ローソク足が表すもの

ローソク足は、ある期間のデータをまとめたものです。期間の長さは時間足で決まります。例えば1時間足のデータなら、1本が1時間を表します。

基本となるデータは5つです。

  • open:期間の始値。
  • high:期間の高値。
  • low:期間の安値。
  • close:期間の終値。
  • volume:期間の出来高。単位はデータ提供元によります。

英語名の頭文字を取ってOHLCVと呼びます。この本の最初の例題では、すでに確定したローソク足のサンプルデータを使います。

closeは、プログラムが今処理しているローソク足の終値です。次のローソク足に進めば、その終値を使います。他の基本データも同じです。

値幅を計算する

高値が108、安値が101なら、その期間に価格が動いた範囲は7です。

108 − 101 = 7

コードでは次のように書きます。

candle_range = high - low

high - lowは式です。プログラムがこれを評価して結果を求めます。-は引き算です。

candle_rangeは変数の名前です。=によって、右側の式の結果をこの名前に結び付けます。この操作を代入と呼びます。

「highとlowの差を計算し、その結果をcandle_rangeという名前にする」と読んでください。それ以降の行では、この名前で値を使えます。

分かりやすい名前を選ぶ

candle_rangeという名前なら、ローソク足の値幅だと分かります。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()の最初の行で値を計算し、2行目でcandle_rangeという名前を通じてplotに渡します。値は、使う前に代入しておく必要があります。

overlay=Falseは別パネルを指定します。値幅を専用のスケールで見られます。例えば、7という値幅と、100前後の価格では値の大きさが異なります。

保存し、前と同じデモデータで実行してください。

candle_range.pyのコードの横にチャートがあり、ローソク足の下に独立したRangeパネルが表示されている。
Rangeの線が、highとlowの差を別パネルに表示します。値が大きいほど、そのローソク足内の値幅が大きいことを表します。

結果の読み方

高い位置の点は大きな価格差、低い位置の点は小さな値幅を示します。この計算は、ヒゲも含む高値と安値を使っています。

陽線と陰線で同じ値幅になることもあるため、この値から値動きの方向は分かりません。正しいローソク足データではhighはlow以上なので、結果が負になることはありません。

次のローソク足で変数はどうなるか

プログラムは各ローソク足で、次の2つの手順を繰り返します。

  1. そのローソク足のhighとlowからcandle_rangeを計算します。
  2. plotが、そのローソク足の位置に値を表示します。

例えば、次のようになります。

  • 1本目:high = 108、low = 101なので、candle_range = 7。
  • 2本目:high = 110、low = 106なので、candle_range = 4。
  • 3本目:high = 109、low = 103なので、candle_range = 6。

チャートには7、4、6の3つの点が作られます。変数には、各ローソク足で現在の計算結果が代入されます。

過去のローソク足の値を参照する方法や、状態を保持する方法は後で学びます。

足し算、掛け算、割り算

コードでは、次の記号を使って計算します。

  • +:足し算。
  • -:引き算。
  • *:掛け算。
  • /:割り算。

掛け算と割り算は、足し算と引き算より先に行います。先に計算する部分を括弧で指定できます。

価格範囲の中間値は、次のように求めます。

midpoint = (high + low) / 2

2つの価格を足し、その結果を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を使っています。中間値をローソク足と同じ価格スケールで見たいからです。

candle_midpoint.pyの横のチャートに、ローソク足の中間値をつなぐMidpointの線が表示されている。
Midpointの線は、各ローソク足のhighとlowの中間値を表します。

実行後にローソク足を1本選び、その位置の点を見てください。ヒゲも含めた値幅全体の中央にあります。始値と終値で決まる実体の中央とは、異なる場合があります。

括弧が大切な理由

次の2つの式は、異なる計算を表します。

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

2行目では、先にlowだけを2で割り、それにhighを足します。先ほどの108と101なら、結果は158.5です。これは2つの価格の中間値ではありません。

構文としてはどちらも正しいのに、結果が違います。手計算できる例を使えば、意図した計算になっているかをすぐ確認できます。

自分で試す

終値から始値を引き、ローソク足の実体の変化を符号付きで描画してください。

  1. ファイル名をcandle_change.pyにします。
  2. 指標のタイトルを"Candle Change"にし、別パネルに表示します。
  3. 計算結果の名前をcandle_changeにします。
  4. 描画の名前を"Change"にします。

実行前に、次の3つの場合の結果を計算してください。

  • open = 100、close = 104。
  • open = 100、close = 97。
  • open = 100、close = 100。
解答

結果は4、−3、0です。正なら終値が始値より高く、負なら低く、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)

3つのプログラムを比べる

値幅、中間値、変化を求めるプログラムを順に開いてください。どれもOHLCデータから変数を計算し、次の行で描画しています。データはローソク足ごとに処理します。違うのは計算とoverlayの設定です。

次の章では2本のローソク足を比較し、前のローソク足のデータを参照する方法を学びます。