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

Pineスクリプトエラー一覧と解決方法|よくあるエラーTOP10と対処法

Pineスクリプトを書いていて、赤いエラーメッセージが出た瞬間、手が止まる。英語のエラー文を読んでも、何が間違っているのかわからない。

安心してほしい。Pineスクリプトで遭遇するエラーは、実はパターンが限られている。同じエラーに何度もつまずく人が多いのは、エラーメッセージの「読み方」を知らないからだ。

この記事では、Pineスクリプト開発で実際によく遭遇するエラーをTOP10形式で紹介する。それぞれ「エラーメッセージの原文」「原因」「エラーが出るコード」「修正後のコード」をセットで掲載しているので、同じエラーに遭遇したらこのページに戻ってきて、該当するエラーを探してほしい。

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

エラーの種類 — まず2つに分ける

Pineスクリプトのエラーは大きく2種類ある。対処法が異なるので、まずここを押さえておこう。

コンパイルエラー(Compilation Error)。 「保存」や「チャートに追加」を押した瞬間に出るエラー。コードの文法が間違っている。スペルミス、カッコの閉じ忘れ、型の不一致など。Pineエディタの下部に赤字で表示される。コードを修正しない限り、インジケーターはチャートに追加できない。

ランタイムエラー(Runtime Error)。 チャートに追加した後、実際にデータを処理する段階で発生するエラー。ゼロ除算、配列の範囲外アクセス、描画オブジェクトの上限超過など。チャート上のインジケーター名の横にビックリマークが表示される。特定の銘柄や時間足でだけ発生することもあるため、発見が遅れやすい。

以下のTOP10では、コンパイルエラーを【C】、ランタイムエラーを【R】で表記する。

第1位【C】Mismatched input — 構文の不一致

最も遭遇頻度が高いエラー。Pineスクリプトが「ここにはXが来るはずなのに、Yが書いてある」と言っている。

エラーメッセージ:

Mismatched input 'X' expecting 'Y'

主な原因: カッコの閉じ忘れ、カンマの抜け、引数の順序間違い、予約語のスペルミス。

エラーが出るコード:

//@version=6
indicator("テスト" overlay=true)  // カンマが抜けている
plot(close)

修正後:

//@version=6
indicator("テスト", overlay=true)  // カンマを追加
plot(close)

このエラーが出たら、エラーメッセージに表示されている行番号の周辺を確認しよう。カッコ () の対応関係、カンマ , の有無、引用符 "" の閉じ忘れ。これらが原因の大半だ。

もう1つよくあるパターンが、if文やfor文の後のインデントミス。Pineスクリプトではインデント(字下げ)がコードの構造を決めるため、スペースの数が合っていないとこのエラーになる。

第2位【C】Could not find function or function reference — 関数が見つからない

関数名のスペルミス、または存在しない関数を呼び出そうとしたときに出るエラー。

エラーメッセージ:

Could not find function or function reference 'xxx'

主な原因: 関数名のタイプミス。v6ではta.プレフィックスが必要な組み込み関数に付け忘れている。v4/v5の古い関数名を使っている。

エラーが出るコード:

//@version=6
indicator("テスト")
value = sma(close, 20)     // v4の書き方。v6では動かない
plot(value)

修正後:

//@version=6
indicator("テスト")
value = ta.sma(close, 20)  // v6では ta. プレフィックスが必要
plot(value)

v6でよく引っかかるのがこのパターン。v4ではsma()ema()rsi()と書けたが、v6ではすべてta.sma()ta.ema()ta.rsi()に変わっている。同様に、security()request.security()input()input.int()/input.float()などの型付き関数に変わっている。

ネット上のサンプルコードをコピペしたときに最も発生しやすいエラーなので、バージョン番号を必ず確認しよう。

第3位【C】Cannot call ‘xxx’ with argument — 型の不一致

関数に渡した引数の型が、その関数が期待する型と合っていないときに出るエラー。

エラーメッセージ:

Cannot call 'xxx' with argument 'yyy'. 
An argument of 'series float' type was used but a 'input float' is expected

主な原因: hline()に変数(seriesの値)を渡している。input.int()に小数を渡している。定数を期待する場所に動的な値を入れている。

エラーが出るコード:

//@version=6
indicator("テスト")
level = ta.sma(close, 20)
hline(level)  // hline()は定数のみ。変数は渡せない

修正後:

