見出し画像

Pine Script™ (v5) の覚書 - コラム : 関数を定義する

同じような処理がたくさん必要になる場合に、関数を定義する(特定の処理のかたまりに別名を与える)ことができます。

関数名(引数)=>
    処理
    戻り値(必要があれば)

例えば、高値と安値の差の絶対値を計算する処理は以下のような関数となります。

hldif(float h, float l)=>
    dif=math.abs(h-l) //「h-l」の絶対値をdifに代入(最後に代入したdiffが自動的に戻り値になる)

この関数の使い方は、以下のようになります。

mydif=hldif(high, low) //引数にhighとlowを指定

デフォルト値の指定
引数はデフォルト値を指定することで、省略可能になります。

hldif(float h=high, float l=low)=> //hのデフォルト値にhigh、lのデフォルト値にlowを指定
    dif=math.abs(h-l)              //「h-l」の絶対値をdifに代入(最後に代入したdiffが自動的に戻り値になる)

デフォルト値を指定することで、引数無しの場合には現在のhighとlowの差、指定した場合には指定した値の差を処理させる関数となります。

//現在のhighとlowの差が欲しい場合
mydif=hldif()                      //引数を指定しなければ、デフォルト値で処理

//2つ前ローソク足のhighとlowの差が欲しい場合
mydif2=hldif(high[2],low[2])

引数の多い関数を自分が使いやすいように再定義することもできます。

例えば、labelにはたくさんの引数がありますが、毎回これらの引数を定義すると同じことを何度も書くことになります。

labelとその引数

label.new(x, y, text, xloc, yloc, color, style, textcolor, size, textalign, tooltip, text_font_family) → series label

そこで、実際に使う引数だけを使ってスクリプトに必要なスタイルのlabelを再定義することでスクリプトをすっきりさせることができます。

例えば、移動平均線の右端だけに移動平均線の情報をlabelで表示する場合に、
・ラベルは一つあれば良い(ローソク足毎に書かない)
・吹き出しはいらない
・色と文字列は固定で良い
等のスタイルを決めると、使う引数は限定できます。

ma_label(x, y, labeltext="", textcolor=color.blue)=>
    var l=label.new(na, na, labeltext, textcolor=textcolor, style=label.style_none)
    l.set_xy(x, y)
    l //戻り値(座標を設定したlabelオブジェクト)

この関数を使うと、吹き出し無しでテキストがcolor.blue色のlabelのX座標とY座標を更新し続けることができます。

sma20=ta.sma(close,20)
mylabel=ma_label(bar_index+2, sma20, "sma20")