Pineスクリプト作成代行はこちら

Pineスクリプトサンプルコード集|コピペで動く実用インジケーター10選

Pineスクリプトを学びたいけど、ゼロから書くのはハードルが高い。まずは動くコードを触りながら覚えたい。

そんな人のために、コピペでそのまま動くPineスクリプトのサンプルコードを10本用意した。すべてv6対応、すべて実用的なインジケーターだ。「教材用の最小コード」ではなく、実際のトレードで使えるレベルのコードを厳選している。

使い方は簡単だ。TradingViewのPineエディタを開き、コードをコピペして「チャートへ追加」をクリックするだけ。動作を確認したら、パラメータを変えたりロジックを改造したりして、自分のオリジナルに育てていってほしい。

Pineスクリプトの実践的な活用法を見る

サンプルの使い方

コードの貼り付け手順を確認しておこう。

TradingViewでチャートを開き、画面下部の「Pineエディタ」タブをクリックする。エディタが開いたら、既存のコードをすべて削除し、この記事のサンプルコードを貼り付ける。右上の「保存」をクリックし、任意の名前で保存する。そのまま「チャートへ追加」をクリックすれば、チャート上にインジケーターが表示される。

各サンプルにはinput関数でパラメータを設定してあるので、チャートに追加した後でインジケーターの設定画面から数値や色を自由に変更できる。

① EMAクロス+シグナル矢印

移動平均線のクロスでシグナルを表示する、最も基本的なインジケーター。短期EMAが長期EMAを上抜けたら買いシグナル、下抜けたら売りシグナルを矢印で表示する。

//@version=6
indicator("EMAクロス シグナル", overlay=true)

// パラメータ
fastLen = input.int(12, "短期EMA", minval=1, group="EMA設定")
slowLen = input.int(26, "長期EMA", minval=1, group="EMA設定")
showSignal = input.bool(true, "シグナル表示", group="表示設定")

// 計算
emaFast = ta.ema(close, fastLen)
emaSlow = ta.ema(close, slowLen)

// クロス判定
bullCross = ta.crossover(emaFast, emaSlow)
bearCross = ta.crossunder(emaFast, emaSlow)

// EMA描画
plot(emaFast, "短期EMA", color.new(color.blue, 0), 2)
plot(emaSlow, "長期EMA", color.new(color.red, 0), 2)

// シグナル矢印
plotshape(showSignal and bullCross, "買い", shape.triangleup, location.belowbar, color.green, size=size.small)
plotshape(showSignal and bearCross, "売り", shape.triangledown, location.abovebar, color.red, size=size.small)

// クロス時にアラート
alertcondition(bullCross, "ゴールデンクロス", "{{ticker}}: EMAゴールデンクロス発生")
alertcondition(bearCross, "デッドクロス", "{{ticker}}: EMAデッドクロス発生")

ポイントはta.crossover()ta.crossunder()だ。前のバーでは条件を満たさず、現在のバーで初めて条件を満たした瞬間だけtrueを返す。これにより、クロスした1本目のバーにだけ矢印が出る。

② ボリンジャーバンド+スクイーズ検知

ボリンジャーバンドの幅が縮小する「スクイーズ」を自動検知し、背景色で可視化するインジケーター。スクイーズはブレイクアウトの前兆として多くのトレーダーに注目されている。

//@version=6
indicator("BB スクイーズ検知", overlay=true)

// パラメータ
length = input.int(20, "BB期間", minval=1)
mult = input.float(2.0, "BB倍率", minval=0.1, step=0.1)
sqzLen = input.int(120, "スクイーズ判定期間", minval=20)
sqzPct = input.float(20.0, "スクイーズ閾値(%)", minval=5, maxval=50, tooltip="BBの幅が指定期間内の下位何%に入ったらスクイーズとみなすか")

// ボリンジャーバンド計算
[upper, middle, lower] = ta.bb(close, length, mult)
bbWidth = upper - lower

// スクイーズ判定: BB幅が過去N本の中で下位X%に入ったら
lowestWidth = ta.lowest(bbWidth, sqzLen)
highestWidth = ta.highest(bbWidth, sqzLen)
widthRange = highestWidth - lowestWidth
sqzThreshold = lowestWidth + widthRange * (sqzPct / 100)
isSqueeze = bbWidth <= sqzThreshold

