Моя стратегия игнорирует аргумент from_entry при выходе из позиций

Аргумент from_entry функции strategy.exit() позволяет выйти из определенной заданной позиции. Если у стратегии более одного входа в позицию (так называемый pyramiding), то порядок закрытия рыночных позиций на вкладке тестера стратегий может быть неясным.

По умолчанию первый выход из позиции, отправленный стратегией, закрывает самый первый вход в позицию. Затем следующий заказ на выход закрывает следующий вход в позицию, поэтому стратегия закрывает сделки по принципу первым пришёл — первым ушёл (FIFO).

Рассмотрим следующий пример: с помощью аргумента from_entry мы пытаемся привязать вызовы strategy.exit к определенным позициям:

//@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 открывает короткую позицию EN2 на баре с индексом 20650, а через два бара после этого открывает EN1.

Когда текущий номер бара равен 20655, функция strategy.exit() с идентификатором id = EX1 собирается осуществить выход из позиции EN1, а EX2 должна выйти из позиции EN2 через два бара.

Но при открытии тестера стратегий получается следующий результат:

Первая позиция с идентификатором EN2 закрывается функцией EX1, а EN1 закрывается функцией EX2, даже несмотря на то, что в теле функции было указано, что позиция EN2 должна была быть закрыта EX2 на баре 20657. Таким образом, первый выход из позиции закрыл самый первый вход в позицию, второй выход из позиции закрыл второй вход. Это классическое поведение FIFO.

Чтобы стратегия могла закрывать позиции в любой последовательности, аргумент close_entries_rule функции strategy() должен быть установлен как “ANY” (вместо “FIFO” по умолчанию), то есть:


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

С помощью параметра “ANY” стратегия может определить, какой выход закрывает определенную позицию. (Стоит заметить, что «FIFO» устанавливается по умолчанию, если аргумент ‘close_entries_rule’ не указан).


С изменением вызова функции strategy() на

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

на вкладке тестера стратегий получаются следующие результаты:

В этом случае (в хронологическом порядке) функция EX1 осуществила выход из позиции EN1, а EX2 позволила выйти из позиции EN2.