//@version=6
indicator("テスト")
level = ta.sma(close, 20)
plot(level, style=plot.style_stepline)  // 変数はplot()で描画する

hline()は定数(リテラル値やinput値)しか受け付けない。動的に変わる値を水平線のように表示したい場合は、plot()plot.style_steplineを指定する。

もう1つの頻出パターンは、color引数にseries color型の値を渡すケース。plot()color引数はseries colorを受け付けるが、hline()color引数はinput colorしか受け付けない。

第4位【C】Undeclared identifier — 未宣言の変数

変数を使おうとしたが、その変数がどこにも宣言されていないときに出るエラー。

エラーメッセージ:

Undeclared identifier 'xxx'

主な原因: 変数名のタイプミス。if文の中で宣言した変数を外で使おうとしている。宣言より前の行で変数を参照している。

エラーが出るコード:

//@version=6
indicator("テスト")
if close > open
    myColor = color.green
plot(close, color=myColor)  // myColorはif文の中でしか存在しない

修正後:

//@version=6
indicator("テスト")
myColor = close > open ? color.green : color.red  // 三項演算子で外で宣言
plot(close, color=myColor)

Pineスクリプトでは、if文やfor文の中で宣言した変数は、そのブロックの外からはアクセスできない(スコープの制約)。ブロックの外で使いたい場合は、外で先に変数を宣言しておくか、三項演算子 条件 ? 値A : 値B を使う。

もう1つの原因は単純なタイプミス。colse(closeのミス)、opne(openのミス)など。英語のスペルに自信がなければ、Pineエディタの自動補完機能を活用しよう。

第5位【C】The function should be called on each calculation — 関数のスコープ警告

厳密にはエラーではなく警告(warning)だが、無視すると計算結果がおかしくなるため、ここに含める。

警告メッセージ:

The function 'xxx' should be called on each calculation for consistency. 
It is recommended to extract the call from this scope.

主な原因: ta.crossover()ta.rsi()ta.ema()などの関数をif文の中で呼んでいる。

警告が出るコード:

//@version=6
indicator("テスト")
if close > 100
    cross = ta.crossover(ta.ema(close, 12), ta.ema(close, 26))  // if文の中
    if cross
        label.new(bar_index, high, "Buy")

修正後:

//@version=6
indicator("テスト")
cross = ta.crossover(ta.ema(close, 12), ta.ema(close, 26))  // 外に出す
if close > 100 and cross
    label.new(bar_index, high, "Buy")

ta.crossover()ta.rsi()はバーごとに連続して呼ばれることを前提に設計されている。if文の中に入れると、条件がfalseのバーでは関数が呼ばれず、内部の計算が途切れてしまう。結果として、次に条件がtrueになったときの計算結果が不正確になる。

対処は簡単。これらの関数をすべてグローバルスコープ(if文の外)で呼び、結果を変数に格納してから、if文の条件として使う。

Pineスクリプトの基本構文やスコープのルールについて詳しく知りたい方はこちら。

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

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

第6位【C】Variable was declared with ‘xxx’ type — 型の再代入エラー

整数型で宣言した変数に小数を代入しようとしたときなどに出るエラー。

エラーメッセージ:

Variable 'x' was declared with 'integer' type. 
Cannot assign it expression of type 'series[float]'

主な原因: 変数の初期値で型が自動決定された後、異なる型の値を代入しようとしている。

エラーが出るコード:

//@version=6
indicator("テスト")
x = 0         // 整数型として認識される
x := close    // close は float型。整数型の変数には代入できない
plot(x)

修正後:

//@version=6
indicator("テスト")
x = 0.0       // 0.0にすることでfloat型として認識される
x := close    // float同士なのでOK
plot(x)

Pineスクリプトでは、変数の型は最初の代入で自動的に決まる。x = 0と書くと整数型、x = 0.0と書くとfloat型になる。後から異なる型の値を代入しようとするとエラーになる。

明示的に型を指定する方法もある。float x = 0と書けば、初期値が整数の0でもfloat型として扱われる。

第7位【C】Script must have at least one output function call — 出力関数がない

インジケーターにplot()などの出力関数が1つもないときに出るエラー。

エラーメッセージ:

The script must have at least one output function call 
(e.g. plot, barcolor, etc.). Reason: AST is Empty

主な原因: plot()plotshape()bgcolor()barcolor()などの描画関数を1つも書いていない。計算だけして、結果をどこにも表示していない。

