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

Pineスクリプト v5→v6移行ガイド|変更点と書き換え方法まとめ

Pineスクリプトのversion5(v5)で書いたコードが、ある日突然エラーになった。ネットで見つけたサンプルコードをコピペしたら動かない。Pineエディタに黄色いハイライトが出て「v6に変換しろ」と言われている。こうした状況に直面している人は多いだろう。

2024年末にPineスクリプトv6がリリースされ、以降の新機能はすべてv6でのみ提供されることになった。v5のスクリプトは引き続き動作するが、今後の開発はv6で行うのが標準だ。つまり、v5のコードを持っている人にとって「移行するかどうか」ではなく「いつ移行するか」の問題になっている。

この記事では、Pineスクリプトv5からv6への主要な変更点を整理し、具体的なコードの書き換え方法を解説する。移行作業で迷わないよう、エラーが出やすいポイントを中心にまとめた。

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

v5とv6の関係を整理する

まず前提を確認しておこう。Pineスクリプトのバージョンは、コードの1行目で宣言する。

//@version=5   // ← v5で動作
//@version=6   // ← v6で動作

v5のスクリプトは今後も動く。TradingViewはv5のサポートを打ち切ったわけではない。チャートに追加済みのv5インジケーターやストラテジーは、そのまま使い続けられる。

ただし、v6で追加された新機能(ダイナミックリクエスト、遅延評価、ストラテジーの取引制限緩和など)はv5では使えない。また、TradingViewのコミュニティで公開されるスクリプトもv6が主流になりつつある。

移行のタイミングとしては「新しいスクリプトを書くとき」か「既存スクリプトを改良するとき」がベストだ。動いているものを急いで変える必要はないが、新規開発はv6で始めることを強くおすすめする。

自動変換ツールの使い方

TradingViewのPineエディタには、v5→v6の自動変換機能が搭載されている。まずはこれを試すのが最も手軽だ。

手順はこうだ。Pineエディタでv5のスクリプトを開くと、1行目の//@version=5が黄色くハイライトされる。エディタ上部の「スクリプトの管理」ドロップダウンメニューから「v6にコードを変換」を選択する。自動変換が実行され、多くの書き換えが自動で行われる。

ただし注意点がある。自動変換はすべてのケースに対応しているわけではない。変換後にコンパイルエラーが出ることがある。特に型の扱いが厳格になった部分(後述)では、手動での修正が必要になるケースが多い。

自動変換を試す前に、必ずv5のコードをバックアップしておくこと。変換後に問題が出たとき、元に戻せるようにしておくのが鉄則だ。

変更点①:bool型の厳格化

v5→v6で最も影響が大きい変更が、bool型の扱いだ。これが原因でエラーになるv5スクリプトは非常に多い。

v5では、intfloatの値を暗黙的にboolとして使えた。たとえばif volumeと書けば、volumeが0以外ならtrue、0ならfalseとして評価された。

v6ではこの暗黙的な型変換ができなくなった。bool型の値はtruefalseのみで、naにもならない。

v5のコード:

//@version=5
indicator("v5の書き方")
if volume    // int を bool として使用
    label.new(bar_index, high, "出来高あり")

v6での書き換え:

//@version=6
indicator("v6の書き方")
if volume > 0    // 明示的に比較する
    label.new(bar_index, high, "出来高あり")

同様に、na()nz()fixnan()はv6ではbool型の引数を受け付けなくなった。v5でnz(someBool)と書いていた場合は、someBool == trueのような明示的な比較に書き換える必要がある。

この変更の意図は「暗黙の型変換によるバグの防止」だ。v5では0false扱いになることで意図しない挙動が生じるケースがあった。v6では型を明示することでコードの安全性が向上している。

変更点②:ダイナミックリクエスト

v6の目玉機能がダイナミックリクエストだ。request.security()をはじめとするrequest.*()関数の挙動が大きく変わった。

v5では、request.security()のシンボル名や時間足にはsimple string型(スクリプト実行中に変わらない値)しか渡せなかった。つまり、1つのrequest.security()呼び出しは常に同じデータソースからデータを取得していた。

v6では、series string型(バーごとに変わる値)を渡せるようになった。これにより、1つのrequest.security()呼び出しで、バーごとに異なるシンボルのデータを取得できるようになった。

さらに、v6ではrequest.*()関数をループや条件分岐の中で呼び出せるようになった。v5ではグローバルスコープでしか呼び出せなかった制約が撤廃されている。

v5のコード:

