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

TradingViewインジケーター自作|Pineスクリプトで作る手順

TradingViewのインジケーターは自作できる。しかも、プログラミング未経験でも作れる。

TradingViewには「Pineスクリプト」という専用言語が内蔵されており、エディタを開いてコードを書き、「チャートに追加」を押すだけで自作インジケーターがチャートに表示される。環境構築もインストールも不要。ブラウザだけで完結する。

自作するメリットは大きい。無料プランではインジケーター枠が3つしかないが、複数のインジケーターを1つのスクリプトにまとめれば枠を節約できる。EMA3本+RSI+ボリバンを1つのインジケーターに統合すれば、残り2枠を自由に使える。さらに、市販のインジケーターにはない「自分のトレードルールに完全一致するシグナル」を作れる。

この記事では、Pineエディタの開き方から、7つの実用インジケーターの完成コードまで、手順通りに進めれば今日中に自作インジケーターをチャートに表示できる内容を解説する。

Pineスクリプトの実践テクニックを見る

自作インジケーターの作り方 — 5ステップ

インジケーター自作の全体像を先に示す。

ステップ1: Pineエディタを開く。 TradingViewのチャート画面下部にある「Pineエディタ」タブをクリック。

ステップ2: 新規インジケーターを作成。 エディタ右上の「開く」→「新規作成」→「新規インジケーター」を選択。テンプレートコードが表示される。

ステップ3: コードを書く(またはコピペ)。 テンプレートを消して、自分のコードを入力する。

ステップ4: 保存してチャートに追加。 エディタ右上の「保存」でスクリプトを保存。「チャートに追加」でチャートにインジケーターが表示される。

ステップ5: 設定を調整。 チャート左上のインジケーター名の歯車アイコンをクリックすると、パラメータ・色・表示設定を変更できる。

この5ステップで完成だ。コードさえあれば、所要時間は1分もかからない。以下、実際のコードを使って具体的に進めていく。

最初の一歩 — 3行で動くインジケーター

まずは最も短いインジケーターを作って、「自作して動かす」感覚をつかもう。

//@version=6
indicator("はじめてのインジケーター", overlay=true)
plot(ta.sma(close, 25), "25日SMA", color.blue, 2)

このコードをPineエディタに貼り付けて「チャートに追加」を押す。チャートに青い25日移動平均線が表示されるはずだ。

3行の意味を解説する。

1行目の//@version=6はPineスクリプトのバージョン指定。v6が最新だ。2行目のindicator()でインジケーターの名前とタイプを宣言する。overlay=trueはローソク足と同じエリアに描画する設定。3行目のplot()で計算結果をチャートに描画する。ta.sma(close, 25)は終値の25日単純移動平均を計算する組み込み関数だ。

たった3行だが、これは立派な自作インジケーターだ。期間を変えたければ25の数字を変えるだけ。色を変えたければcolor.bluecolor.redに。このシンプルさがPineスクリプトの強みだ。

実用例①: EMA3本セット(短期・中期・長期)

デイトレーダーがまず作るべきインジケーター。短期・中期・長期のEMAを1つにまとめる。

//@version=6
indicator("EMA3本セット", overlay=true)

// パラメータ(設定パネルで変更可能)
fast = input.int(20, "短期EMA", minval=1)
mid = input.int(50, "中期EMA", minval=1)
slow = input.int(200, "長期EMA", minval=1)

// 計算
emaFast = ta.ema(close, fast)
emaMid = ta.ema(close, mid)
emaSlow = ta.ema(close, slow)

// 描画
plot(emaFast, "短期", color.blue, 2)
plot(emaMid, "中期", color.orange, 2)
plot(emaSlow, "長期", color.red, 2)

input.int()を使うことで、設定パネルから期間を変更できる。コードを書き換えなくても、歯車アイコンから20→10に変えればすぐ反映される。

このインジケーター1つで、SMAではなくEMAを使い、好きな期間を3本表示でき、色も自由に変えられる。TradingViewに内蔵されている移動平均線を3つ追加するよりも枠を節約できる。

実用例②: RSI + 買われすぎ・売られすぎゾーン

RSIに色付きのゾーンを追加する。これだけでも見やすさが大幅に上がる。

//@version=6
indicator("RSI with Zone", overlay=false)