エラーが出るコード:

//@version=6
indicator("テスト")
ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
// 計算しただけで、plotしていない

修正後:

//@version=6
indicator("テスト")
ema20 = ta.ema(close, 20)
ema50 = ta.ema(close, 50)
plot(ema20, "EMA20", color.blue)
plot(ema50, "EMA50", color.red)

インジケーターは「チャートに何かを表示するもの」なので、出力関数が最低1つは必要。もし計算結果を表示する必要がない場合(アラート専用のスクリプトなど)は、plot(na)を1行書いておけばエラーを回避できる。

第8位【R】Array is out of bounds — 配列の範囲外アクセス

配列の存在しないインデックスにアクセスしようとしたときに出るランタイムエラー。

エラーメッセージ:

Array is out of bounds. Index: X, array size: Y

主な原因: array.get()array.remove()で、配列のサイズを超えたインデックスを指定している。空の配列に対して操作を行っている。

エラーが出るコード:

//@version=6
indicator("テスト")
var prices = array.new<float>(0)
array.push(prices, close)
// 配列サイズが1なのに、インデックス5を取得しようとする
val = array.get(prices, 5)
plot(val)

修正後:

//@version=6
indicator("テスト")
var prices = array.new<float>(0)
array.push(prices, close)
// サイズを確認してからアクセスする
val = array.size(prices) > 5 ? array.get(prices, 5) : na
plot(val)

配列操作を行う前に、array.size()でサイズを確認する習慣をつけよう。特に、チャートの最初の数バー(データが少ない状態)でエラーが発生しやすい。

第9位【R】Max number of drawings exceeded — 描画オブジェクトの上限超過

line.new()label.new()box.new()で作成したオブジェクトが上限を超えたときに出るランタイムエラー。

エラーメッセージ:

Max number of drawings of type 'line' exceeded. Max: 500

主な原因: ループや条件分岐の中で描画オブジェクトを大量に生成し、古いものを削除していない。

エラーが出るコード:

//@version=6
indicator("テスト", overlay=true)
if ta.crossover(ta.ema(close, 12), ta.ema(close, 26))
    line.new(bar_index, low, bar_index, high, color=color.green)
// 削除していないので、500本を超えるとエラー

修正後:

//@version=6
indicator("テスト", overlay=true, max_lines_count=500)
var lines = array.new<line>(0)
if ta.crossover(ta.ema(close, 12), ta.ema(close, 26))
    newLine = line.new(bar_index, low, bar_index, high, color=color.green)
    array.push(lines, newLine)
    // 古いラインを削除
    if array.size(lines) > 50
        line.delete(array.shift(lines))

対策は2つある。indicator()max_lines_count=500を指定して上限を引き上げること(最大500)。それでも足りない場合は、arrayで管理して古いオブジェクトをline.delete()で明示的に削除すること。

第10位【C】Cannot use ‘var’ with a function result — varの使い方エラー

var宣言と関数呼び出しの組み合わせで発生するエラー。

エラーメッセージ:

Cannot use 'var' with this expression

主な原因: varを使ってバーごとに値が変わる関数の結果を保持しようとしている。varは初回のみ実行されるため、毎バー更新される値には使えない。

エラーが出るコード:

//@version=6
indicator("テスト")
var ema = ta.ema(close, 20)  // varはta.ema()と組み合わせられない
plot(ema)

修正後:

//@version=6
indicator("テスト")
ema = ta.ema(close, 20)  // varを外す。毎バー再計算される
plot(ema)

varは「スクリプトの初回実行時に一度だけ値を設定し、以降はその値を保持する」宣言だ。カウンターやフラグの状態管理に使う。毎バー更新されるテクニカル指標の計算結果には使わない。

varが必要な場面は、var int count = 0のように状態を蓄積していく変数だけだ。

エラーを効率的に解決する5つのコツ

個別のエラーを覚えるだけでなく、エラー解決の「型」を持っておくと、未知のエラーにも対応できる。

コツ1: エラーメッセージの行番号を見る。 エラーメッセージには必ず行番号が含まれている。まずその行を確認し、前後数行も含めてチェックする。エラーの真の原因は、表示された行の1〜2行前にあることが多い(カッコの閉じ忘れなど)。

