В конце мая на стриме разбирал любопытный код, с помощью которого можно управлять позициями по времени. Закрываем позиции и не входим в новые позиции в заданные интервалы. Разбор кода смотрите в видео.
Вот сам код:
# Закрываем заявки и позиции (если есть) / не работаем:
# - В начале сессии (до 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 # выходим, дальше не продолжаем
Для чего его можно использовать:
- Выход из позиций перед закрытием рынка / перед клирингом
- Не входим на первых волатильных движениях торговой сессии