オシレーターを作ってPineスクリプトの勉強[Trading View]

こんにちは、ニッケルメッキです。
需要があるかわかりませんが、Pineスクリプトをオシレーターを作りながら勉強したいとおもいます。
私自身プログラマーじゃないので粗末かもしれませんw

それでは、早速超シンプルな教科書的オシレーターを作ってみましょう。
インジケーターの名前は「Simple Oscillator」ですw

オシレーターとは?
相場の強弱(売られ過ぎ、買われ過ぎなど)を表した指標のことをいいます。

作成するオシレーターの設計をする
何を根拠とするか?
売られ過ぎや、買われ過ぎを判断したいのか等。
ここでは簡単に今の価格の位置が過去の値動きに対してどこにいるのか把握するためのオシレーターを作成します。
使うデータは下記になります。

過去指定期間内に付けた最高値(100%)
過去指定期間内に付けた最安値(0%)
に対して現在値のいる位置(x%)

また、オシレーターは価格と違って上下のはっきりした100分率のほうが見やすいでしょう。なので、表示は100%から0%以内にします。

設計は以上です。

プログラミング言語(Pine)に直すために流れを考える
さきほど決めた設計をプログラミング言語に翻訳していくため、必要な計画を書き出していきましょう。

・インジケーターの名前
・インジケーターの表示位置
・期間を使うので、ユーザーが指定できるようにする
・計算方法
・表示方法(線、棒グラフなど)
・比較方法(売られ過ぎ、買われ過ぎのラインなど)

分解して考えます。

インジの名前→Simple Oscillator
表示位置→チャートの下
期間→適当に9と200、比較可能なように2期間指定可能にする
計算方法→
    レンジ = 過去指定期間の最高値 - 過去指定期間の最安値
    現在値の位置 = 現在値(終値) - 過去指定期間の最安値
    レンジに対する現在値の位置 = 現在値の位置 / レンジ
表示方法→線
比較方法→期間を2期間使用。80%と20%に線を引いてわかりやすくする

上記をプログラミング言語(Pine)に翻訳する際に、変数というものを使用します。
変数とは簡単に言って、変更可能な数値です。
計算結果を一時的に入れておく箱のようなものになります。
変数はプログラマーの方には常識ですが、一般的にはわかりづらいと思うので、わからない場合はgoogle先生に聞きましょう。
なので、あとあと混乱しないように変数の名前を決めていきます。
変数なので、決定しているものは変数名を考えなくて大丈夫です。
例)インジケーターのタイトルなど(Simple Oscillator)
ということで、変化するっぽい項目の変数名を考えておきます。

期間短期 = len_f(length fastの略)
期間長期 = len_s(length slowの略)
過去指定期間の最高値 = h(highestの略)
過去指定期間の最安値 = l(lowestの略)
現在値 = c(closeの略、厳密には現在値 - 最安値)
レンジ = r(rangeの略)
計算する機能 = so(Simple Osillator自体、またはその略)
計算結果 = s(Simple Osillatorの先頭文字)

なんとなくわかりやすいイニシャルを変数名に使用することがおおいです。
aでもbでもなんでも大丈夫ですが、プログラムが見やすいように見てわかる変数名にしましょう。(数字は変数の先頭には使用できません、他Pineにもともと定義されている変数highなど)
これで、変数名は決まりました。

次に計算式を簡単に書き出しておきましょう。(わかりやすく)

h = 最高値(期間)
l = 最安値(期間)
c = 現在値 - l
r = h -l
s = c / r * 100
so = Simple Osillator(このオシレーターの計算結果)

計算結果の例

最高値 = 1000000
最安値 = 900000
現在値 = 980000 の場合

h = 1000000 //最高値を算出するPineの関数を使用します
l = 900000 //最安値を算出するPineの関数を使用します
c = 980000 - 900000 //現在値が格納されているPineの変数を使用します
r = 1000000 - 900000
s = 80000 / 100000 * 100
so = 80

上記はイメージしやすいように、計算結果を書き出しました。
次に、実際のPineスクリプトへ計算式を置き換えます。
下記になります。

h = highest(len_f) //highest関数は指定期間の最高値を呼び出します。
l = lowest(len_f) //lowest関数は指定期間の最安値を呼び出します。
c = close - l //closeは現在の終値が格納されている変数になります。
r = h - l
s = c /r * 100

設計では2本(短期、長期)比較するので、この計算を下記のように2回おこないます。2回目の結果を分けるため、変数の名前に2をつけています。

h = highest(len_f)
l = lowest(len_f)
c = close - l
r = h - l
s = c /r * 100
h2 = highest(len_s)
l 2= lowest(len_s)
c2 = close - l2
r 2= h2 - l2
s2 = c2 / r2 * 100