コツ2: 複数エラーが出たら、最初の1つだけ直す。 エラーが5つ表示されていても、最初の1つを直すだけで残り4つが消えることがある。1つのミスが連鎖的にエラーを引き起こすパターンだ。必ず上から順に対処する。

コツ3: 直前の変更を元に戻す。 「さっきまで動いていたのにエラーが出た」なら、直前に追加・変更した部分が原因。Ctrl+Zで元に戻して、変更箇所を特定する。

コツ4: 最小構成で再現する。 複雑なスクリプトでエラーが出た場合、問題の箇所だけを切り出して3〜5行の最小コードを作り、そこでエラーが再現するか確認する。問題の切り分けが格段に速くなる。

コツ5: バージョン番号を確認する。 コピペしたコードが動かないときは、まず1行目の//@version=を確認する。v4のコードをv6の環境で動かそうとしているケースが非常に多い。

Pineスクリプトの全体像やバージョンの違いについてはこちら。

Pineスクリプト(Pine Script)とは?できること・始め方を完全解説

デバッグに使える便利テクニック

エラーメッセージだけでは原因がわからないとき、変数の中身を「見える化」するテクニックが役立つ。

plot()で値を確認する。 計算結果が期待通りかどうかを、チャート上に線として表示して目視確認する。

//@version=6
indicator("デバッグ", overlay=false)
myValue = ta.rsi(close, 14)
plot(myValue, "RSI確認用", color.orange)
hline(70)
hline(30)

label.new()でテキスト表示する。 特定の条件が成立したバーで、変数の値をテキストとして表示する。

//@version=6
indicator("デバッグ", overlay=true)
if barstate.islast
    label.new(bar_index, high, 
      "RSI: " + str.tostring(ta.rsi(close, 14), "#.##") + 
      "\nEMA: " + str.tostring(ta.ema(close, 20), "#.##"),
      style=label.style_label_down, color=color.yellow)

barstate.islastを条件にすれば、最新のバーにだけラベルが表示される。複数の変数を改行(\n)で区切って1つのラベルにまとめると見やすい。

bgcolor()で条件の成立タイミングを確認する。 条件がtrueになるバーの背景色を変えることで、「いつ条件が成立しているか」を視覚的に確認できる。

//@version=6
indicator("デバッグ", overlay=true)
isBullish = ta.crossover(ta.ema(close, 12), ta.ema(close, 26))
bgcolor(isBullish ? color.new(color.green, 80) : na)

よくある質問

Q: エラーメッセージが英語で読めない。

Pineスクリプトのエラーメッセージはすべて英語だが、パターンは限られている。この記事のTOP10でカバーされているエラーが全体の8割以上を占める。エラーメッセージの冒頭のキーワード(Mismatched、Could not find、Cannot callなど)で、この記事内を検索してほしい。

Q: エラーは出ないけど、インジケーターの動きがおかしい。

これは「論理エラー」と呼ばれるもの。コード自体は文法的に正しいが、ロジックが意図と異なっている。前述のデバッグテクニック(plot、label、bgcolor)を使って、各変数の値が期待通りかどうかを1つずつ確認していこう。

Q: v4のコードをv6で動かしたい。

TradingViewにはv4→v5の自動変換ツールがあるが、v6への変換は手動になる。主な変更点は、study()indicator()sma()ta.sma()security()request.security()input()input.int()/input.float()など。

Q: 警告(Warning)は無視しても大丈夫?

動作はする。ただし、第5位で紹介した「関数のスコープ警告」のように、無視すると計算結果が不正確になるものがある。警告はできるだけ解消しておくことをおすすめする。

まとめ

Pineスクリプトのエラーは怖くない。パターンを知っていれば、ほとんどのエラーは数秒で原因を特定できる。

今回紹介したTOP10をおさらいする。第1位: Mismatched input(構文ミス)、第2位: Could not find function(関数名ミス・v6対応)、第3位: Cannot call with argument(型の不一致)、第4位: Undeclared identifier(未宣言変数)、第5位: Function should be called on each calculation(スコープ警告)、第6位: Variable was declared with type(型の再代入)、第7位: Script must have output(出力関数なし)、第8位: Array out of bounds(配列範囲外)、第9位: Max drawings exceeded(描画上限)、第10位: Cannot use var(var使い方エラー)。

エラーに遭遇したら、まずエラーメッセージの冒頭キーワードでこの記事を検索しよう。原因と修正コードがすぐ見つかるはずだ。

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

 

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