前回までの投稿では、変数、input()関数、ta.sma()関数、plot()関数の使い方を解説しながら、チャート上に移動平均線を2本プロットするコードを作成しました。
今回の投稿では、変数の種類について解説しながら、移動平均線のコードを少し改造してみます。
変数の種類
前回作成した例3コードをもう一度見てください。
(例3)
//@version=5
indicator(“移動平均2本”, overlay=true)
i_smaShort = input(defval=10, title=”Short SMA”) // 解説1
i_smaLong = input(defval=100, title=”Long SMA”)
sma_short = ta.sma(source=close, length=i_smaShort) // 解説2
sma_long = ta.sma(source=close, length=i_smaLong)
plot(series=sma_short, color=color.green)
plot(series=sma_long, color=color.red)
解説1:この行では、i_smaShortという変数を作っていますが、これは int型変数、または整数型変数といって、5とか10とか100などの整数だけを入れられる箱のようなものです。覚えてほしいことは、小数点付きの数はこの箱(int変数)に入れることはできません。
英語では integer variable と言います。
解説2:この行では sma_shortという変数をつくって、短期移動平均線の値を代入していますが、これはfloat型変数という種類の変数で、浮動小数点数、float variable とも言います。このfloat型変数は、int変数とは違って、小数点以下の数を含む数字を入れることができる箱です。例えば 423.56 だとか、397.56だとか、移動平均で計算される値は小数点以下を含む数値になるので、float型変数を使うことになります。
わざわざ整数と小数含む数を区別するのは面倒に感じてしまいますが、プログラミングの世界では言語にもよって違うようですが、区別をするのが一般的のようです。
Pine Scriptはたいていの場合は、int変数なのか、float変数なのかを自動判別してくれるので、例3のような簡単なコードであれば意識しなくてもあまり不都合はありません。しかし、もう少し複雑なコードを書くようになると、区別しないとエラーになってしまったりすることがあるので、違いをよく意識してコードを書いてください。
i_smaShort = input(defval=10, title=”Short SMA”)
は初期値を10と指定しているので、システム側でi_smaShort はint変数だと自動判別してくれます。
あいまいさを避けて、はっきり書こうとすると、
i_smaShort = input.int(defval=10, title=”Short SMA”)
と書くこともできます。
思わぬところでエラーが出たりするのも嫌なので、私はできるだけ input.int() 関数を使って、はっきりint変数であることを示しながらコードを書くようにしています。
input()関数で小数点以下を含む数字を入力したい場合は、初期値の引数defval=に、1.5とか2.3とかの小数点以下を含む数を指定するか、input.float() 関数をつかってfloat型変数であることを宣言することもできます。
私はinput.float()とはっきりと書くようにしています。
長期移動平均線の上下1.5% にエンベロープ線をプロットする
それでは、float型変数とinput.float()関数をつかって、例3のコードの長期移動平均線の上下1.5%のところに線を追加プロットしてみましょう。1.5%という値をあとで変更できるようにinput.float()関数を使います。
このように移動平均線の上下に一定の乖離率の線を引くことを、エンベロープと言います。英語ではEvnelopeといって、封筒の意味ですが、移動平均線を包み込む封筒のイメージなのかもしれません。
それでは、まずはご自身でコードを書いてみて、そのあとに下記の答え(例4)を見てください。
(例4)
//@version=5
indicator(“移動平均2本”, overlay=true)
i_smaShort = input.int(defval=10, title=”Short SMA”) // 解説1
i_smaLong = input.int(defval=100, title=”Long SMA”)
i_envelope = input.float(defval=1.5, title=”Envelope %”) //解説2
sma_short = ta.sma(source=close, length=i_smaShort)
sma_long = ta.sma(source=close, length=i_smaLong)
high_envelope = sma_long + sma_long*(i_envelope/100) //解説3
low_envelope = sma_long – sma_long*(i_envelope/100) //解説4
plot(series=sma_short, color=color.green)
plot(series=sma_long, color=color.red)
plot(series=high_envelope, color=color.orange) //解説5
plot(series=low_envelope, color=color.orange) //解説6
解説1:例3のコードではinput()関数を使っていましたが、今回はinput.int()関数に書き換えました。あいまいさを避けるためですが、どちらでもかまいません。
解説2:長期移動平均線の上下に引くエンベロープ線の乖離率を input.float()関数をつかって設定しました。
input(defval=1.5, title=”Envelope %”)としてもシステムが自動判別してfloat型変数にしてくれますが、input(defval=1, title=Envelope %”)としてしまうと初期値が整数なので、システムはint型変数として扱ってしまいます。そうななると、あとから数値を変える際に、2, 3のような整数での指定しか受け付けなくなり、1.5のような指定ができなくなります。これでは不都合ですね。int型変数とfloat型変数をはっきり区別してコードを書くとが大事な理由はこういうことなのです。
解説3:エンベロープの上線を計算して変数 high_envelope に代入しています。計算結果が小数点以下を含む数値になることが確実なので、システムが自動的にfloat型変数にしてくれます。
移動平均線の1.5%上の値を計算する式は、
移動平均値 + (移動平均値 x 1.5%)
となります。
1.5% というのは小数で表すと0.015になります。
1.5÷100で計算することもできますので、言い換えると、
移動平均値+(移動平均値 x 1.5/100)
となります。
長期の移動平均値にはすでに sma_longという変数が定義されています。
エンベロープの初期値1.5%の乖離率にはすでにi_envelope という変数が定義されています。
なので、エンベロープの上線を計算するコードは、
high_envelope = sma_long + sma_long*(i_envelope/100)
とすることができます。
間違って sma_long + sma_long*i_envelope としないでください。
そう書くと、移動平均値+(移動平均値*1.5) となり、移動平均線の50%上のところに線を引いてしまいます。
今後、数値をパーセントに変換するときは、数字/100と書けばよい、と覚えておいてください。
1.5/100は1.5%になる、2/100は2%になる、ということです。
解説4:これも解説3と考え方は同じですが、こんどは移動平均線の下に線をプロットします。
初期値1.5%の場合は、
移動平均値−(移動平均値 x 1.5/100)
で計算することができますので、コードは、
low_envelope = sma_long – (low_envelope * i_envelope/100)
とすることができます。
解説5、解説6:長期移動平均線を赤でプロットしていましたが、エンベロープはオレンジ色にしてみました。
plot(series=high_envelope, color=color.orange)
としています。
これでエンベロープをプロットするコードが出来上がりました。
「チャートに追加」を押して実行すると、チャートが下記のような表示になります。