// 描画
plot(upper, "Upper", color.new(color.blue, 30))
plot(middle, "Middle", color.new(color.blue, 60), style=plot.style_circles)
plot(lower, "Lower", color.new(color.blue, 30))
fill(plot(upper, display=display.none), plot(lower, display=display.none), color=color.new(color.blue, 92))

bgcolor(isSqueeze ? color.new(color.yellow, 85) : na)

スクイーズの判定ロジックは「BB幅が過去N本の中で下位X%に入ったかどうか」で行っている。固定値ではなく相対的に判定するので、ボラティリティの異なる銘柄でも機能する。

③ RSI+ダイバージェンス検知

RSIの値だけでなく、価格とRSIの乖離(ダイバージェンス)を自動検出するインジケーター。隠れた転換シグナルを見逃さない。

//@version=6
indicator("RSI ダイバージェンス", overlay=false)

// パラメータ
rsiLen = input.int(14, "RSI期間", minval=2)
lbBack = input.int(5, "ピボット左バー", minval=1)
lbFwd = input.int(5, "ピボット右バー", minval=1)
obLevel = input.int(70, "買われすぎ")
osLevel = input.int(30, "売られすぎ")

// RSI計算
rsi = ta.rsi(close, rsiLen)

// ピボット検出
pivotLow = ta.pivotlow(rsi, lbBack, lbFwd)
pivotHigh = ta.pivothigh(rsi, lbBack, lbFwd)

// ブリッシュ・ダイバージェンス: 価格は安値更新、RSIは安値切り上げ
var float prevPivLowPrice = na
var float prevPivLowRSI = na
var int prevPivLowBar = na

bullDiv = false
if not na(pivotLow)
    if not na(prevPivLowPrice)
        if low[lbFwd] < prevPivLowPrice and pivotLow > prevPivLowRSI
            bullDiv := true
    prevPivLowPrice := low[lbFwd]
    prevPivLowRSI := pivotLow
    prevPivLowBar := bar_index - lbFwd

// ベアリッシュ・ダイバージェンス: 価格は高値更新、RSIは高値切り下げ
var float prevPivHighPrice = na
var float prevPivHighRSI = na
var int prevPivHighBar = na

bearDiv = false
if not na(pivotHigh)
    if not na(prevPivHighPrice)
        if high[lbFwd] > prevPivHighPrice and pivotHigh < prevPivHighRSI
            bearDiv := true
    prevPivHighPrice := high[lbFwd]
    prevPivHighRSI := pivotHigh
    prevPivHighBar := bar_index - lbFwd

// 描画
plot(rsi, "RSI", color.purple, 2)
hline(obLevel, "買われすぎ", color.new(color.red, 50))
hline(osLevel, "売られすぎ", color.new(color.green, 50))
hline(50, "50", color.new(color.gray, 70))

plotshape(bullDiv, "強気乖離", shape.labelup, location.bottom, color.green, text="Bull", textcolor=color.white, size=size.tiny, offset=-lbFwd)
plotshape(bearDiv, "弱気乖離", shape.labeldown, location.top, color.red, text="Bear", textcolor=color.white, size=size.tiny, offset=-lbFwd)

ダイバージェンスの検出にはta.pivotlow()ta.pivothigh()でRSIのピボット(山と谷)を特定し、前回のピボットと比較している。offset=-lbFwdにより、シグナルがピボット確定位置に正しく表示される。

④ ATRベースの動的サポレジライン

ATR(Average True Range)を使って、現在のボラティリティに応じたサポートラインとレジスタンスラインを自動描画する。固定幅のラインではなく、相場の勢いに連動するのが特徴だ。

//@version=6
indicator("ATR サポレジ", overlay=true)

// パラメータ
atrLen = input.int(14, "ATR期間", minval=1)
atrMult = input.float(1.5, "ATR倍率", minval=0.1, step=0.1)
src = input.source(close, "ソース")

// 計算
atrValue = ta.atr(atrLen)
basis = ta.sma(src, atrLen)
upperBand = basis + atrValue * atrMult
lowerBand = basis - atrValue * atrMult

// トレンド判定
isAbove = close > basis

