Pineスクリプトの構文は理解したけど、実際にどう書けばいいかイメージが湧かない。そんな初心者が最初にぶつかる壁は「コードの書き方」ではなく「コードの使い方」だ。
この記事では、Pineスクリプトの基本構文をパターン別に短いコード例で紹介する。1つの例は10〜20行程度のシンプルなコードで、それぞれ「この構文で何ができるか」がひと目でわかる構成にした。すべてv6対応、Pineエディタにコピペすればそのまま動く。
構文の教科書的な解説ではなく、「こう書けばこう動く」の具体例を並べている。手を動かしながら読み進めてほしい。
- 1 コード例の使い方
- 2 例1: 終値をラインで表示する(最小構成)
- 3 例2: 移動平均線を1本引く
- 4 例3: 2本のEMAを重ねて表示する
- 5 例4: input関数でパラメータを外出しする
- 6 例5: 条件で背景色を変える
- 7 例6: ローソク足の色を変える
- 8 例7: クロスで矢印シグナルを出す
- 9 例8: RSIを別パネルに表示する
- 10 例9: MACDを表示する
- 11 例10: ボリンジャーバンドを帯で表示する
- 12 例11: 前日の高値・安値を表示する
- 13 例12: 特定の時間帯だけ背景色を塗る
- 14 例13: varで累積カウンターを作る
- 15 例14: 自作関数を定義する
- 16 例15: ラベルで価格を表示する
- 17 例16: テーブルで情報パネルを作る
- 18 例17: アラート条件を設定する
- 19 例18: シンプルなストラテジー(バックテスト)
- 20 コード例の次のステップ
コード例の使い方
TradingViewのチャートを開き、画面下部の「Pineエディタ」タブをクリックする。既存のコードを全選択して削除し、この記事のコード例をコピペする。「チャートへ追加」をクリックすれば、チャートにインジケーターが表示される。
各例は独立しているので、好きな順番で試して問題ない。気になったコードから触ってみよう。
例1: 終値をラインで表示する(最小構成)
Pineスクリプトの最小構成は3行だ。何が最低限必要なのかを確認する例。
//@version=6
indicator("終値ライン", overlay=true)
plot(close, "終値", color.blue, 2)
1行目がバージョン宣言、2行目がインジケーター宣言、3行目が出力。この3行がすべてのPineスクリプトの骨格になる。overlay=trueで価格チャートに重ねて表示、falseにすると別パネルに表示される。
例2: 移動平均線を1本引く
最も使用頻度が高いテクニカル関数ta.sma()を使って、20期間の単純移動平均線を引く。
//@version=6
indicator("SMA20", overlay=true)
sma20 = ta.sma(close, 20)
plot(sma20, "SMA20", color.orange, 2)
ta.sma(close, 20)は「終値の20期間単純移動平均」を計算する。結果を変数sma20に入れ、plot()でチャートに描画する。closeをhighやlowに変えれば、高値や安値の移動平均線になる。
例3: 2本のEMAを重ねて表示する
短期EMAと長期EMAを同時に表示する。複数のplot()を並べるだけで線を重ねられる。
//@version=6
indicator("デュアルEMA", overlay=true)
ema12 = ta.ema(close, 12)
ema26 = ta.ema(close, 26)
plot(ema12, "EMA12", color.blue, 2)
plot(ema26, "EMA26", color.red, 2)
ta.ema()は指数移動平均を計算する関数。SMAより直近の価格に重みを置くため、価格の変動に敏感に反応する。色や線の太さはplot()の引数で自由に変更できる。
例4: input関数でパラメータを外出しする
パラメータをコード内に直書きすると、値を変えるたびにコードを編集する必要がある。input関数を使えば、設定画面から変更できるようになる。
//@version=6
indicator("入力つきSMA", overlay=true)
length = input.int(20, "期間", minval=1, maxval=200)
src = input.source(close, "ソース")
lineColor = input.color(color.blue, "色")
sma = ta.sma(src, length)
plot(sma, "SMA", lineColor, 2)
input.int()で整数入力、input.source()でデータソース選択、input.color()で色選択。チャートにインジケーターを追加した後、歯車アイコンから設定画面を開けば、コードを一切触らずにパラメータを調整できる。
例5: 条件で背景色を変える
終値がSMAの上にあれば緑、下にあれば赤に背景色を変えるシンプルなトレンド判定。
//@version=6
indicator("トレンド背景色", overlay=true)
sma50 = ta.sma(close, 50)
isUpTrend = close > sma50
bgcolor(isUpTrend ? color.new(color.green, 90) : color.new(color.red, 90))
plot(sma50, "SMA50", color.gray, 2)
bgcolor()は背景色を変更する関数。color.new(色, 透明度)で透明度を0〜100の範囲で指定する。90なら「ほぼ透明」だ。条件 ? 値A : 値Bは三項演算子で、条件がtrueなら値Aを、falseなら値Bを返す。
例6: ローソク足の色を変える
出来高が過去20本の平均を超えたバーの色を変える。大出来高のバーが視覚的にわかる。
//@version=6
indicator("出来高バー色", overlay=true)
avgVol = ta.sma(volume, 20)
highVol = volume > avgVol * 1.5
barcolor(highVol ? color.yellow : na)
barcolor()はローソク足の色を変更する関数。naを返すとデフォルトの色のままになる。この例では出来高が平均の1.5倍を超えたバーだけ黄色にし、それ以外はそのままにしている。
例7: クロスで矢印シグナルを出す
EMAのゴールデンクロス・デッドクロスの瞬間に矢印を表示する。
//@version=6
indicator("クロス矢印", overlay=true)
fast = ta.ema(close, 12)
slow = ta.ema(close, 26)
plotshape(ta.crossover(fast, slow), "買い", shape.triangleup, location.belowbar, color.green, size=size.small)
plotshape(ta.crossunder(fast, slow), "売り", shape.triangledown, location.abovebar, color.red, size=size.small)
plot(fast, "EMA12", color.blue)
plot(slow, "EMA26", color.red)
ta.crossover(A, B)はAがBを下から上に抜けた瞬間だけtrueを返す。plotshape()は条件がtrueのバーにだけ図形を表示する。location.belowbarは安値の下、location.abovebarは高値の上に配置する。
例8: RSIを別パネルに表示する
RSIをチャート下部の別パネルに表示し、買われすぎ・売られすぎの水平線も引く。
//@version=6
indicator("RSI", overlay=false)
rsiLen = input.int(14, "期間")
rsi = ta.rsi(close, rsiLen)
plot(rsi, "RSI", color.purple, 2)
hline(70, "買われすぎ", color.red, hline.style_dashed)
hline(30, "売られすぎ", color.green, hline.style_dashed)
hline(50, "中間", color.gray, hline.style_dotted)
overlay=falseにすると、メインチャートとは別のパネルにインジケーターが表示される。RSIやMACDなど、価格と異なるスケールの指標はこちらを使う。hline()は固定の水平線を引く関数だ。
構文の詳細をもっと体系的に学びたい方はこちらの記事が参考になる。
→ Pineスクリプトの書き方|基本構文をコード付きで完全解説
例9: MACDを表示する
MACDライン、シグナルライン、ヒストグラムの3要素をまとめて表示する。複数戻り値の関数の使い方がわかる例。
//@version=6
indicator("MACD")
[macdLine, signalLine, hist] = ta.macd(close, 12, 26, 9)
plot(macdLine, "MACD", color.blue, 2)
plot(signalLine, "Signal", color.orange, 2)
plot(hist, "Histogram", color=hist >= 0 ? color.green : color.red, style=plot.style_columns)
hline(0, "ゼロ", color.gray)
ta.macd()は3つの値を返す。[変数1, 変数2, 変数3] = 関数()の形式で受け取る。ヒストグラムはplot.style_columnsで棒グラフとして表示し、正なら緑、負なら赤に色分けしている。
例10: ボリンジャーバンドを帯で表示する
ボリンジャーバンドの上下バンド間を塗りつぶして帯状に表示する。fill()の使い方がわかる例。
//@version=6
indicator("ボリンジャーバンド", overlay=true)
length = input.int(20, "期間")
mult = input.float(2.0, "倍率")
[upper, middle, lower] = ta.bb(close, length, mult)
p1 = plot(upper, "Upper", color.blue)
p2 = plot(lower, "Lower", color.blue)
plot(middle, "Middle", color.gray)
fill(p1, p2, color=color.new(color.blue, 90))
fill()は2つのplotの間を塗りつぶす関数。plot()の戻り値を変数に保存して、それをfill()に渡す。透明度90で薄く塗ることで、ローソク足が見やすいままバンド帯を可視化できる。
例11: 前日の高値・安値を表示する
デイトレーダーがよく使う、前日の高値と安値を水平線として当日のチャートに表示する例。request.security()の基本的な使い方がわかる。
//@version=6
indicator("前日高安", overlay=true)
pdh = request.security(syminfo.tickerid, "D", high[1])
pdl = request.security(syminfo.tickerid, "D", low[1])
plot(pdh, "前日高値", color.red, 2, plot.style_stepline)
plot(pdl, "前日安値", color.green, 2, plot.style_stepline)
request.security()は別の時間足のデータを取得する関数。第1引数が銘柄、第2引数が時間足("D"は日足)、第3引数が取得したいデータ。high[1]で「前日の高値」を取得している。plot.style_steplineで階段状の水平ラインとして描画する。
例12: 特定の時間帯だけ背景色を塗る
東京時間(9:00〜15:00 JST)だけ背景色をハイライトする。FXトレードで市場時間を意識するときに使う。
//@version=6
indicator("東京時間ハイライト", overlay=true)
tokyoSession = not na(time(timeframe.period, "0000-0600", "Asia/Tokyo"))
bgcolor(tokyoSession ? color.new(color.red, 92) : na)
time()関数の第2引数でセッション時間を指定し、第3引数でタイムゾーンを指定する。戻り値がnaでなければ、指定した時間帯内ということだ。TradingViewのチャートがどのタイムゾーン設定でも、正しく判定される。
時間指定のコードをもっと詳しく知りたい方はこちら。
→ Pineスクリプトで時間指定する方法|東京・ロンドン・NY時間の実装コード
例13: varで累積カウンターを作る
varキーワードを使って、条件を満たしたバーの数を数える。Pineスクリプト特有の「バーごと実行」の概念を理解する例。
//@version=6
indicator("陽線カウント")
var int bullCount = 0
if close > open
bullCount := bullCount + 1
plot(bullCount, "累計陽線数", color.green, 2)
varを付けた変数は最初のバーでのみ初期化され、以降は値を保持し続ける。varなしだとバーごとにリセットされるため、カウンターとして機能しない。再代入には:=を使う(=は初回宣言用)。
例14: 自作関数を定義する
繰り返し使う計算を関数にまとめる。この例では、2つの値の変化率を計算する関数を定義している。
//@version=6
indicator("変化率")
// 自作関数: 変化率を計算
pctChange(current, previous) =>
(current - previous) / previous * 100
// 使用例
change1 = pctChange(close, close[1]) // 前日比
change5 = pctChange(close, close[5]) // 5日前比
plot(change1, "前日比%", color.blue)
plot(change5, "5日前比%", color.orange)
hline(0, "ゼロ")
関数名(引数) =>の形式で1行関数を定義する。複数行の処理が必要な場合はインデントで書く。一度定義すれば何度でも呼び出せるので、同じ計算の繰り返しを避けられる。
例15: ラベルで価格を表示する
最新バーに現在の価格とRSIの値をラベルで表示する。label.new()の使い方がわかる例。
//@version=6
indicator("価格ラベル", overlay=true)
rsi = ta.rsi(close, 14)
if barstate.islast
labelText = "価格: " + str.tostring(close, format.mintick) + "\nRSI: " + str.tostring(rsi, "#.#")
label.new(bar_index, high, labelText, style=label.style_label_down, color=color.blue, textcolor=color.white, size=size.normal)
barstate.islastは最新バーでのみtrueになる条件。これを使わないと過去のすべてのバーにラベルが作られてしまう。str.tostring()は数値を文字列に変換する関数で、第2引数で表示フォーマットを指定する。\nは改行だ。
例16: テーブルで情報パネルを作る
チャートの右上に現在の相場情報をまとめたミニパネルを表示する。
//@version=6
indicator("情報パネル", overlay=true)
rsi = ta.rsi(close, 14)
sma = ta.sma(close, 20)
trend = close > sma ? "↑ 上昇" : "↓ 下降"
var table panel = table.new(position.top_right, 2, 3, bgcolor=color.new(color.black, 80), border_width=1)
if barstate.islast
table.cell(panel, 0, 0, "トレンド", text_color=color.gray, text_size=size.small)
table.cell(panel, 1, 0, trend, text_color=close > sma ? color.green : color.red, text_size=size.small)
table.cell(panel, 0, 1, "RSI", text_color=color.gray, text_size=size.small)
table.cell(panel, 1, 1, str.tostring(rsi, "#.#"), text_color=color.white, text_size=size.small)
table.cell(panel, 0, 2, "SMA20", text_color=color.gray, text_size=size.small)
table.cell(panel, 1, 2, str.tostring(sma, format.mintick), text_color=color.white, text_size=size.small)
table.new()でテーブルを作成し、table.cell()で各セルに値を入れる。position.top_rightでチャート右上に固定される。varで宣言することで、テーブルオブジェクトが毎バー再生成されるのを防いでいる。
例17: アラート条件を設定する
RSIが70を超えたときと30を下回ったときにアラートを鳴らせるようにする。
//@version=6
indicator("RSIアラート")
rsi = ta.rsi(close, 14)
plot(rsi, "RSI", color.purple, 2)
hline(70, "上限")
hline(30, "下限")
alertcondition(ta.crossover(rsi, 70), "RSI 70超え", "{{ticker}}: RSIが70を超えました")
alertcondition(ta.crossunder(rsi, 30), "RSI 30割れ", "{{ticker}}: RSIが30を下回りました")
alertcondition()はアラート条件を登録する関数。スクリプトを保存してチャートに追加した後、TradingView上でアラートを手動で作成する必要がある。{{ticker}}は実行時に実際のティッカー名に置き換わるプレースホルダだ。
例18: シンプルなストラテジー(バックテスト)
SMAクロスで売買するストラテジー。strategy()宣言に切り替えるだけで、バックテストが実行できる。
//@version=6
strategy("SMAクロス戦略", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
fast = ta.sma(close, 20)
slow = ta.sma(close, 50)
if ta.crossover(fast, slow)
strategy.entry("Long", strategy.long)
if ta.crossunder(fast, slow)
strategy.close("Long")
plot(fast, "SMA20", color.blue)
plot(slow, "SMA50", color.red)
indicator()の代わりにstrategy()を使うとストラテジーモードになる。strategy.entry()でエントリー、strategy.close()で決済。チャート下部の「ストラテジーテスター」タブで損益曲線や勝率を確認できる。
コード例の次のステップ
この記事の18の例でカバーした構文パターンを整理する。
plot() / plotshape() — ライン描画とシグナル表示(例1〜3, 7〜10)。input — ユーザーパラメータの外出し(例4)。bgcolor() / barcolor() — 色の変更(例5, 6, 12)。ta.系関数 — テクニカル計算(例2, 3, 8, 9, 10)。request.security() — マルチタイムフレーム(例11)。var / := — 値の保持と再代入(例13)。関数定義 — 処理のまとめ(例14)。label / table — 動的テキスト表示(例15, 16)。alertcondition() — アラート設定(例17)。strategy — バックテスト(例18)。
これらの構文を組み合わせれば、実用的なオリジナルインジケーターが作れる。次は実際に自分のトレードアイデアをコードにしてみよう。

















