(1)概要
(2)plot関数
(3)change関数・iff関数
(4)input関数
(5)security関数、相関係数インジケータ
(6)fill関数
(7)bgcolor関数
(8)複数行を一括でコメントアウトできる?
(9)line.new関数・line.set関数、ピボット・インジケータ
(10)関数宣言(カスタム関数)、ピボット・ハイ・ロー・インジケータ
(11)ジグザグ(ZigZag)インジケータ
(12)平均足バー・マルチタイムフレーム(MTF)
(13)ストラテジー・バックテストの概要
(14)ストラテジー・サンプル「EMAクロス+固定TP/SL」
(15)ストラテジーの「最適化」をめぐるTradingViewとMetaTraderの違い
(16)Security関数のgapsとlookaheadとは?
(17)アラート条件の設定:alertcondition
はじめに
PineScriptでは、最初からビルトインされている関数の他に、ユーザーが独自の関数を宣言して利用することができます(カスタム関数、ユーザー定義関数)。
今回は、関数宣言を説明した後に、サンプル・インジケータを作成して、カスタム関数を使えるようにしたいと思います。
サンプルスクリプトは、Tradingviewのユーザーマニュアルの中の(前回のピボット・インジケータのサンプルの次にある)ピボット・ハイ・ロー・インジケータを採り上げます。
https://www.tradingview.com/pine-script-docs/en/v4/essential/Drawings.html#examples-of-classic-indicators
「ピボット・ハイ・ロー (Pivot High Low、別名:バーカウントリバーサル(Bar Count Reversal)」は、前回サンプルのピボットとは全く別物です。
前回のピボットは、J・W・ワイルダーによって考案された指標で前期間の高値・安値・終値から当期間のサポートやレジスタンス(PP, S1, S2, R1,R2…)を予測するもので、通称『フロアートレーダー・ピボット』と呼ばれます。
これに対して今回の「ピボット・ハイ・ロー 」は、ある足の値が、前後の特定の期間の最高値にある場合や、逆に前後の特定の期間の最低値にある場合をピボットと呼ぶものです。
関数宣言
それではまず関数宣言の説明から始めます。関数宣言には、1行のものと、複数行のものがあります。
1行の関数宣言の例
f(x, y) => x + y
宣言の後に、「a = f(open, close)」などのように利用します。
複数行の関数宣言の例
geom_average(x, y) => a = x*x b = y*y sqrt(a + b)
カスタム関数geom_averageは、2つの引数(xとy)を持ち、2つの変数(aとb)と、平方根を返す組み込み関数「sqrt」を宣言の内容に含んでいます。最終的にこの関数geom_averageは、「xとyの二乗和の平方根」を値として返します。
複数行のカスタム関数の2行目以降は、かならず「インデント」(4個のスペースか1個のタブ)で続ける必要があります。
関数宣言に使う「=>」は、演算子の「>=」や「<=」とは全く別物です。
「三平方の定理」、懐かしいですね。
ピボット・ハイ・ローのサンプル・インジケータの作成
それでは関数宣言を使って、ピボット・ハイ・ローのサンプル・インジケータを作成していきます。
まず、このインジケータをチャートに表示させた結果は、以下の通りです。左右の10本の足の最高値と最安値の足に、ラベルが表示されています。
このインジケータのスクリプトは、以下の通りです。
説明のために(A)から(G)までの注釈を加えています。
//@version=4 study("Pivot Points High Low", shorttitle="Pivots HL", overlay=true) lenH = input(title="Length High", type=input.integer, defval=10, minval=1) //-----(A) lenL = input(title="Length Low", type=input.integer, defval=10, minval=1) fun(src, len, isHigh, _style, _yloc, _color) => //-----(B) p = nz(src[len]) //----(C) isFound = true //----(D) for i = 0 to len - 1 //-----(E) if isHigh and src[i] > p isFound := false if not isHigh and src[i] < p isFound := false for i = len + 1 to 2 * len if isHigh and src[i] >= p isFound := false if not isHigh and src[i] <= p isFound := false if isFound label.new(bar_index[len], p, tostring(p), style=_style, yloc=_yloc, color=_color)//-(F) fun(high, lenH, true, label.style_labeldown, yloc.abovebar, color.lime) //-----(G) fun(low, lenL, false, label.style_labelup, yloc.belowbar, color.red)
(A) lenH = input(title=”Length High”, type=input.integer, defval=10, minval=1)
ピボットハイを測定する左右の期間をデフォルトで10と設定しています。
(B) fun(src, len, isHigh, _style, _yloc, _color) =>
6つの引数を持つカスタム関数「fun」の宣言を開始します。
(C) p = nz(src[len])
ピボット判定のために測定する各足の値を変数pに代入します。
nz関数は、null(値無し)の場合はゼロを返す特殊な関数です。
(D) isFound = true
ピボット判定結果を格納するブーリアン型の変数(True or False)にデフォルトTrueを代入します。
(E) for i = 0 to len – 1
for以下の10行で:
現在の足から測定期間(デフォルトは10個の足)の間で、
高値測定でpより高い値の場合はisFoundにfalseを代入、安値測定でpより安い値の場合isFoundにfalseを代入します。さらに;
現在の足から測定期間(デフォルトは10個の足)の前のさらに測定期間分(デフォルトは10個の足)の間で、
高値測定でpより高いか同じ値の場合はisFoundにfalseを代入、安値測定でpより安いか同じ値の場合isFoundにfalseを代入します。
(F) label.new(bar_index[len], p, tostring(p), style=_style, yloc=_yloc, color=_color)
測定結果がTrueの場合は、fun関数の引数を使ってラベルを新規設定します。
ここまでがfun関数の宣言部分です。
(G) fun(high, lenH, true, label.style_labeldown, yloc.abovebar, color.lime)
fun関数で、該当の足にラベルを表示します。
次回のサンプルでは、今回のピボット・ハイ・ローを応用したもので、人気のある「ジグザグ(ZigZag)インジケータ」のサンプルを採り上げたいと思います。