#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
Смотрите Код класса стратегии.
Ваш лимитный ордер все равно должен работать должным образом, даже если вы не получаете уведомление.