[Trading View Pine インジケータ] 天底判定

一般的な天底の判定式

通常、天底の判定は

f_is_fractal_top(_src)=>_src[3] < _src[2] and _src[2] > _src[1]
f_is_fractal_btm(_src)=>_src[3] > _src[2] and _src[2] < _src[1]

で行う。

もう少し精度を上げるなら、判断に用いるローソク足数を増やして

f_is_fractal_top(_src)=>_src[5] < _src[3] and _src[4] < _src[3] and _src[3] > _src[2] and _src[3] > _src[1]
f_is_fractal_btm(_src)=>_src[5] > _src[3] and _src[4] > _src[3] and _src[3] < _src[2] and _src[3] < _src[1]

みたいな感じ。


より詳細な天底の判定式

これだと精度を上げたいと思った時に、毎回コードを変更しないといけないので、

//@version=3
study(title='Judge Top-Bottom', shorttitle='Top-Bottom', overlay=true)

// ===== Variables =====
// 天底の判定に使うローソク足数(片側)
// len=1 なら、合計3本で判定
// len=2 なら、合計5本で判定
chk_tb_len = input(defval=3, minval=2, title="judge top-btm length")

// ===== Functions =====
// 天井の判定(前後n値と比較)
f_is_fractal_top(_src, offset) =>
    is_top = true
    for i = offset to (offset + chk_tb_len * 2)
        // 中央値より大きい値がある -> 天井ではない
        if (_src[offset + chk_tb_len] < _src[i])
            is_top := false
            break
    is_top

// 底の判定(前後n値と比較)
f_is_fractal_btm(_src, offset) =>
    is_btm = true
    for i = offset to (offset + chk_tb_len * 2)
        // 中央値より小さい値がある -> 底ではない
        if (_src[offset + chk_tb_len] > _src[i])
            is_btm := false
            break
    is_btm

// Main Logics
bgcolor(f_is_fractal_top(close, 1) ? green : na, title="top", offset=-(chk_tb_len + 1))
bgcolor(f_is_fractal_btm(close, 1) ? red : na, title="bottom", offset=-(chk_tb_len + 1))

という感じにした。

offset を渡しているのは、過去の値で天底を探したい時用。基本的には気にせずに、1 を渡して使えば OK。

コードを見てもらえば分かるが、やっているのは中央値が最高(最低)かどうかのチェック。ありがたい事に、全公開しているにもかかわらず購入してくださった方がいるので、図解で補足しておく。

図やコードを見れば分かる通り、厳密な天底(1番左の例)だけでなく、W字やM字のようなパターン(中央の例)も天底として検出するので注意して欲しい。


引数増やしても良いかも

input で変数用意するのが面倒、入力に応じて判定に使うデータ数を変えたい、って場合は引数 len を追加する方が幸せになれるかもしれない。

// ===== Functions =====
// 天井の判定(前後n値と比較)
f_is_fractal_top(_src, offset, len) =>
    is_top = true
    for i = offset to (offset + len * 2)
        // 中央値より大きい値がある -> 天井ではない
        if (_src[offset + len] < _src[i])
            is_top := false
            break
    is_top

// 底の判定(前後n値と比較)
f_is_fractal_btm(_src, offset, len) =>
    is_btm = true
    for i = offset to (offset + len * 2)
        // 中央値より小さい値がある -> 底ではない
        if (_src[offset + len] > _src[i])
            is_btm := false
            break
    is_btm


おわりに

有料(¥100)にしてるけど、これで内容は全部です。募金してくれる人がいれば、ジュース代としていただけると嬉しい。Pine スクリプトは、インデントくずれが起きるようなので、コピペ時には注意してください。


マガジン


コメント用note(未購入者向け)

干し芋


ここから先は

0字

¥ 100

サポート頂けると励みになります BTC,BCH: 39kcicufyycWVf8gcGxgsFn2B8Nd7reNUA LTC: LUFGHgdx1qqashDw4WxDcSYQPzd9w9f3iL MONA: MJXExiB7T7FFXKYf9SLqykrtGYDFn3gnaM