Pine Script v6入門:TradingViewでカスタムインジケーターとアラートを作る
Pine Scriptは、TradingView上でindicator、strategy、libraryを記述するための言語です。数行で線を描ける一方、historical barとrealtime barの実行差、timeframe、data context、input変更、alertのsnapshot、repaintingを理解しないまま「signalが出た」と判断すると、過去表示と現在通知が一致しません。本稿は、価格が移動平均から何%離れているかを表示する中立的な学習sampleを使い、version declaration、indicator、input、series、plot、confirmed bar、alertcondition、QAを一段ずつ確認します。利益を狙うstrategyではなく、再現可能な可視化を作ることが目的です。
この記事が役立つ方: Pine Editorを初めて開く人、公開scriptの中身を理解したい人、確定足alertとhistorical/realtime差を安全に学びたい人
まず押さえる重要ポイント
- indicatorは値を計算・表示し、strategyはbroker emulatorで仮想orderをsimulateし、libraryは再利用codeを提供するため、宣言の役割を混同しない。
- Pineはdatasetのbarを順に実行し、open realtime barではupdateごとにrollbackと再計算が起きる。
- input、symbol、timeframe、session、adjustment、script versionを一つの実行条件として保存する。
- barstate.isconfirmedは一つの確認手段だが、request.security、未来data、plot offset等のrepainting原因を自動で全て解決しない。
- alert instanceは作成時のscriptとinput等のsnapshotとして扱い、codeや設定変更後は既存alertの再作成要否を確認する。
「動いた」から「説明できる」へ進む6検査
- 01Compile
versionと型を確認しerror・warningを読む
editor message・script hash - 02Data context
symbol、provider、timeframe、session、adjustmentを固定
chart ID・screenshot - 03Historical
warm-upとna、最初の有効barを確認
known-bar table - 04Realtime
open barの変化とclose後の確定を比較
timestamped observations - 05Inputs
境界値、変更時reload、表示単位を検査
test matrix - 06Alert
condition、frequency、message、再作成を照合
alert ID・log
indicator・strategy・libraryの役割を先に決める
indicatorはseriesを計算してchartへplotやdrawingを表示するscriptです。strategyは`strategy()`宣言と`strategy.*`機能を使い、historical/realtime bars上で仮想orderをsimulateします。libraryは他scriptからimportする再利用関数等を公開します。最初の学習では、注文や成績を扱わず、一つの数値を表示するindicatorが挙動を追いやすい入口です。
「買いsignalを作る」から始めると、表示の美しさと収益性を混同しやすくなります。本稿のsampleは、終値と単純移動平均の距離をpercentで表示し、距離が0を上抜いた確定barへ印を付けるだけです。これはmarket stateの可視化例で、entry、exit、stop、quantity、適合性を決めません。indicatorの動作確認後にstrategyへ変える場合は、order timing、commission、slippage、bar assumptionsを新しい仕様として設計します。
| 種類 | 主目的 | 主な出力 | 本稿で扱う範囲 |
|---|---|---|---|
| indicator() | 計算と可視化 | plot・shape・alert event | 学習sample |
| strategy() | 仮想orderのsimulation | trades・tester report | 既存backtest記事へ |
| library() | 再利用codeの共有 | exported function/type | 設計概念のみ |
script typeを変えると実行・検証要件も変わります。単なる名前変更ではありません。
Pineはbarごとに実行され、realtime barでは繰り返し計算される
scriptをchartへ追加すると、利用可能なdatasetの古いbarから新しいbarへ順に実行されます。`close`、`high`等のbuilt-in seriesは現在実行中のbarの値を持ち、`close[1]`は一つ前のbarを参照します。historical barでは確定値を使って原則一回ずつ計算されます。open realtime barでは新しいupdateが来るたびに値が変わり、indicatorは繰り返し実行されます。
realtime update前には、そのbar上の一時的な計算状態を直前の確定状態へ戻すrollbackが起きます。open bar中に一度trueになった条件がclose時にはfalseになり、印が消えることがあります。reload後、以前のrealtime barはhistorical barとして最終値だけで再計算されるため、途中のtickを使った表示は再現されない場合があります。これがrepaintingの一つの経路です。
状態を保持する変数もrealtime再現性に関係します。`var`は通常、最初の初期化後にbarをまたいで値を保持し、`varip`はopen realtime bar内のupdate間でも値を保持できるため、historical barだけでは同じtick列を再生できない設計になり得ます。counterや配列へ値を追加する場合は、初期化条件、reset条件、最大要素数、`barstate.isnew`と`barstate.isconfirmed`の使い分けをREADMEへ明記します。確認時は一時的なplot、Data Window、Pine Logs等で「いつ値が増え、いつ戻り、いつ確定したか」を記録し、debug表示を外す前後で結果が変わらないことをtestします。`varip`を高速化のためだけに選ばず、同じ挙動を通常seriesで説明できる最小sampleを先に作ると、reload差とlogic errorを切り分けやすくなります。
Execution context = script version + inputs + symbol ID + timeframe + session + data adjustmentsHistorical observation = confirmed bar values available after reloadRealtime observation = temporary updates before the bar closes同じcodeでもcontextが違えばdatasetと結果が変わります。中立的なdistance indicatorを一行ずつ読む
先頭の`//@version=6`はlanguage version、`indicator()`はscriptの名称と表示場所を宣言します。`input.int()`は利用者が変更できるlengthを作り、minimumを2に制限します。`ta.sma()`はbarごとにbaselineを計算し、`distancePct`は終値がbaselineから何%離れているかを表します。baselineが0の異常条件では`na`を返し、0除算を避けます。
//@version=6
indicator("Confirmed MA Distance — learning example", overlay = false)
int lengthInput = input.int(20, "Baseline length", minval = 2)
float baseline = ta.sma(close, lengthInput)
float distancePct = baseline == 0.0 ? na : (close / baseline - 1.0) * 100.0
bool crossedAbove = ta.crossover(distancePct, 0.0)
bool confirmedCross = barstate.isconfirmed and crossedAbove
plot(distancePct, "Distance from baseline (%)", color = color.teal, linewidth = 2)
hline(0.0, "Baseline", color = color.gray)
plotshape(confirmedCross, title = "Confirmed cross", style = shape.circle,
location = location.bottom, color = color.orange, size = size.tiny)
alertcondition(confirmedCross, "Confirmed cross above baseline",
"Confirmed MA-distance cross on {{exchange}}:{{ticker}} at {{close}}")教育用の可視化sampleです。売買signal、推奨設定、将来performanceを提供しません。Pine Editorへ貼る前に公式manualの現行versionとcompile messageを確認してください。
`ta.crossover()`は毎bar評価し、その結果と`barstate.isconfirmed`を別に組み合わせます。time-series functionを条件branch内だけで呼ぶと、barごとの履歴が不整合になる可能性があるため、計算を先に行う形はcode reviewもしやすくなります。`plot()`はdistance、`hline()`は0、`plotshape()`は確定crossを表示します。`alertcondition()`はalertを作成できるeventを宣言しますが、codeを追加しただけで通知が自動作成されるわけではありません。
input変更とchart変更を別test caseにする
inputを変更するとscriptは新しい設定でdatasetを再計算します。length 2、20、200は同じindicator名でもwarm-up、滑らかさ、cross回数が違います。結果を見て最良に見えるlengthを選び、その期間だけを成功例にすると過学習になります。学習testではdefault、minimum、典型値、極端値を事前に決め、`na`、scale、最初の有効bar、計算時間を確認します。
| Case | 変更 | 確認 | 失敗例 |
|---|---|---|---|
| A | length minimum | compile・最初の有効値 | naを0扱い |
| B | length default | 式の手計算とplot | 単位label欠落 |
| C | long length | warm-upとhistory depth | bar不足を無視 |
| D | 別timeframe | bar境界・cross時刻 | 同じeventと誤認 |
| E | 別provider/session | dataset差 | ticker文字列だけ保存 |
parameterの優劣ではなく、同じ仕様が説明どおり動くかを確認する表です。
timeframeやsymbolを変えると、scriptが読むbar列そのものが変わります。`request.security()`で別contextを取得する場合は、gaps、lookahead、higher/lower timeframe、confirmed valueを追加設計します。本稿sampleはchart contextだけを使い、multi-timeframe処理を隠しません。高度なdata requestを追加する前に、versionlessの現行Pine manualで推奨patternとlimitationを確認してください。
alertconditionと実際のalert instanceを分ける
`alertcondition()`はindicator利用者がCreate Alert dialogで選べるconditionを定義します。通知を動かすには、chart上でscript、symbol、timeframe、input、condition、frequency、message、expiration、delivery methodを選び、alert instanceを作成します。TradingViewは作成時のscriptとinput等をserver側で動かすsnapshotとして扱うため、chartのinputやcodeを後から変更しても既存instanceが自動的に同じ状態へ更新されると思い込まないでください。
sampleは`barstate.isconfirmed`とcrossを組み合わせ、open bar中の一時crossではなくclose時の条件を対象にします。それでもdata provider revision、session、timeframe、script reload、requested data等の差が消えるわけではありません。alert frequencyもOnce Per Bar Close等の現在の選択肢とconditionを整合させ、TradingViewアラートガイドの台帳へalert IDを保存します。
historical・open realtime・confirmed・reloadを四列で比較する
TradingViewはrepaintingをhistorical計算とrealtime計算・表示が異なる広い現象として説明しています。open barのRSIやMAが更新されるのは一般的な挙動ですが、未来dataを過去へ漏らすlookahead、過去位置へplotするoffset、unconfirmed higher-timeframe value、non-standard chartでのstrategy、intrabar依存等はmisleadingな結果を作り得ます。「repaintする/しない」の一語ではなく、何がいつ変わるかを記述します。
- Historicalを保存
reload直後の確定bar、cross、値をtimestamp付きで記録する。
- Open barを観測
update中のdistanceと一時crossを別列へ記録する。
- Closeを確認
bar確定後にalert conditionとshapeが残るか照合する。
- Reloadする
同じbarがhistoricalになった後、表示と時刻を再比較する。
- Contextを変える
input、timeframe、sessionを一つずつ変更し、差の原因を分離する。
SG Group無料TradingViewインジケーターを使う場合も、説明、input、source、confirmed/realtime挙動を同じchecklistで確認します。indicatorの見た目が整っていることは品質保証ではありません。公開scriptを利用する場合はauthor説明、open/closed source、更新履歴、権限、alert behaviorを確認します。
code・input・限界・alert再作成を一つの仕様書にする
scriptを自分用に保存または共有する前に、目的、計算式、input、単位、symbol/timeframeの想定、na処理、realtime behavior、repainting可能性、alert condition、変更履歴をREADMEへまとめます。「高精度」「勝てる」等の主張ではなく、何を計算し、何を計算しないかを書きます。第三者codeやlicenseを尊重し、理解せずにcopyしたlogicを自作として公開しません。
- Pine version、script version、最終review日を保存する。
- chart screenshotだけでなく、inputと完全symbol IDを添える。
- alert instanceを作り直す条件と、旧instanceを停止する手順を書く。
- known limitation、repainting behavior、data dependencyを利用者向けに説明する。
- strategy化した場合はcommission、slippage、order timing、datasetを新しい検証契約にする。
strategyへ発展させた後の結果は、既存のTradingViewバックテスト完全ガイドでdata quality、cost、trade list、robustness、out-of-sampleの順に確認し、Backtest & Robustness Labへexport dataを読み込めます。本稿はstrategy performanceを再説明せず、indicatorとalertが説明どおり実行されるところまでを責任範囲にします。
よくある質問
Pine Script v6は何に使えますか?
TradingView上のindicator、strategy、libraryを記述できます。利用できる機能と制限はcurrent manualを確認し、script typeごとに検証方法を分けます。
barstate.isconfirmedを使えばrepaintingは完全になくなりますか?
いいえ。open bar確認には役立ちますが、request.securityのlookahead、higher-timeframe未確定値、data revision、plot offset等の原因を自動で解決しません。
alertconditionを書けば通知が始まりますか?
いいえ。conditionをcodeで用意した後、TradingView UIでsymbol、timeframe、input、frequency、message等を選びalert instanceを作成する必要があります。
codeを変更すると既存alertも更新されますか?
自動更新を前提にしないでください。alertは作成時のscriptとinput等のsnapshotとして動作するため、変更後は公式仕様に従い再作成の要否を確認します。
このsampleは売買signalですか?
違います。終値と移動平均のdistanceと確定crossを表示する教育用可視化です。entry、exit、quantity、予測、収益性を決めません。
根拠資料と確認先
- TradingView | Pine Script User ManualPine Script v6のlanguage、concept、visual、writingに関する公式manual入口
- TradingView Pine Script | Execution modelbar-by-bar実行、realtime update、rollback、reloadの公式説明
- TradingView Pine Script | Inputsinput type、設定、変更時のscript再計算
- TradingView Pine Script | Alertsalertcondition、alert、order fill eventとalert instanceの公式概念
- TradingView Pine Script | Repaintinghistorical/realtime差、misleading pattern、確認質問の公式整理
編集・発行: SG Group · 編集方針: TradingView公式ヘルプとPine Script公式文書を優先し、金融市場・商品に関する説明は取引所、監督当局、一次資料で補完しています。機能、データ、料金、接続条件は変わるため、実際の利用前に公式画面とリンク先の最新情報を確認してください。
重要事項: 本記事はTradingViewの画面、チャート、アラート、スクリーナー、ペーパートレード、Pine Script等の一般的な学習情報です。投資助言、売買シグナル、特定商品・データ提供者・ブローカーの推奨、将来価格や利益の保証ではありません。機能、料金、データ、取引所区分、通知、注文連携、Pine Scriptの仕様はプラン・地域・接続先・時点で異なり変更されることがあります。実際の資金を使う前に、TradingView公式資料、データ提供元、接続先事業者の最新条件を確認し、架空データまたはペーパートレードで手順を検証してください。

