かーぶ(仮)

主に日本株やってます。長期ではなく短期取引メインです。TradeStation等株取引ツールも紹介します。

Trading Viewのエラー

目次

エラーについて

本ページではTradingViewのエラー内容の説明内容を記載します。
いつも参考サイトをgoogle翻訳して活用しましたが、自身のメモとして記載してます。(参考サイトは最下参照)
素人記述ですので誤認等あれば指摘いただけるとうれしいです。

はじめに

エラーが生じる場合はPineScriptを保存した(コンパイルされた)時にコンソールログに赤色で表示されます。
通常「line ○:~」のようにエラーが発生している行を示してくれるため、その行、または直前の行にほぼ原因が存在するので、確認し修正しましょう。

たくさんのエラーが表示されるとPCを そっ閉じ・・・ したくなりますが、1つのエラーに起因し複数のエラーが出力されていることもありますので、落ち着いて一つ一つ対処していきましょう。

前述の通り一つのエラーが起因していることもあるため、複数エラーが発生した場合は最初(一番上)のエラーから徐々に対処していくのがお勧めです。

スクリプト全体に対するエラー

「script must have one study() or strategy() function call」 エラー

TradingViewではインジケータ自身の名前や設定を記述するためのstudy()関数とstrategy()関数があります。
このstudy()又はstrategy()はスクリプト内に一度だけしか記述できません。複数ある場合に出力されるエラーです。

「The script must have at least one output function call (e.g. plot, barcolor, etc.). 」エラー

スクリプトには、少なくとも最低一つの出力関数の呼び出しが必要になります。
plot(),line.new(),barcount() 等のアクションを起こさないスクリプトに対して出力するエラーです。
「plot(0)」でも構いませんので何かしら出力するようにしましょう。

「out of depth at index」 エラー

スクリプト内に用いる履歴データの数が足りない場合に生じるエラーです。
通常はTradingViewにて必要なデータ量を算出しますが、コードが複雑になると自動では調整されないようです。
その場合、study()内に「max_bars_back」引数を指定して解決することができます。
必要なバーの数を設定する方法です。具体的な書き方は以下参照。この場合100足分は強制的に読み込みを行います。

study (title = "WR_test_indicator" , overlay = true , max_bars_back = 100 ) 

「loop is too long」 エラー

スクリプトをフリーズさせないために、TradingViewはループのあるコードを実行できる時間を制限しています。スクリプトに時間がかかりすぎると、「ループが長すぎます」というエラーが表示されます。
自分の場合は、単純に抜けられないループ等で発生するエラーですが、
実コードにて処理が長すぎる場合は以下のような対策が考えられます。

  • for文が長い場合はcontinue等を用いてスキップ等を追加する。
  • コードの全文をforで回すのではなく、一部分のみをforで回す様にコードを変更する。

「script requests too many securities」 エラー

直訳は「スクリプトが要求する証券が多すぎる」 TradingViewではsecurity()関数により価格データをクラウド上からダウンロードして使うことができますが、security関数が多すぎると生じるエラーです。
具体的には最大40に設定されているようです。
無駄なsecurity関数が記述されていないか確認しましょう。記述が簡単なのでついつい増えてしまいます。
例えば、close-open 等を確認したい場合は 

security(syminfo.tickerid, "D", close) - security(syminfo.tickerid, "D", open)

上の様に2回security関数を使うのではなく、
以下として、securty内で計算したデータをダウンロードすることでsecurityの数を減らすことができます。

security(syminfo.tickerid, "D", close - open) 

「Compiled script code is too long: xxxxx. The limit is 50000」エラー

スクリプトが長すぎると発生するエラーです。
(おそらく)文字数が50000以下になるようにコードを工夫する必要があります。
データをコード内に保存しない限りはこんなに打つことはめったに無いと思いますが。(゚д゚; )
あと、 if文のネストを深くしすぎると「メモリが足りない」のようなエラーも出てました。次出たら調べてみます

一般的な構文エラー

「undeclared identifier」 エラー

(私が書いたプログラムでは)もっとも発生するエラーです。
直訳は「宣言されていない識別子」
TradingViewでは、ユーザが自由に変数と関数を定義することができますが、定義されていない変数名、関数名を参照した(呼び出した)際に発生するエラーです。
間違いとして
- 変数の定義忘れ。 しっかり、「=」にて定義しましょう。 - 変数の誤記。 正しい変数名に修正しましょう。

「syntax error at input」 エラー

こちらもよく見るエラーです。
TradingViewの構文規則に合致していない場合に生じるエラーです。
演算子の誤った使い方や、文字の欠落、余分な文字、誤ったインデントなどで発生します。

