проблема с pyalgotrade с событием exit-order-event (onExitOk)

#pyalgotrade

Вопрос:

У меня возникли проблемы с моим торговым алгоритмом. Кажется, что заказы не могут завершиться до вызова следующего onBars(), и количества становятся беспорядочными. Я использую enterLongLimit() для входа в сделку, которая вызывает onEnterOk() по ее завершении, но я использую limitOrder для выхода из части позиции на основе некоторого технического индикатора, и это, похоже, не вызывает onExitOk() .

 def onExitOk(self, position):
    print("Exit ok", position.getExitOrder().getExecutionInfo().getDateTime())

def onEnterOk(self, position):
    print("Enter ok", position.getEntryOrder().getExecutionInfo())

def _closePosition(self, price, qty, reason, date):
    print("Closing position with price", price, "and closing qty", qty)
    brk = self.getBroker()
    shares = brk.getShares(self.instrument) * qty
    print("Cash now before sell: ", brk.getCash(self.instrument))
    self.info("Sell BTC %s at %s because %s on %s " % (shares, price, reason, date))
    self.position = self.limitOrder(self.instrument, price, shares*-1)
    print("Cash now after sell: ", brk.getCash(self.instrument))
 

Выполнение:

Закрытие позиции по цене 746,3 и кол-во закрытия 0,5


Наличные сейчас перед продажей: 17,423283999999967


Наличные сейчас после продажи: 17.423283999999967

Денежные средства до и после ограничения одинаковы, поэтому мне приходится ждать поступления события. Идеи?

Комментарии:

1. Вы получаете все распечатки из событий onEnterOk и onExitOk? По какой-то причине я не могу заставить их работать, хотя моя стратегия выполняет 2,5 тыс. сделок при тестировании с помощью стоп- и лимитных ордеров — какой бы код я ни вводил в эти события, он не выполняется.

2. Похоже, это зависит от того, какой метод используется для открытия позиции — по какой-то причине ордера stop, limit и stop-limit не запускают события onEnter / OnExit, но делают enterLong или enterShort .

Ответ №1:

У меня была похожая проблема, а затем, после некоторого изучения, я обнаружил, что события onEnter и OnExit запускаются только при открытии позиции с использованием одного из методов enterLong или enterShort . Сделки, выполненные с ордерами stop, limit или stop-limit, не вызывают события onEnter или OnExit, что является настоящим позором.

Это то, что говорится в комментариях в исходном коде, т.е..:

 def onEnterOk(self, position):
    """Override (optional) to get notified when the order submitted to enter a position was filled. The default implementation is empty.
    :param position: A position returned by any of the enterLongXXX or enterShortXXX methods.
    :type position: :class:`pyalgotrade.strategy.position.Position`.
    """
    pass
 

Смотрите Код класса стратегии.

Ваш лимитный ордер все равно должен работать должным образом, даже если вы не получаете уведомление.