//@version=5
indicator("v5: 固定リクエスト")
// シンボルごとに個別の呼び出しが必要
close1 = request.security("AAPL", "D", close)
close2 = request.security("GOOGL", "D", close)
close3 = request.security("MSFT", "D", close)

v6での書き換え:

//@version=6
indicator("v6: ダイナミックリクエスト")
symbols = array.from("AAPL", "GOOGL", "MSFT")
closes = array.new()
for i = 0 to array.size(symbols) - 1
    sym = array.get(symbols, i)
    c = request.security(sym, "D", close)
    array.push(closes, c)

v5のスクリプトを移行するとき、既存のrequest.security()呼び出しはそのまま動く。ただし、dynamic_requests = falseを明示的に指定していた場合は削除する必要がある。v6ではコンパイラが自動的にダイナミックリクエストの要否を判定するためだ。

変更点③:遅延評価(Lazy Evaluation)

v6ではandor演算子が遅延評価(短絡評価)を行うようになった。

v5では、condition1 and condition2と書いた場合、condition1falseであってもcondition2が評価されていた。v6では、condition1falseならcondition2は評価されない。orの場合も同様で、最初の条件がtrueなら2番目は評価されない。

この変更にはパフォーマンス向上のメリットがある。不要な計算がスキップされるため、条件分岐が多いスクリプトでは実行速度が改善する。

さらに実用的なメリットとして、安全な条件チェーンが書けるようになった。

//@version=6
indicator("遅延評価の活用")
arr = array.new()
// v5では array.size() が 0 のとき array.get() でエラー
// v6では最初の条件が false なら array.get() は実行されない
if array.size(arr) > 0 and array.get(arr, 0) > 100
    label.new(bar_index, high, "条件成立")

v5では、この書き方は配列が空のときにランタイムエラーになっていた。v6の遅延評価なら、array.size(arr) > 0falseの時点でarray.get()は実行されないため、エラーが起きない。

ただし注意点がある。v5でand/orの右側の式に副作用(変数への代入など)を含めていた場合、v6では実行されないケースが生じる。こうしたコードは書き方を見直す必要がある。

変更点④:strategy関連の変更

ストラテジーを書いている人にとって重要な変更がいくつかある。

まず、strategy.entry()strategy.order()whenパラメータがv6で廃止された。v5ではstrategy.entry("Buy", strategy.long, when = buyCondition)と書けたが、v6ではwhenを使うとコンパイルエラーになる。

v5のコード:

//@version=5
strategy("v5 Strategy")
buyCondition = ta.crossover(ta.sma(close, 20), ta.sma(close, 50))
strategy.entry("Buy", strategy.long, when = buyCondition)

v6での書き換え:

//@version=6
strategy("v6 Strategy")
buyCondition = ta.crossover(ta.sma(close, 20), ta.sma(close, 50))
if buyCondition
    strategy.entry("Buy", strategy.long)

if文で条件を囲むだけだ。コードの可読性もむしろ上がる。

次に、strategy.exit()from_entryパラメータが必須になった。v5ではデフォルトで直前のエントリーに紐づけられていたが、v6では明示的に指定する必要がある。

// v5: from_entry 省略可能
strategy.exit("Exit", profit = 100, loss = 50)

// v6: from_entry 必須
strategy.exit("Exit", from_entry = "Buy", profit = 100, loss = 50)

もうひとつ大きな変更がストラテジーの取引回数制限だ。v5では9000回を超えるとエラーで停止していたが、v6では古い注文が自動的にトリミングされ、計算が継続する。アラートベースのストラテジーを長期間運用する場合に、この変更は大きなメリットになる。

Pineスクリプトの基本構文や関数の使い方に自信がない方は、移行作業の前にこちらで基礎を固めておくと効率的だ。

Pineスクリプト入門|プログラミング未経験でも書ける最初の一歩【v6対応】

v6の関数やキーワードを公式で確認する方法はこちら

変更点⑤:その他の変更点

上記の主要変更に加えて、細かい変更点もまとめておく。

リテラルへのヒストリー参照の禁止。 v5ではclose[1]だけでなく6[1]のようにリテラル値にヒストリー参照演算子[]を適用できたが、v6ではこれがコンパイルエラーになる。リテラルに[]を付けても意味がないため、単にリテラル値のまま使えばいい。

整数同士の割り算の挙動変更。 v5ではconst int同士の割り算は整数を返していたが、v6では小数を返すようになった。7 / 2がv5では3だったものが、v6では3.5になる。整数の結果が欲しい場合はint(7 / 2)のように明示的にキャストする。