// 描画
basisPlot = plot(basis, "基準線", color.gray, 1)
upperPlot = plot(upperBand, "レジスタンス", color.new(color.red, 20), 2)
lowerPlot = plot(lowerBand, "サポート", color.new(color.green, 20), 2)
fill(upperPlot, basisPlot, color=color.new(color.red, 92))
fill(basisPlot, lowerPlot, color=color.new(color.green, 92))

// バーが上下バンドを超えたらマーク
plotshape(ta.crossover(close, upperBand), "上抜け", shape.diamond, location.abovebar, color.red, size=size.tiny)
plotshape(ta.crossunder(close, lowerBand), "下抜け", shape.diamond, location.belowbar, color.green, size=size.tiny)

fill()で帯状に色を塗ることで、サポートゾーンとレジスタンスゾーンが視覚的に把握しやすくなる。ATR倍率を大きくするとバンドが広がり、小さくすると狭まる。

⑤ 出来高プロファイル(簡易版)

直近N本のバーの出来高を価格帯別に集計し、テーブルで表示する簡易的な出来高プロファイル。本格的なVPに近い情報をPineスクリプトだけで実現する。

//@version=6
indicator("簡易出来高プロファイル", overlay=true)

// パラメータ
lookback = input.int(100, "集計バー数", minval=20, maxval=500)
numBins = input.int(10, "価格帯数", minval=5, maxval=20)
tablePos = input.string("右上", "テーブル位置", options=["左上", "右上", "左下", "右下"])

// テーブル位置の変換
pos = switch tablePos
    "左上" => position.top_left
    "右上" => position.top_right
    "左下" => position.bottom_left
    "右下" => position.bottom_right
    => position.top_right

// 価格レンジの計算
highestPrice = ta.highest(high, lookback)
lowestPrice = ta.lowest(low, lookback)
priceRange = highestPrice - lowestPrice
binSize = priceRange / numBins

// 出来高の集計
var table vpTable = table.new(pos, 3, numBins + 1, bgcolor=color.new(color.black, 80), border_width=1)

if barstate.islast
    // ヘッダー
    table.cell(vpTable, 0, 0, "価格帯", text_color=color.gray, text_size=size.tiny)
    table.cell(vpTable, 1, 0, "出来高", text_color=color.gray, text_size=size.tiny)
    table.cell(vpTable, 2, 0, "バー", text_color=color.gray, text_size=size.tiny)

    // 各価格帯の出来高を集計
    maxVol = 0.0
    volArray = array.new(numBins, 0.0)
    for i = 0 to lookback - 1
        binIndex = math.min(int((close[i] - lowestPrice) / binSize), numBins - 1)
        if binIndex >= 0 and binIndex < numBins
            currentVol = array.get(volArray, binIndex) + volume[i]
            array.set(volArray, binIndex, currentVol)
            if currentVol > maxVol
                maxVol := currentVol

    // テーブルに描画
    for i = 0 to numBins - 1
        priceLevel = lowestPrice + binSize * i
        vol = array.get(volArray, i)
        barLen = maxVol > 0 ? int(vol / maxVol * 10) : 0
        barStr = str.repeat("█", barLen)
        isCurrentBin = close >= priceLevel and close < priceLevel + binSize
        txtColor = isCurrentBin ? color.yellow : color.white

        table.cell(vpTable, 0, i + 1, str.tostring(priceLevel, "#.##"), text_color=txtColor, text_size=size.tiny)
        table.cell(vpTable, 1, i + 1, str.tostring(vol, "#"), text_color=txtColor, text_size=size.tiny)
        table.cell(vpTable, 2, i + 1, barStr, text_color=color.teal, text_size=size.tiny, text_halign=text.align_left)

テーブル表示で出来高の多い価格帯が一目でわかる。現在の価格が属する価格帯は黄色でハイライトされる。str.repeat()で棒グラフ風の表示を実現しているのがポイントだ。

構文の基礎をもう少しじっくり理解したい方はこちら。

Pineスクリプトの書き方|基本構文をコード付きで完全解説

Pineスクリプトの活用テクニックを探す

⑥ マルチタイムフレームMA表示

