В конце мая на стриме разбирал любопытный код, с помощью которого можно управлять позициями по времени. Закрываем позиции и не входим в новые позиции в заданные интервалы. Разбор кода смотрите в видео.

Вот сам код:

        # Закрываем заявки и позиции (если есть) / не работаем:
        # - В начале сессии (до 10:15)
        # - На вечернем клиринге (18:40 - 19:10)
        # - Перед закрытием биржи (после 23:45)
        marketTime = bt.num2date(self.datas[0].datetime[0]).time()  # Время пришедшего бара
        # if marketTime < time(10, 14) or time(18, 39) <= marketTime < time(19, 9) or marketTime >= time(23, 44):
        if marketTime < time(7, 10) or time(18, 30) <= marketTime < time(19, 5) or marketTime >= time(23, 40):
            if self.primeOrder is not None and self.primeOrder.alive():  # Если есть активная заявка для снятия
                self.cancel(self.primeOrder)  # то снимаем OCO-заявки
                self.primeOrder = None  # Заявок для снятия больше нет
            if self.position:  # Если позиция есть
                if self.position.size > 0:  # Длинная позиция
                    self.sell(exectype=bt.Order.Market)  # Закрываем рыночной заявкой на продажу
                else:  # Короткая позиция
                    self.buy(exectype=bt.Order.Market)  # Закрываем рыночной заявкой на покупку
            return  # выходим, дальше не продолжаем

Для чего его можно использовать:

  1. Выход из позиций перед закрытием рынка / перед клирингом
  2. Не входим на первых волатильных движениях торговой сессии