length = input.int(14, "RSI期間", minval=1)
ob = input.int(70, "買われすぎ", minval=50, maxval=100)
os = input.int(30, "売られすぎ", minval=0, maxval=50)

rsi = ta.rsi(close, length)

// RSIラインを描画
plot(rsi, "RSI", color.purple, 2)

// 水平線
h1 = hline(ob, "買われすぎ", color.red, hline.style_dashed)
h2 = hline(os, "売られすぎ", color.green, hline.style_dashed)
hline(50, "中間", color.gray, hline.style_dotted)

// ゾーンを塗りつぶし
fill(h1, h2, color=color.new(color.purple, 90))

// 背景色で過熱感を表示
bgcolor(rsi > ob ? color.new(color.red, 85) : rsi < os ? color.new(color.green, 85) : na)

overlay=falseにすると、ローソク足の下の別ウィンドウに表示される。RSIやMACDなどのオシレーター系はこの設定を使う。bgcolor()で背景色を変えると、RSIが70以上のときに赤、30以下のときに緑の背景になり、視覚的に過熱感がわかる。

実用例③: EMAクロスのシグナル矢印

エントリーポイントに矢印を表示するシグナルインジケーター。自作の醍醐味だ。

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

fastLen = input.int(12, "短期EMA")
slowLen = input.int(26, "長期EMA")

fast = ta.ema(close, fastLen)
slow = ta.ema(close, slowLen)

// クロス検出
bullCross = ta.crossover(fast, slow)
bearCross = ta.crossunder(fast, slow)

// EMA描画
plot(fast, "Fast EMA", color.blue, 1)
plot(slow, "Slow EMA", color.red, 1)

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

// アラート設定
alertcondition(bullCross, "EMAゴールデンクロス", "{{ticker}}: 短期EMAが長期EMAを上抜け")
alertcondition(bearCross, "EMAデッドクロス", "{{ticker}}: 短期EMAが長期EMAを下抜け")

ta.crossover()は短期EMAが長期EMAを下から上に突き抜けた瞬間にtrueを返す。plotshape()でその瞬間のバーに矢印を表示する。location.belowbarで矢印をバーの下に、location.abovebarで上に配置する。

alertcondition()を書いておけば、TradingViewのアラート作成画面でこの条件を選択できる。スマホに通知が届くようにしておけば、チャートに張り付いていなくてもエントリータイミングを逃さない。

実用例④: ボリンジャーバンド + 帯の色変化

ボリバンの帯の色をトレンド方向に合わせて変化させる。標準のボリバンとは一味違うインジケーターになる。

//@version=6
indicator("カラーボリンジャー", overlay=true)

length = input.int(20, "期間")
mult = input.float(2.0, "偏差", step=0.1)

[basis, upper, lower] = ta.bb(close, length, mult)

// トレンド判定: basisの傾きで色を変える
basisRising = basis > basis[1]
trendColor = basisRising ? color.new(color.green, 70) : color.new(color.red, 70)

// 描画
p1 = plot(upper, "Upper", color.gray, 1)
p2 = plot(lower, "Lower", color.gray, 1)
plot(basis, "Basis", basisRising ? color.green : color.red, 2)

// 帯を塗りつぶし
fill(p1, p2, color=trendColor)

ta.bb()はボリンジャーバンドの中央線・上限・下限を一度に返す。[basis, upper, lower]で受け取るのはPineスクリプトのタプル分割構文だ。

basis > basis[1]で中央線が前のバーより上なら上昇トレンドと判定し、帯を緑に、下降なら赤にする。視覚的にトレンド方向がわかるので、スクイーズからの方向感の判断に役立つ。

実用例⑤: マルチタイムフレーム移動平均

現在の時間足に上位足のEMAを重ねて表示する。MTF(マルチタイムフレーム)分析に必須のインジケーターだ。

//@version=6
indicator("MTF EMA", overlay=true)

tf = input.timeframe("D", "上位足")
length = input.int(20, "期間")
src = input.source(close, "ソース")

// 上位足のEMAを取得
htfEMA = request.security(syminfo.tickerid, tf, ta.ema(src, length))

// 描画
plot(htfEMA, "HTF EMA", color.orange, 3)
plot(ta.ema(src, length), "現在足 EMA", color.blue, 1)

request.security()で上位足のデータを取得する。日足のEMAを5分足チャートに重ねて表示すれば、大きな方向感を把握しながら短い時間足でエントリーを探せる。