エラーが発生している箇所の構文について、ヘルプの構文と見比べて誤っているところがないか確認しましょう。
豆知識 : "ctrl"とマウスクリックで該当のヘルプを見ることができます。

  • カッコが正しくクローズされているか。
  • 演算子に間違いはないか。
     ("=>"は関数の定義、"<="は比較)
     ("="は変数定義、"=="は比較)
  • study()、strategy()の引数の順番は誤っていないか。
    (最初に名称定義 「 study("name",overlay=true) 」もしくは"title"で指定。「study(title="name",overlay=true) 」 )
  • インデントの数は間違っていないか。

「variable is already declared」 エラー

直訳は「変数は既に宣言されています」
TradingViewでは、変数は一度しか定義できません。
同じ変数を2回定義しようとすると、「変数は既に宣言されています」というエラーが表示されます。

変数を更新する場合は、「:=」を用いて上書きを示す必要があります。

value = open
if open < close 
    value := close

「no viable alternative at character」 エラー

直訳は「文字で実行可能な代替はありません」
直訳だとなんのことかさっぱりわかりませんね。
これは、PineScriptのコードに構文間違いがある場合に生じるエラーです。
例えば、以下のようなものです。

  • 「.」(ドット)を書くべきところに「,」(カンマ)を書いた (逆もあり)
  • 「)」(かっこ)を書くべきところに「}」(中かっこ)を書いた
  • 行末に「;」(セミコロン)を入れている。(トレステと勘違い)
  • 3項演算の時に「:」(コロン)を書くべきところに「;」(セミコロン)を書いた

「cannot assign expression of type」 エラー

各変数に定義した「型」と異なる「型」を入力しようとすると発生するエラーです。
例えば、数値を定義した型にtrue/falseの真偽値を入力しようとすることです。
入れ物が違うものに無理やり入れれませんよってことですかね。 PineScript側にて自動に「型」変換してくれる条件は以下となります。

変数の型 許容できる型 許容できない型
整数(Integer) Integers, Floats, na Bool,Color
浮動小数点数(Float) Floats, Integers, na Bool,Color
真偽値(Bool(true/false)) Bools, Floats, Integers, na Color
色(Color) Colours ,na Integers,Floats,Bool,Color

「end of line without continuation」 エラー

コードのインデント(タブや空白)の間違いにより発生するエラーです。
TradingViewではインデント(タブや空白)が重要となります。
タブや空白の数により、関数の行がどこまでの範囲を含むのか、またfor文やif文の範囲はどこまでの行なのかを認識しています。

インデントに関して、まず、【 タブ1つ = 4つのスペース(半角) 】は同等であることを覚えてください。
TradingViewでは関数や、for文、if文を用いた際、タブ1つor4つのスペースでインデントすることで、それらの範囲内であることを指示できます。
if文の中に更にif文を記述する場合はインデントは2つ分必要になります。(タブ2つor8つのスペース)

また、コードの行が長くなり、複数行にわたる記述を行う場合は
【 タブ1つ = 4つのスペース(半角) 】に1つのスペースを付足す必要があります。5つのスペース分となります。
(本当は4つのスペースでなければ良いのですが、ばらばらだとコードが読みづらくなるので、上で覚えた方が良いかと。)

インデントの管理が大変そうに見えますが、PineScriptのエディタには、タブを複数使用した場合にインデント毎に垂直線が表示されるため、そこまで意識する必要はありません。
重要なのは2つで、

  • 関数、for、if 等で範囲を指定する場合のインデントは【タブ1つor4つのスペース】
  • 複数の行にわたる場合のインデントは【タブ1つor4つのスペース + 1つのスペース】

「mismatched input」 エラー

誤った構文にて記載されている場合に発生するエラーです。
"expecting ..."にて、記載忘れている文字等を予測で出力してくれます。
エラー例を下記します。

  • 「mismatched input 'end of line without line continuation' expecting ')'」
      「(」の数が「)」と合致しておらず、カッコがクローズしていない時。

  • 「mismatched input 'strategy.exit' expecting 'end of line without line continuation'」
      if文を記載したにも関わらず、中身を記載しなかった時。(インデントを含んだ行が記述されない時)

  • 「mismatched input ')' expecting ']'」
      "close[]" と書くべきところに"close[)"の様に記載した時。

  • 「mismatched input 'end of line without line continuation' expecting ':'」
      三項演算子「?」 を使っているにもかかわらず 「:」以降(非成立時)が記載されていない時。

参考サイト

kodify.net

/*コード内行数*/ /*コード内全選択*/