Pineのコンパイルエラー

From TradingView Wiki
Jump to: navigation, search
Language: English  • 日本語 • Русский

Script requesting too many securities

スクリプトでの security関数の呼び出しは、最大40に制限されています。変数を security 呼び出しで宣言し、その変数を他の変数や計算の入力として使用する場合には、複数の security 呼び出しが発生することはありません。しかし security を呼び出す関数を宣言した場合、この関数を呼び出すたびに security 呼び出しがカウントされます。

ソースコードを見て、security関数が何回呼び出されるか判断することは簡単ではありません。次の例では、コンパイル後に security は(ソースでは単純に見れば4箇所記載がありますが)厳密には3回呼び出されます。

//@version=2
study("Securities count")
a = security(tickerid, '42', close) // (1) 最初の security 呼び出し
b = security(tickerid, '42', close) // 上と同じ内容の呼び出しであり、最適化後には新しい security 呼び出しは発生しません。

plot(a)
plot(a + 2)
plot(b)

sym(p) => security(tickerid, p, close) // この行では security 呼び出しはありません。
plot(sym('D')) // (2) 間接的な security 呼び出し
plot(sym('W')) // (3) また別の間接的な security 呼び出し

security(tickerid, period, open) // security(tickerid, period, open) // この行は最適化され、結果は使用されません。

Script could not be translated from: null

study($)

通常このエラーはバージョン1のPineスクリプトで発生し、コードが正しくないことを意味します。Pine バージョン2では、こういったエラーの解説が向上しています。最初の行に //@version=2 と指定しPine バージョン2への切り替えを試してみてください。すると line 2: no viable alternative at character '$' といったエラーに変わります。

// @version=2
study($)

line 2: no viable alternative at character '$'

上記項目でPine v2に変更後表示されたエラーメッセージです。$ がスクリプトタイトルの文字列の代わりに使用されています。下記の様に修正します。

// @version=2
study("title")

Mismatched input <...> expect <???>

"no viable alternative" のエラーメッセージと同様に、記述すべき場所が誤っています。

例:

//@version=2
study("My Script")
    plot(1)
 line 3: mismatched input 'plot' expecting LEND

これを修正するには、'plot' の行をインデント無しの新しい行にする必要があります

//@version=2
study("My Script")
plot(1)

Cannot call `operator ?:` with arguments (series, string, string)

例:

//@version=2
study("Cannot call `operator ?:")
c = open > close ? '$' : '#'
plot(c == '$' ? 1 : 2)

この三項演算子の結果は、文字列のデータ系列になります。しかし、Pine Scriptでは文字列の系列はサポートされていません。その為この呼び出しは禁止されています。

Loop is too long (> 200 ms)

無限もしくは非常に長いループからサーバを保護するために、過去のバーやリアルタイムティックのすべてで、ループの計算時間には制限があります。この制限は、計算に非常に時間のかかるインジケーターに対してのフェイルファストでもあります。例えば、過去の5000バーを利用できる時に、インジケーターが各バーの計算に200msかかると、読み込みに16分以上かかってしまうことになります。

//@version=2
study("Loop is too long", max_bars_back=101)
s = 0
for i = 1 to 1e3 // to make it longer
    for j = 0 to 100
        if (timestamp(2017, 02, 23, 00, 00) <= time[j] and time[j] < timestamp(2017, 02, 23, 23, 59))
            s := s + 1
plot(s)

アルゴリズム的な修正で対応ができる可能性があります。この場合、次のようにアルゴリズムを最適化することができます。

//@version=2
study("Loop is too long", max_bars_back=101)
bar_back_at(t) =>
    i = 0
    step = 51
    for j = 1 to 100
        if i < 0
            i := 0
            break
        if step == 0
            break
        if time[i] >= t
            i := i + step
        else
            i := i - step
        step := step / 2
    i

s = 0
for i = 1 to 1e3 // to make it longer
    s := s - bar_back_at(timestamp(2017, 02, 23, 23, 59)) + bar_back_at(timestamp(2017, 02, 23, 00, 00))
plot(s)

Script has too many local variables

このエラーはスクリプトが大きすぎてコンパイルできない時に表示されます。ステートメント var=expression は、var ローカル変数を作成 します。それとは別の重要な点は、スクリプトのコンパイル処理中に、補助変数が暗黙的に作成されるという事です。この制限は、明示的または暗黙的に作成された変数、どちらにも適用されます。1000個の変数の制限は、各変数に個別に適用されます。例えば、スクリプトのグローバルスコープに配置されたコードも、暗黙的に main関数にラップされ、1000個の変数の制限が適用されます。この問題を防ぐために行えるリファクタリングは極わずかです。

var1 = expr1
var2 = expr2
var3 = var1 + var2

この様に変換する事ができます。

var3 = expr1 + expr2

The study has too many output series

このエラーはアウトプット系列の最大数を超えたことを意味します。これらはチャート上に値がプロットされている系列の事です。系列のプロットに呼び出せる関数はいくつかあり、それらは名前が plot で始まります。例えば、plotplotcandleplotbarなどです。
以下にご注意ください:

  • plotbarとplotcandle関数は、実際には一度に4つの系列 (OHLC) をプロットします。
  • すべてのplot関数で(定数ではない)色は、追加のアウトプット系列として見なされます。

このエラーを避けるには、plot関数の数を減らして下さい。


前の項目: インジケーターのリペイント, 次の項目: Pineについてより多くの情報を得る方法, メニューに戻る: Pineスクリプトチュートリアル