input.timeframe()を使えば、設定パネルから上位足を自由に変更できる。日足→週足→4時間足と切り替えながら、自分のトレードスタイルに合うMTF設定を見つけよう。

Pineスクリプトの基本構文をもっと詳しく学びたい方はこちら。

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

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

実用例⑥: 複数インジケーター統合(枠節約)

EMA + RSI背景 + 出来高カラーを1つのインジケーターに統合する。無料プランの3枠制限を最大限に活用するテクニックだ。

//@version=6
indicator("オールインワン", overlay=true)

// === EMA設定 ===
showEMA = input.bool(true, "EMA表示", group="EMA")
ema1Len = input.int(20, "短期", group="EMA")
ema2Len = input.int(50, "中期", group="EMA")
ema3Len = input.int(200, "長期", group="EMA")

// === RSI設定 ===
showRSI = input.bool(true, "RSI背景", group="RSI")
rsiLen = input.int(14, "期間", group="RSI")
rsiOB = input.int(70, "買われすぎ", group="RSI")
rsiOS = input.int(30, "売られすぎ", group="RSI")

// === 出来高設定 ===
showVol = input.bool(true, "出来高バー色", group="出来高")
volLen = input.int(20, "平均期間", group="出来高")

// === 計算 ===
ema1 = ta.ema(close, ema1Len)
ema2 = ta.ema(close, ema2Len)
ema3 = ta.ema(close, ema3Len)
rsi = ta.rsi(close, rsiLen)
volMA = ta.sma(volume, volLen)

// === EMA描画 ===
plot(showEMA ? ema1 : na, "短期EMA", color.blue, 2)
plot(showEMA ? ema2 : na, "中期EMA", color.orange, 2)
plot(showEMA ? ema3 : na, "長期EMA", color.red, 2)

// === RSI背景 ===
rsiBG = showRSI and rsi > rsiOB ? color.new(color.red, 90) : showRSI and rsi < rsiOS ? color.new(color.green, 90) : na
bgcolor(rsiBG, title="RSI背景")

// === 出来高によるバー色 ===
highVol = volume > volMA * 1.5
barcolor(showVol and highVol ? (close > open ? color.lime : color.fuchsia) : na, title="出来高バー色")

group引数で設定パネルを「EMA」「RSI」「出来高」にセクション分けしている。input.bool()で各機能のON/OFFを切り替えられるので、不要な機能は非表示にできる。

barcolor()は出来高が20日平均の1.5倍を超えたバーの色を変える。陽線ならライムグリーン、陰線ならマゼンタ。大口の参入をローソク足の色で可視化する。

この1つのインジケーターで、EMA3本、RSI背景、出来高ハイライトの3機能が動く。インジケーター枠を3つ使う代わりに1つで済む。

実用例⑦: 前日高安 + ピボットポイント

デイトレーダー必須の価格レベルを自動表示する。

//@version=6
indicator("前日高安 + ピボット", overlay=true)

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

// ピボットポイント
pp = (pdh + pdl + pdc) / 3
r1 = 2 * pp - pdl
s1 = 2 * pp - pdh

// 描画
plot(pdh, "前日高値", color.red, 2, plot.style_stepline)
plot(pdl, "前日安値", color.green, 2, plot.style_stepline)
plot(pp, "PP", color.yellow, 2, plot.style_stepline)
plot(r1, "R1", color.new(color.red, 40), 1, plot.style_stepline)
plot(s1, "S1", color.new(color.green, 40), 1, plot.style_stepline)

plot.style_steplineで階段状の水平ラインを表示する。日足の値は日中変わらないので、水平線として描画される。前日の高値・安値はサポレジとして意識されやすい価格帯だ。

よくあるエラーと対処法

自作中に遭遇しやすいエラーを整理する。

「Could not find function or function reference」 — 関数名のスペルミス。ta.smata.SMAと大文字にしたり、ta.の付け忘れが多い。v6では組み込み関数にはすべてta.プレフィックスが必要だ。

「Cannot call 'plot' with argument 'series'='...' An argument of 'series float' was used but a 'input float' is expected」hline()に変数を渡している。hline()は定数のみ受け付ける。変数を水平線にしたいならplot()を使う。

