'Memory limits exceeded. The study allocates X times more than allowed' のエラーが表示されます

すべてのTradingViewユーザーの方にコンピューターリソースを継続的に提供するために、インジケーターやストラテジーは、指定されたメモリ制限よりも多くのメモリを使用してはいけません。スクリプトが必要とするメモリ量がその制限を超えると、Memory limits exceeded のエラーが表示され、スクリプトはランタイムエラーを返します。このエラーが発生した場合は、コードを最適化してメモリ消費量が少なくなるようにしてみてください。コードを最適化する際に注意すべき点は以下の通りです:

  • 必要な場合を除いて `max_bars_back` は使用しないで下さい。`max_bars_back` は、インジケーターが使用するすべての系列変数の履歴バッファを指定する引数です。デフォルトで既にPineは各変数に対して適切なバッファを自動的に割り当てているので、`max_bars_back` が必要となるのは、Pine cannot determine the referencing length of a series のエラーが発生した時だけです。このエラーが発生した場合は、`max_bars_back` の値をできるだけ小さくするようにしてください: 例えば400バーの履歴参照でエラーを発生させる変数がある時に `max_bars_back` を5000に設定すると、(その変数だけでなく)コード内のすべての変数がすべてのバーに対し5000バーのヒストリカルバッファを持つことになり、多くのメモリを必要とします。つまり最終的にスクリプトでは使用されないデータに無駄なメモリが使われます。`max_bars_back` の使用を最適化する方法については、ヘルプセンターをご確認ください。
  • できる限り `security()` の呼び出しを行わないようにして下さい。`security()` 関数は計算コストがかかります。過度に使用するとインジケーターがメモリの制限に達しやすくなります。これは特に下位の時間足のデータを要求する security() 呼び出しに関連しています: 例えば '1D' のチャート上で '1m' のデータを要求した場合、各1Dバーごとに、インジケーターは何百もの1mバーのデータをロードしなければならず、その過程で多くのメモリを割り当てることになります。securityの時間足をより上位足に変更するか、security()を削除することで解決する可能性があります。
  • ヒストリカルバッファは通常、`max_bars_back` を使用しない場合でも自動的に作成されます。バーの履歴の遠いポイントを参照する変数もメモリ使用量を増加させます。`[ ]` 演算子で数千本のバーの履歴を参照する変数を作成する場合は注意が必要です。
  • ストラテジーのコーディングでは、トレードや注文の数もスクリプトが使用するメモリに影響を与えます。ストラテジーの開始地点を制限して、例えばエントリー/エグジットにバータイムと指定したタイムスタンプを比較する別の条件を追加することで、不要な注文を取り除くことができます。ストラテジーで日付フィルタリングを行う方法は、こちらに良い例があります。
  • `line.new()``label.new()` 関数で作成されたラインとラベルも多くのメモリを使用します。不要なラインやラベルは `line.delete()``label.delete()` 関数で削除するか、`max_lines_count``max_labels_count` で定義する最大量を減らしてください。