上記のように書いてもプログラムは動作します。
が、何度も同じ計算を繰り返し記述するのはプログラミングでは禁止です。
例) 1 * 4 = 4 ではなく 1+1+1+1 = 4としてはいけない。
なので上記の計算をファンクションという一つの機能にまとめてしまいます。

so(len) =>
    h = highest(len)
    l = lowest(len)
    c = close - l
    r = h - l
    s = c / r * 100

少し難しいですが、このように記載すると変数lenを指定するだけでsの値を返してくれる機能が作成されます。
人間のやり取りに置き換えると下記になります。

人「期間9(len_f)でSimple Osillator計算して!」
soファンクション「かしこまりました、計算結果のsでございます」

便利ですね!
Pineスクリプトのファンクションは下記にような書き方になります。

ファンクションの名前(引数)=>
[半角スペース4個]計算したい式

例)
tashizan(a, b)=>
    kotae = a + b //aとbを足した結果kotaeを返します。

今回はこのsoファンクションさんに2回期間を与えて計算してもらいます。

ここまでで、ほぼ骨格は出来上がりました。
それでは、完全にPineスクリプトに翻訳します。
一気にいってしまいますが、下記のコードでわからないことがあれば、Pineスクリプトのマニュアルを参考にしてください。

ソースコード

//@version=3
//↑Pineのバージョン宣言、使用する機能によって宣言が必要
study(title="Simple Oscillator", shorttitle="SO", overlay=false)
//study→これはインジケーターですよの意味
//title→インジケーターの名前、適当で良い
//shorttitle→インジケーターを表示する時の名前、邪魔じゃないように短く
//overlay→trueかfalse、チャート上に表示するかしないか
len_f = input(title="Fast", type=integer, defval=9, minval=-1, maxval=1000)
len_s = input(title="slow", type=integer, defval=200, minval=-1, maxval=1000)
//input→設定で変更可能な項目を追加、MAの期間など。
//title→設定する項目の名前、期間(Period、length)など、日本語も可
//type→項目の型。整数、小数点以下を扱う項目かなど。integerは整数を表します。
//defval→デフォルトの数値、初期設定。任意で決めておく。MAなら21など。
//minval→項目の最小値。整数なら1など。
//maxval→項目の最大値。整数なら1000など。
so(len) =>
    h = highest(len)
    l = lowest(len)
    c = close - l
    r = h - l
    s = c / r * 100
//ここから so(len) =>
//    h = highest(len)
//    l = lowest(len)
//    c = close - l
//    r = h - l
//    s = c / r * 100 ここまでが一つのブロック。
//[変数(引数)=>]でファンクション(繰り返し行う計算をまとめたもの)を宣言。
//soはSimple Oscillatorを略しただけ、ファンクションの名前。
//lenはlengthを略しただけ。
//計算結果は最後の行[s = c /r * 100]が呼び出した側に返されます。
plot(so(len_f), color=blue)
plot(so(len_s), color=orange)
//plot→チャート画面に出力するファンクション。overlayがfalseなのでローソク足とは別の画面に表示される。
//plot(表示する内容, 色)など。表示方法のデフォルトは線(line)
//この場合は、表示する内容をsoファンクションへinputで設定したlen_fまたはlen_sを引数として呼び出し、指定の色で描画するという意味)
h0 = hline(80)
h1 = hline(20)
//hline はホリゾンタルライン(水平線)、ストキャスティクスなどでレベル表示に用いたりする
fill(h0, h1, color=purple, transp=90)
//fillは塗りつぶしを行うファンクション、始点と終点を指定する。h0からh1を塗りつぶすという意味。

一気ですが、おわりに
全ては解説しきれませんがプログラムの作り方の流れ(プロじゃないので自己流です)、計算式などコアな部分だけオシレーター作成を元に解説させていただきました。これからPineスクリプトをはじめたいという方の一助になれば幸いです。

私自身初心者ですが、Pineスクリプトは情報が少なくわかりづらい点があったので書かせていただきました。
わからないことはご質問ください。私自身初心者ですが、可能な限りお答えします。

この記事が気に入ったら、サポートをしてみませんか?気軽にクリエイターを支援できます。

29

ニッケルメッキ

相場好きです!それだけ。

bot

4つ のマガジンに含まれています

コメント3件

こんにちは、質問させてください!
トレーディングビューで比較で違う銘柄を追加すると銘柄Aと銘柄Bのローソク足が表示されますが、銘柄AとB両方のインジケータを一つのチャートに表示させたい場合pineでどのようにデータを指定すればよいのでしょうか?
どうぞよろしくお願いいたします!
> まーさん
チャートに比較する銘柄を追加のうえ、追加した銘柄をチャート上で選択、右クリックでインジケーターを追加をクリック。これで一つのチャートに異なる銘柄のインジケーターは表示できます。
Pineで表示する必要がある場合は、下記のようにsecurity関数を使用します。
xbt = security("BITMEX:XBTUSD", period, close)
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。