上位足の移動平均線を現在のチャートに重ねて表示する。15分足チャートに日足のSMAを表示するなど、マルチタイムフレーム分析に必須のインジケーターだ。

//@version=6
indicator("MTF 移動平均線", overlay=true)

// パラメータ
tf1 = input.timeframe("60", "時間足1", group="タイムフレーム")
tf2 = input.timeframe("D", "時間足2", group="タイムフレーム")
maLen = input.int(20, "MA期間", minval=1, group="MA設定")
maType = input.string("EMA", "MA種類", options=["SMA", "EMA", "WMA"], group="MA設定")

// MA計算関数
calcMA(src, len, typ) =>
    switch typ
        "SMA" => ta.sma(src, len)
        "EMA" => ta.ema(src, len)
        "WMA" => ta.wma(src, len)
        => ta.ema(src, len)

// 上位足データ取得
ma1 = request.security(syminfo.tickerid, tf1, calcMA(close, maLen, maType))
ma2 = request.security(syminfo.tickerid, tf2, calcMA(close, maLen, maType))

// 現在の足のMA
maCurrent = calcMA(close, maLen, maType)

// 描画
plot(maCurrent, "現在足 " + maType, color.new(color.gray, 40), 1)
plot(ma1, tf1 + " " + maType, color.new(color.blue, 0), 2)
plot(ma2, tf2 + " " + maType, color.new(color.orange, 0), 3)

request.security()の第2引数にinput.timeframe()で取得した値を渡すことで、ユーザーが設定画面から時間足を自由に切り替えられる。v6ではダイナミックリクエストが標準なので、このコードはそのまま動く。

⑦ 市場セッション時間帯ハイライト

東京・ロンドン・ニューヨークの各市場時間を背景色でハイライトする。FXトレーダーなら必ず入れておきたいインジケーターだ。

//@version=6
indicator("市場セッション", overlay=true)

// パラメータ
showTokyo = input.bool(true, "東京セッション", group="表示設定")
showLondon = input.bool(true, "ロンドンセッション", group="表示設定")
showNY = input.bool(true, "NYセッション", group="表示設定")
tokyoColor = input.color(color.new(color.red, 90), "東京色", group="色設定")
londonColor = input.color(color.new(color.green, 90), "ロンドン色", group="色設定")
nyColor = input.color(color.new(color.blue, 90), "NY色", group="色設定")

// セッション判定
tokyoSession = not na(time(timeframe.period, "0000-0900", "Asia/Tokyo"))
londonSession = not na(time(timeframe.period, "0800-1630", "Europe/London"))
nySession = not na(time(timeframe.period, "0930-1600", "America/New_York"))

// 背景色
bgcolor(showTokyo and tokyoSession ? tokyoColor : na, title="東京")
bgcolor(showLondon and londonSession ? londonColor : na, title="ロンドン")
bgcolor(showNY and nySession ? nyColor : na, title="NY")

// セッション開始ラインの表示
if showTokyo and tokyoSession and not tokyoSession[1]
    line.new(bar_index, high, bar_index, low, color=color.red, style=line.style_dotted, extend=extend.both)
if showLondon and londonSession and not londonSession[1]
    line.new(bar_index, high, bar_index, low, color=color.green, style=line.style_dotted, extend=extend.both)
if showNY and nySession and not nySession[1]
    line.new(bar_index, high, bar_index, low, color=color.blue, style=line.style_dotted, extend=extend.both)

time()関数の第3引数でタイムゾーンを指定しているのがポイントだ。これにより、TradingViewのチャートがどのタイムゾーンに設定されていても、正しいセッション時間が判定される。夏時間にも自動で対応する。

時間指定のロジックをもっと詳しく知りたい方はこちら。

Pineスクリプトで時間指定する方法|東京・ロンドン・NY時間の実装コード

⑧ 前日の高値・安値・終値ライン

前日の高値(PDH)、安値(PDL)、終値(PDC)を水平線として当日のチャートに表示する。デイトレーダーが意識する価格帯を自動で可視化できる。

//@version=6
indicator("前日 高値・安値・終値", overlay=true)