switch文のdefaultブロック必須化。 v6では、すべての可能性を網羅していないswitch文にはデフォルトブロック(=>)が必須になった。v5ではデフォルトなしでも動いたが、v6ではコンパイルエラーになる。

plot関数の変更。 plot()style引数にseries型の値を渡せなくなった。v5では条件によってプロットスタイルを動的に変えることができたが、v6ではinput型以下に制限されている。

スコープ数の制限撤廃。 v5では1スクリプト内のスコープ数が550に制限されていたが、v6ではこの制限がなくなった。複雑なスクリプトを書く際の制約が大幅に緩和された。

移行の手順まとめ

実際にv5のスクリプトをv6に移行する手順を整理しておく。

ステップ1は「バックアップ」。v5のコードを別の場所にコピーしておく。変換後に問題が出たとき、いつでもv5に戻せるようにする。

ステップ2は「自動変換の実行」。Pineエディタの「スクリプトの管理」→「v6にコードを変換」を実行する。多くの書き換えはこれで自動処理される。

ステップ3は「コンパイルエラーの修正」。自動変換後にエラーが出た場合、本記事の変更点リストと照らし合わせて手動で修正する。特にbool型の暗黙変換、whenパラメータ、from_entryの指定漏れがエラーの主原因だ。

ステップ4は「動作テスト」。変換後のv6スクリプトをチャートに追加し、v5版と同じ結果が出るか確認する。ストラテジーの場合はバックテスト結果を比較するのが最も確実だ。

ステップ5は「v6新機能の活用」。移行が完了したら、ダイナミックリクエストや遅延評価など、v6ならではの機能を使ってスクリプトを改良していくといい。

よくあるエラーと対処法

v5→v6移行でよく遭遇するエラーとその対処法をまとめる。

「Cannot call ‘na’ with argument ‘x’=’bool’」na()関数にbool型を渡している。v6ではbool型はnaにならないため、na()は使えない。条件を明示的に== true!= falseで書き換える。

「The ‘when’ argument is not supported」strategy.entry()などのwhenパラメータがv6で廃止された。if文で条件分岐に書き換える。

「’from_entry’ argument is required」strategy.exit()from_entryを省略している。エントリーIDを明示的に指定する。

「Cannot use ‘series’ value as argument of ‘style’」plot()style引数にseries型の値を渡している。input型の値に変更するか、条件分岐で複数のplot()を使い分ける。

「A ‘switch’ statement must have a default branch」switch文にデフォルトブロックがない。=> で始まるデフォルトケースを追加する。

エラーメッセージは英語で表示されるが、内容は明確だ。リファレンスマニュアルでエラーに関連する関数を調べれば、正しい書き方が見つかる。

Pineスクリプトリファレンスの読み方|公式マニュアルを使いこなすコツ

v5のまま運用する場合の注意点

すべてのスクリプトを今すぐv6に移行する必要はない。v5のまま運用し続けるという選択も現実的だ。

ただし、以下の点は理解しておくべきだ。

v5に対する新機能の追加は今後行われない。バグ修正やセキュリティアップデートは続くが、新しい関数や構文はv6でのみ利用可能になる。

ネット上のサンプルコードがv6前提になっていく。v5のサンプルを探すのが徐々に難しくなる。TradingViewコミュニティの公開スクリプトもv6が増えている。

v4以前のスクリプトをv6に移行したい場合は、まずv5に変換してからv6に変換する必要がある。一度にv4→v6の変換はできない。段階的な移行が必要だ。

現時点で安定稼働しているv5のスクリプトは急いで移行する必要はないが、新しいスクリプトを書く際はv6を選ぶのが合理的だ。

まとめ

Pineスクリプトv5からv6への移行は、主にbool型の厳格化、ダイナミックリクエストの標準化、遅延評価の導入、strategy関数の変更が柱だ。自動変換ツールで大部分は対応できるが、bool型まわりとstrategy関数のwhen廃止は手動修正が必要になることが多い。

v5は引き続き動作するが、新機能はv6でのみ提供される。新規開発はv6で始め、既存スクリプトは必要に応じて段階的に移行するのがおすすめだ。

Pineスクリプトの最新情報と実践テクニックはこちら

※当サイトの内容は投資助言を目的としたものではありません。FX取引にはリスクが伴い、投資元本を失う可能性があります。投資判断はご自身の責任でお願いいたします。
ABOUT US
アバター画像
松風
現役トレーダー兼Pineスクリプト開発者。自分のトレード戦略を自分でコード化し、検証・運用しています。「トレードがわかる人が書くコード」をモットーに、開発代行・自作支援を行っています。