こんにちは!makoto(@Makoto_beginner)です。ここではPineスクリプトを扱う上で必ず遭遇する様々なエラーを掲載し、そのエラーの意味および対処法をまとめていきます。
※管理人がエラーに遭遇次第随時更新していきます。
- 1、コンパイル時のエラー
- (1)Undeclared identifier ‘close_enrty1’
- (2)’vae’ is not a valid type keyword in variable declaration
- (3)Unknown argument ‘default_qty_type’ of type ‘const string’;
- (4−1)mismatched character ‘\n’ expecting
- (4−2)'”‘Syntax error at input ‘,’.
- (5)Mismatched input ‘if’ expecting ‘end of line without line continuation’.
- (6)Variable ‘x’ was declared with ‘integer’ type. Cannot assign it expression of type ‘series[float]’.
- (7)Variable ‘col’ is not found in scope ‘c_11’, cannot register side effect;
- 2、スクリプト実行時のエラー
- 3、エラーではない警告
1、コンパイル時のエラー
(1)Undeclared identifier ‘close_enrty1’
定義していない変数を使用した時に出てくるエラー。
上記は「close_entry1という変数が定義されていません」という意味です。
ここを確認してみよう!
①変数は定義していますか?
変数を定義せずに使用するとエラーを吐きます。
以下の例では、「day」という変数がいきなり出てくるのでエラーとなります。
study(title=”test”,overlay = false)
day = 9 //dayという変数を使用する前に定義しておく。
ema_s = ema(close,day)
②変数の名前は間違っていませんか?
study(title=”test”,overlay = false)
var test = 9 //testという名前の変数を定義し9という値を代入。
ema_s = ema(close,test) //変数の名前を間違えずに入力する。
③変数を定義する場所は適切ですか?
上記例は、if文の中で定義した変数をif文の外で使用していますが、このような使い方はできません。
プログラムには「スコープ」と呼ばれるものが存在します。ここでは「変数が有効な範囲」と覚えてもらったらいいかと思います。
そして、if文の中のような狭いスコープをローカルスコープと言い、そこで定義された変数を「ローカル変数」と呼びます。
対して、if文の外で定義された変数を「グローバル変数」と言います。
そして、グローバル変数をローカルスコープで使用することはできますが、ローカル変数をグローバルスコープで使用することはできません。
上記の例では、if文の中で定義したローカル変数をif文の外でグローバル変数として使用しているためエラーが発生しています。
study(title=”test”,overlay = false)
————–略—————–
long_entry = crossover(ema_s,ema_l)
var n = 10 //ローカルスコープ(if文)の外で変数を定義する。
if long_entry == true
n := 10 //if文の中でnという変数を定義
strategy.entry(“Long”,strategy.long)
n := 15 //if文の外でnという変数を使用
(2)’vae’ is not a valid type keyword in variable declaration
変数を宣言する際の「var」を入力ミスすると出てくるエラー。
上記は「”vae”というキーワードは変数を宣言するのに有効ではありません」という意味である。
ここを確認してみよう!
①「var」を打ち間違えていませんか?
「var」を「vae」などと打ち間違えるとエラーを吐きます。
study(title=”test”,overlay = false)
var a = 0.0 //varを打ち間違えず正しく入力する。
(3)Unknown argument ‘default_qty_type’ of type ‘const string’;
オーダーを出す際の数量タイプ(ロット指定や金額指定など)を宣言ミスした際に出てくるエラー
上記は「’default_qty_type’という不明な文字列型の変数」という意味
ここを確認してみよう!
①「’default_qty_type’」を入力する箇所を間違えていませんか?
‘default_qty_type’を「strategy.order」や「strategy.entry」関数に入力していませんか?
これらは、ここではなく文頭のstrategy()に入力するビルトイン変数です。
正しく文頭のstrategy()に入力する。
(4−1)mismatched character ‘\n’ expecting
(4−2)'”‘Syntax error at input ‘,’.
inputでoptionsを使用する際に出現したエラー。
上記は「”\n”ではなく””を期待している」「入力 ‘、’での構文エラー」という意味
ここを確認してみよう!
①「options」の入力を間違えていませんか?
このように、コンマ「,」が多い場合に出現することがあります。
コンマ「,」を削除して正しい文法で記述する。
(5)Mismatched input ‘if’ expecting ‘end of line without line continuation’.
条件分岐のif文で出現するエラー
ここを確認してみよう!
①論理演算子「and」を正しく入力していますか?
上記の文では「PS5 == false strategy.position…」となっており、「and」が入力されていません。
「PS5 == false and strategy.position…」と正しくandを入力する。
(6)Variable ‘x’ was declared with ‘integer’ type. Cannot assign it expression of type ‘series[float]’.
整数型の変数xに、小数点のついた数を代入しようとした際に発生するエラー
「変数xは整数型なのに、小数点がついた数(浮動小数点数)を代入しようとしてない!?」と怒られているエラーである。
ここを確認してみよう!
①変数の宣言は正しいですか?
以下は誤った例。整数型で宣言している変数xに小数点のついた数を代入している。
小数点のついた数を扱うには、以下のように変数の型をfloatで宣言する必要がある。
②(変数の型を宣言しない場合)代入する数値に注意していますか?
Pineスクリプトでは、変数の宣言時に変数型を省略できる。
しかし、これが厄介。以下のように変数xを宣言するとxは「整数型」として認識されるという決まりがある。
こういったときは、以下のように0.0を代入すると浮動小数点数型として扱われ、小数点を代入することができるようになるぞ!
(1)変数の型をしっかり宣言する!
(2)型を宣言しない場合は代入する値に気をつける!
ちなみに、変数の型って何?という型は以下のページを参照してね⭐︎
(7)Variable ‘col’ is not found in scope ‘c_11’, cannot register side effect;
“col”という変数がスコープc_11に見つからないので、副作用?を登録できませんという意味です(side effectの意味が副作用しか見つからず意味不明です・・・英語に詳しい方コメントで正解を教えてください!)
ここを確認してみよう!
①変数の宣言をせずに代入していませんか?
以下は誤った例。変数xの宣言をせずにいきなり代入しています。
解決法としては、変数xの宣言を行う。
もしくは、そもそも代入記号「:=」ではなく、変数の宣言と同時に値を代入する方法、
つまり「=」を使うことで解決しましょう。
(1)変数をしっかり宣言する!
(2)宣言しない場合は初めから「=」を使用して、宣言と代入を同時に行う!
ちなみに、変数って何?、宣言って何?という型は以下のページを参照してね⭐︎
2、スクリプト実行時のエラー
3、エラーではない警告
(1)The function ‘crossover’ should be called on each calculation for consistency. It is recommended to extract the call from this scope.
if文などローカルスコープ中でcrossover()を使用する際に出現するエラー
上記は「計算間違いする可能性があるから、このスコープからcrossoverを呼び出すようにしたほうがいいよ」という意味
例えば以下の記事にて、バックテストの期間を指定するコードを共有しました。
この記事のように、バックテストの期間などを指定する場合、どうしてもif文の中に処理を記述しがちです。
しかし、本来エントリーする条件の時にその上にあるif文が邪魔をしてしまうと、せっかくのエントリー機会をのがしてしまう可能性があります。
例えばこんなとき
if A == true
____crossover(B,0)
このcrossoverは、Bが0を上回った時にtrueとなるが、その上にあるif文により、そもそもAがtrueとならないとcrossoverの処理ヘ進めません。
こんな時に「計算間違いするから外に出したほうがいいよ」とPineスクリプトは教えてくれているわけです。
ちなみに、スコープという言葉の意味については以下の記事3項の参考を参照願います。
ここを確認してみよう!
①if文の中(ローカルスコープ)にcrossoverなどを入れていませんか?
上記の例は、変数Bの値が0を超えた際にロングエントリーするストラテジーを示していますが、if文の中にcrossoverが入っているため警告が出てきます。
こんなときは、以下のようにして対処しましょう。
まず、if文の外に変数を用意します。今回はlong_entryという名前にしました。
ここに、crossover(B,0)のブール値を代入するようにします。
つまり、Bが0を超えたらlong_entryという変数にはtrueが代入されるわけです。(それ以外の時は常にfalseが代入される)
そして、そのlong_entryがtrueの時にロングエントリーすれば良いので、if long_entryと記述してその後にエントリー処理を書くことで対応可能です。
ローカルスコープの外にエントリー条件を代入する変数を用意し、ローカルスコープ内にはその変数を判定条件とするif文を用意する!
本記事を気に入っていただけたらブックマークお願いします!また、ツイッターもやってるのでフォローよろしくお願いいたします!
Twitter : makoto(@Makoto_beginner)
また、記事中で不明なことや間違い等ありましたら以下のコメント欄からコメントいただけると幸いです。
皆様のコメントをもとにどこよりもわかりやすいブログを目指していきます。