// パラメータ
showPDH = input.bool(true, "前日高値", group="表示")
showPDL = input.bool(true, "前日安値", group="表示")
showPDC = input.bool(true, "前日終値", group="表示")
pdhColor = input.color(color.red, "高値色", group="色")
pdlColor = input.color(color.green, "安値色", group="色")
pdcColor = input.color(color.orange, "終値色", group="色")

// 前日データ取得
pdh = request.security(syminfo.tickerid, "D", high[1])
pdl = request.security(syminfo.tickerid, "D", low[1])
pdc = request.security(syminfo.tickerid, "D", close[1])

// 描画
plot(showPDH ? pdh : na, "PDH", pdhColor, 2, plot.style_stepline_diamond)
plot(showPDL ? pdl : na, "PDL", pdlColor, 2, plot.style_stepline_diamond)
plot(showPDC ? pdc : na, "PDC", pdcColor, 1, plot.style_stepline)

request.security()で日足のhigh[1]を取得することで、前日の高値を得ている。[1]を付けないと当日のデータ(リアルタイムで変動する値)になるので注意。plot.style_stepline_diamondで階段状のラインとして描画し、日足の切り替わりが視覚的にわかるようにしている。

⑨ EMAクロス・ストラテジー(バックテスト用)

EMAのクロスでエントリーし、ATRベースの損切り・利確で決済するストラテジー。バックテストの結果をストラテジーテスターで確認できる。

//@version=6
strategy("EMAクロス戦略", overlay=true, initial_capital=1000000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.1)

// パラメータ
fastLen = input.int(12, "短期EMA", minval=1, group="EMA")
slowLen = input.int(26, "長期EMA", minval=1, group="EMA")
atrLen = input.int(14, "ATR期間", minval=1, group="リスク")
slMult = input.float(2.0, "損切り(ATR倍)", minval=0.1, step=0.1, group="リスク")
tpMult = input.float(3.0, "利確(ATR倍)", minval=0.1, step=0.1, group="リスク")

// 計算
emaFast = ta.ema(close, fastLen)
emaSlow = ta.ema(close, slowLen)
atr = ta.atr(atrLen)

// エントリー条件
longCond = ta.crossover(emaFast, emaSlow)
shortCond = ta.crossunder(emaFast, emaSlow)

// ロングエントリー
if longCond
    slPrice = close - atr * slMult
    tpPrice = close + atr * tpMult
    strategy.entry("Long", strategy.long)
    strategy.exit("Long Exit", from_entry="Long", stop=slPrice, limit=tpPrice)

// ショートでクローズ(ドテンせず決済のみ)
if shortCond
    strategy.close("Long")

// 描画
plot(emaFast, "EMA Fast", color.blue, 2)
plot(emaSlow, "EMA Slow", color.red, 2)
bgcolor(strategy.position_size > 0 ? color.new(color.green, 92) : na)

損切り・利確をATR基準にしているため、ボラティリティに応じて自動的に幅が調整される。strategy.exit()from_entryにエントリーIDを指定するのはv6の必須事項だ。バックテスト結果はチャート下部の「ストラテジーテスター」タブで確認できる。

⑩ マルチ情報ダッシュボード

RSI、MACD、ATR、出来高比率、トレンド判定などの情報を1つのテーブルにまとめて表示するダッシュボード型インジケーター。複数のインジケーターを同時に確認できる。

//@version=6
indicator("トレードダッシュボード", overlay=true)

// パラメータ
rsiLen = input.int(14, "RSI期間")
emaLen = input.int(20, "EMA期間")
atrLen = input.int(14, "ATR期間")

// 計算
rsi = ta.rsi(close, rsiLen)
ema = ta.ema(close, emaLen)
atr = ta.atr(atrLen)
[macdLine, signalLine, hist] = ta.macd(close, 12, 26, 9)
avgVol = ta.sma(volume, 20)
volRatio = volume / avgVol

// トレンド判定
trend = close > ema and ema > ema[1] ? "上昇" : close < ema and ema < ema[1] ? "下降" : "レンジ"
trendColor = trend == "上昇" ? color.green : trend == "下降" ? color.red : color.gray

// RSI判定
rsiZone = rsi > 70 ? "過熱" : rsi < 30 ? "売られ" : "中立"
rsiColor = rsi > 70 ? color.red : rsi < 30 ? color.green : color.gray

