For code/output blocks: Use ``` (aka backtick or grave accent) in a single line before and after the block. See: http://commonmark.org/help/
Best approach to limit strategy to certain times of day?
-
I'd like to limit my strategy/backtesting not only to certain days of data, but also to certain times during those days, for example +/- 30 minutes of BOD and EOD.
Can anyone recommend the best approach to this?
-
You might wish to try using this library DateTimeRange.
from datetimerange import DateTimeRange
Set the current date and time:
# Current bar datetime, date, and time. dt = self.data.datetime.datetime() date = self.data.datetime.date()
Set the regular trading hours (rth) as:
# str HH:MM:SS self.p.rth_start self.p.rth_end
Then use this code to set the trading time range:
# Create Regular Trading Hours range for the current trading day. rth = DateTimeRange( datetime.combine( date, datetime.strptime(self.p.rth_start, "%H:%M:%S").time() ), datetime.combine( date, datetime.strptime(self.p.rth_end, "%H:%M:%S").time() ), )
Then check if the datetime is in regular trading hours. If so, then 'return'.
# Only trade in regular trading hours and intraday bars. if dt not in rth and self.p.time_frequency != 'D': return
-
You may also utilize the trading calendars:
def in_session(data_feed, sos_delta=timedelta(), eos_delta=timedelta()): dt = data_feed.num2date(tz=timezone.utc, naive=False).replace(tzinfo=None) (sos, eos) = data_feed._calendar.schedule(datetime.combine(dt.date(), time())) if eos_delta: eos -= delta if sos_delta: sos += delta return sos <= dt <= eos
-
Excellent, thanks, guys. Let me give these a go.
-
I ended up using a version of @run-out 's suggestion without the datetimerange, using two custom trade hour params with corresponding params in my strategy
cth_start = datetime.datetime.strptime(args.cth_start, '%H:%M:%S').time() cth_end = datetime.datetime.strptime(args.cth_end, '%H:%M:%S').time()
and then within my strategy simply:
def next(self): if (self.data.datetime.time() < self.p.cth_start) or (self.data.datetime.time() > self.p.cth_end): return