Моя стратегия игнорирует аргумент 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.