「Script has too many local scopes」if文やループのネストが深すぎる。PineスクリプトにはローカルスコープのAJ限がある。ロジックを関数に分割して対処する。

「Study error: Script could not be translated from: null」 — バージョン指定がない。1行目に//@version=6を忘れている。

「Max number of drawings exceeded」line.new()label.new()をループ内で大量に生成している。indicator()max_lines_count=500を指定するか、不要な描画をline.delete()で削除する。

チャートに何も表示されないoverlay=trueを指定していないのにメインチャートに表示しようとしている。オシレーター系ならoverlay=false、価格チャート上に重ねるならoverlay=trueを確認する。

自作インジケーターの保存と共有

作ったインジケーターは自動的にTradingViewのクラウドに保存される。デバイスが変わっても「マイスクリプト」からいつでもアクセスできる。

保存方法 — エディタの「保存」ボタン、またはCtrl+S(Mac: Cmd+S)。初回保存時にスクリプト名を入力する。

公開方法 — エディタの「公開」ボタンからTradingViewコミュニティに公開できる。「公開」はソースコードが見える状態、「招待限定」は指定したユーザーのみアクセス可能、「非公開」はURLを知っている人のみ。

エクスポート — Pineスクリプトにはファイルエクスポート機能はないが、コードをテキストファイルにコピペしてローカルにバックアップできる。GitHubで管理するのもおすすめだ。

他人のスクリプトを編集する — TradingViewの「コミュニティスクリプト」にはオープンソースのインジケーターが大量にある。気に入ったスクリプトを「ソースコードを表示」→「コピーを作成」で自分のエディタに複製し、改変できる。これが最も効率的な学習方法だ。

コミュニティスクリプトから学ぶ

自作スキルを最速で伸ばす方法は、他人のコードを読むことだ。TradingViewには数万のオープンソースインジケーターが公開されている。

「インジケーター」検索画面で「コミュニティスクリプト」タブを開くと、世界中のトレーダーが公開したインジケーターが一覧で表示される。気に入ったものを見つけたら「ソースコードを表示」をクリックし、Pineエディタで「コピーを作成」すれば自分のスクリプトとして編集できる。

効果的な学習手順はこうだ。まず、自分が普段使っているインジケーター(RSI、MACD、ボリバンなど)の公式ソースコードを読む。TradingViewの内蔵インジケーターはすべてPineスクリプトで書かれており、ソースコードが公開されている。次に、そのコードの一部を変更してみる。期間を変える、色を変える、条件を追加する。小さな変更を繰り返すことで、構文とロジックの両方が身につく。

上級者のスクリプトには、groupinlineを使った設定パネルの設計、request.security()を使ったMTF実装、arrayを使った動的データ管理など、独学では気づきにくいテクニックが詰まっている。コードを読んで「なぜこう書いているのか」を考える習慣が、自作スキルを飛躍的に伸ばす。

インジケーターからストラテジーへ

シグナルインジケーターが完成したら、次はストラテジー化してバックテストしよう。

//@version=6
strategy("EMAクロス戦略", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

fastLen = input.int(12, "短期EMA")
slowLen = input.int(26, "長期EMA")

fast = ta.ema(close, fastLen)
slow = ta.ema(close, slowLen)

if ta.crossover(fast, slow)
    strategy.entry("Long", strategy.long)
if ta.crossunder(fast, slow)
    strategy.close("Long")

plot(fast, "Fast", color.blue)
plot(slow, "Slow", color.red)

indicator()strategy()に変えるだけで、バックテスト機能が使えるようになる。strategy.entry()でエントリー、strategy.close()でクローズ。TradingViewの「ストラテジーテスター」タブに勝率・PF・最大ドローダウンなどの成績が表示される。

ストラテジーの検証方法を詳しく知りたい方はこちら。

Pineスクリプトで勝てるストラテジーを作る方法|検証の実際

まとめ

TradingViewのインジケーター自作は、Pineエディタを開いてコードを書くだけ。環境構築不要、3行から始められる。

まずは本記事のコードをコピペして動かすところから始めよう。EMA3本セット、RSIゾーン、シグナル矢印、ボリバン色変化、MTF、オールインワン、前日高安ピボット。この7つの実用例をベースに、自分のトレードルールに合わせてパラメータや条件をカスタマイズすれば、市販品では手に入らない「自分専用のインジケーター」が完成する。

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

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