// MACD判定
macdSignal = hist > 0 and hist > hist[1] ? "強気↑" : hist > 0 ? "強気" : hist < 0 and hist < hist[1] ? "弱気↓" : "弱気"
macdColor = hist > 0 ? color.green : color.red

// テーブル作成
var table dash = table.new(position.top_right, 2, 7, bgcolor=color.new(color.black, 75), border_width=1, border_color=color.new(color.gray, 60))

if barstate.islast
    // ヘッダー
    table.cell(dash, 0, 0, syminfo.ticker, text_color=color.white, text_size=size.normal, bgcolor=color.new(color.blue, 60))
    table.cell(dash, 1, 0, str.tostring(close, format.mintick), text_color=color.white, text_size=size.normal, bgcolor=color.new(color.blue, 60))
    // トレンド
    table.cell(dash, 0, 1, "トレンド", text_color=color.gray, text_size=size.small)
    table.cell(dash, 1, 1, trend, text_color=trendColor, text_size=size.small)
    // RSI
    table.cell(dash, 0, 2, "RSI(" + str.tostring(rsiLen) + ")", text_color=color.gray, text_size=size.small)
    table.cell(dash, 1, 2, str.tostring(rsi, "#.#") + " " + rsiZone, text_color=rsiColor, text_size=size.small)
    // MACD
    table.cell(dash, 0, 3, "MACD", text_color=color.gray, text_size=size.small)
    table.cell(dash, 1, 3, macdSignal, text_color=macdColor, text_size=size.small)
    // ATR
    table.cell(dash, 0, 4, "ATR(" + str.tostring(atrLen) + ")", text_color=color.gray, text_size=size.small)
    table.cell(dash, 1, 4, str.tostring(atr, format.mintick), text_color=color.white, text_size=size.small)
    // 出来高比率
    table.cell(dash, 0, 5, "出来高比", text_color=color.gray, text_size=size.small)
    table.cell(dash, 1, 5, str.tostring(volRatio, "#.##") + "x", text_color=volRatio > 1.5 ? color.yellow : color.white, text_size=size.small)
    // EMA
    table.cell(dash, 0, 6, "EMA(" + str.tostring(emaLen) + ")", text_color=color.gray, text_size=size.small)
    table.cell(dash, 1, 6, str.tostring(ema, format.mintick), text_color=color.white, text_size=size.small)

table.new()でチャート右上にダッシュボードを固定配置している。各指標の状態を色分けすることで、チャートを見ながら複数の判断材料を一画面で確認できる。出来高が通常の1.5倍を超えると黄色でハイライトされるなど、実用的な工夫も入れてある。

サンプルのカスタマイズ方法

10本のサンプルはすべてinput関数でパラメータを外出ししてあるので、コードを書き換えずに数値を調整できる。チャートにインジケーターを追加した後、歯車アイコンから設定画面を開いてパラメータを変更するだけだ。

より深いカスタマイズをしたい場合は、コードを直接編集する。たとえば、①のEMAクロスにRSIフィルターを追加するなら、エントリー条件にRSIの閾値チェックを加えればいい。

// RSIフィルターを追加する例
rsi = ta.rsi(close, 14)
bullCross = ta.crossover(emaFast, emaSlow) and rsi < 70   // 買われすぎでないとき限定
bearCross = ta.crossunder(emaFast, emaSlow) and rsi > 30   // 売られすぎでないとき限定

複数のサンプルのロジックを組み合わせるのも有効だ。⑦のセッション時間と①のシグナルを組み合わせれば「ロンドン時間のみシグナルを出す」インジケーターが作れる。

まとめ

全10本のサンプルをv6対応・コピペ可能な形で紹介した。基本的なEMAクロスから、ダイバージェンス検知、出来高プロファイル、マルチ情報ダッシュボードまで、実用的なインジケーターを網羅している。

まずは気になったサンプルを1つ選んでチャートに追加してみてほしい。動いているコードを読む・改造するのが、Pineスクリプトを最速で習得する方法だ。

Pineスクリプトの実践ノウハウをもっと見る

※当サイトの内容は投資助言を目的としたものではありません。FX取引にはリスクが伴い、投資元本を失う可能性があります。投資判断はご自身の責任でお願いいたします。