ストラテジーでエントリーをクローズする際に ‘from_entry’ 引数が無視されます

strategy.exit() 関数では、from_entry パラメーターを使用して特定のエントリーをエグジットすることができます。

ストラテジーが複数のエントリーを持つ場合(ピラミッディング)、ストラテジーテスターのトレード一覧でマーケットポジションがクローズされる順番が不明瞭になることがあります。

デフォルトでは、ストラテジーが送信する最初のエグジット注文は、最も古いエントリー注文をクローズします。そして次のエグジット注文は、次に古いエントリーをクローズするといった流れになります。基本的に、ストラテジーは「先入れ先出し (FIFO)」の原則に基づいてトレードをクローズします。

次の例では、strategy.exit の呼び出しを特定のエントリーに結びつけるために from_entry 引数を使用しています:

//@version=4
strategy("close_entries_rule_example", overlay=true, pyramiding = 2)

strategy.entry("EN2", strategy.short, when= bar_index == 20650)
strategy.entry("EN1", strategy.short, when= bar_index == 20652)

if bar_index == 20655
    strategy.exit(id = "EX1", from_entry = "EN1", profit = 1, loss = 1)

if bar_index == 20657
    strategy.exit(id = "EX2", from_entry = "EN2", profit = 1, loss = 1)

まず strategy.entry は、インデックスが20650のバーでショートポジション EN2 をオープンし、その2つ後のバーで EN1 をエントリーします。

そして、bar_indexが20655になった時、id=EX1strategy.exit() 関数がエントリー EN1 をエグジットし、その2バー後に EX2EN2 をエグジットします。

しかし、ストラテジーテスターの結果は次のようになります:

20657のバーで EX2EN2 をクローズするようにコーディングされていますが、 IDが EN2 の最初のトレードは、エグジット注文 EX1 によってクローズされており、EN1 は、EX2 によってクローズされています。つまり最初のエグジット注文が最初のエントリー注文をクローズし、2番目のエグジット注文が2番目のエントリーを閉じています。これは典型的な FIFO の動作です。

ストラテジーが任意の順序で注文を閉じることができるようにするには、strategy() 関数の close_entries_rule 引数を(デフォルトの FIFO ではなく)ANY  に設定する必要があります。例:

//@version=4
strategy(..., close_entries_rule="ANY", ...)

ANY の値を指定する事で、ストラテジーはどのエグジット注文がどのポジションを閉じるかを決定することができます(close_entries_rule 引数が指定されていない場合でも、FIFO が暗黙のうちにデフォルトとして設定されていることにご注意ください)。

strategy() の呼び出しを以下のように変更すると、

strategy("close_entries_rule_example", close_entries_rule="ANY",  overlay=true, pyramiding = 2)

ストラテジーテスターの結果が変わります:

このケースでは、(時系列的に)最初のエグジット注文 EX1 が2番目のエントリー EN1を閉じ、2番目のエグジットが最初のエントリーを閉じています。