チャートにストラテジーを正しく追加したのですが、注文が実行されません
チャートにストラテジーを追加した後、ストラテジーテスターの「トレード一覧」や「概要」タブに「データなし」と表示される場合、注文のシミュレーションがまったく行われていないために、タブに表示すべきデータがないという可能性があります。スクリプトで注文が実行されないとすれば、次のような原因が考えられます:
スクリプトがストラテジーとして位置づけられていない、あるいは注文作成のコマンドを使用していない
ストラテジーテスターによるバックテストは、宣言文に関数 `strategy()` を使用した Pineスクリプト™ のストラテジーでのみ機能します。`indicator()` または `library()` で宣言されたスクリプトは、ストラテジーテスターのモジュールとやり取りすることができません。
注文のシミュレーションを行ってストラテジーテスターにデータを表示するには、ストラテジーとして宣言されたスクリプトにおいて、`strategy.*` で表される発注のコマンド (例: `strategy.order()` または `strategy.entry()`) が使用されている必要があります。これは、スクリプトの作者がそのコードに含めた他の売買シグナルとはかかわりなく必要になる条件です。
ストラテジーにポジションを取得するための資金が不足している
ストラテジーがポジションを取得するためには、指定した契約数/株数/ロット数/ユニット数を購入するだけの十分な資金が必要です。そのコストをカバーするのに十分な資金がない場合は、トレードを始めることができません。例えば、ストラテジーの初期資金が1,000ドルで発注サイズが1契約の場合、資産価格が1,000ドルを下回らない限りはトレードを行う資金が不足しているため、ポジションを持つことはできません。ストラテジーは、常に指定した数の契約数/株数/ロット数/ユニット数を購入しようとするため、それ以下の数では購入を行いません。
先物のバックテストに関する重要な注意事項:
先物のシンボルには、一般的に取引単位と呼ばれるものがあります(TradingView では「ポイント値」として表され、Pine からは `syminfo.pointvalue` という変数によってアクセスが可能です)。チャート上に示される生の価格は、他のシンボルと同様、取引される商品1単位の価格を表します。しかし、先物取引では、それぞれの商品について取引の際にセットとなる数量が決まっているため、通常1単位での購入はできません。取引にあたって必要な資金を計算するには、チャートの価格に「ポイント値」を掛けます。
先物のシンボルで運用されるストラテジーで「ポイント値」がどのように機能しているかを、ES先物のシンボルの中でもきわめて流動性が高い "CME_MINI:ES1!" で見てみましょう。その「ポイント値」は50となっています:
以下の例ではチャートに追加したストラテジーが、正確に4,000ドルでポジションを取得したのちに、4,500ドルで決済をしています。エントリー価格で実際の取引に要した金額は、4,000ドルに「ポイント値」の50を掛けた200,000ドルです。そして、このストラテジーが決済価格でポジションを清算した際に受け取った金額は4,500ドル * 50 = 225,000ドルです。結果として25,000ドルの利益を得たことになりますが、これはストラテジーテスターの「トレード一覧」タブに表示される「利益」の列を見ることによって確認できます:
もし、このケースでストラテジーの「初期資金」が20万ドル以下であったなら、チャート上に表示された価格の50倍に相当するエントリー価格を支払うための資金が不足していたので、発注ができなかったことになります。こうしたポジションのシミュレーションを行う場合には、ストラテジーの資金が不足しないように「初期資金」を増やすか、「マージンロング/ショート」の値を下げる必要があります。
ストラテジーがランタイムエラーを返す
ストラテジーの計算中に問題が起こった場合はランタイムエラーの発生とともに、ストラテジーを使用しているチャートのペイン左上に赤い「!」マークが表示されます。ランタイムエラーが発生すると、スクリプトの計算が続行できないため、注文のシミュレーションが不可能になります。Pineのランタイムエラーには様々な原因や対処法があります。「!」マークをクリックすると、スクリプトのエラーメッセージが表示されます。
ストラテジーの発注に必要な条件が満たされていなかった
ストラテジーにデータが表示されない原因として、テストを実行した範囲内に注文をトリガーする条件がなかったということが考えられます。この場合、満たすべき注文がないため、チャート上にエントリーの表示はありません。こうしたケースでは、ストラテジーのソースコードで条件を変更することによって解決を図ることができます。ストラテジーの注文条件をチャート上にプロットすると、注文履歴を視覚的に確認できるケースもしばしばあります。
以下のスクリプトは、Pineの関数 `plotshape()` を使用することによって、ロングおよびショートの条件が発生したときに青と赤の十字マークをバーの上にプロットして、チャート上でその履歴を確認できるようにするものです:
//@version=5
strategy('My Strategy', overlay = true)
longCondition = ta.crossover(ta.sma(close, 14), ta.sma(close, 28))
if longCondition
strategy.entry('Long', strategy.long)
plotshape(longCondition, color=color.new(color.blue, 0))
shortCondition = ta.crossunder(ta.sma(close, 14), ta.sma(close, 28))
if shortCondition
strategy.entry('Short', strategy.short)
plotshape(shortCondition, color=color.new(color.red, 0))
このトピックの詳細については、ユーザーマニュアルのデバッグのページをご参照ください。
ストラテジーのプロパティが正しくない
どのストラテジーにも、発注のルールを管理するパラメーターがいくつかあります。これらのパラメーターは、ストラテジーの作成者がソースコードから設定しているものですが、ユーザーはストラテジーの設定画面内にある「プロパティ」タブで、このパラメーターを上書きして変更することができます。
注: ストラテジーのソースコードには、ユーザーが注文する契約数/株数/ロット数/ユニット数を設定できる箇所がいくつかあります:
- 関数 `strategy()` 内のパラメーターで、デフォルトの取引数量とタイプを設定することができ、「プロパティ」タブのデフォルト値が設定されます。ユーザーは「発注サイズ」を調整することで、この値を上書きすることができます。
- 関数 `strategy.entry()` などのエントリー注文を生成する発注コマンドでは、注文ごとに取引数量を設定することができます。この場合、「プロパティ」タブの入力内容を変更しても、ストラテジーの注文サイズには影響しません。
ユーザーは、ストラテジーの発注サイズを正しく指定する必要があります。上記の「ストラテジーにポジションを取得するための資金が不足している」の項を補足すると、以下の点に注意することが必要です:
- ストラテジーの "Order type" が "Contracts"(ソースコードの default_qty_type としては `strategy.fixed` がこれに相当します)に設定されている場合、注文サイズはほとんどのシンボルで1より大きくなければなりません。暗号資産の一部では端数のサイズも使用可能です。例えば、0.1という注文サイズはBTCUSDでは有効ですが、AAPLやEURUSDでは有効ではありません。
- 注文サイズは正の値をとる必要があります。負の値ではランタイムエラーが発生し、0では何の結果も残りません。
- 合計のポジションサイズ(契約数)は1兆を超えることはできません。ポジションサイズがこの数値を超えると、ストラテジーは新規注文のシミュレーションを行いません。