def test_week_and_time_composed_rule(self, type): week_rule = NthTradingDayOfWeek(0) if type == 'week_start' else \ NDaysBeforeLastTradingDayOfWeek(4) time_rule = AfterOpen(minutes=60) week_rule.cal = self.nyse_cal time_rule.cal = self.nyse_cal composed_rule = week_rule & time_rule should_trigger = composed_rule.should_trigger week_minutes = self.nyse_cal.trading_minutes_for_days_in_range( datetime.date(year=2014, month=1, day=6), datetime.date(year=2014, month=1, day=10)) dt = pd.Timestamp('2014-01-06 14:30:00', tz='UTC') trigger_day_offset = 0 trigger_minute_offset = 60 n_triggered = 0 for m in week_minutes: if should_trigger(m): self.assertEqual( m, dt + timedelta(days=trigger_day_offset) + timedelta(minutes=trigger_minute_offset)) n_triggered += 1 self.assertEqual(n_triggered, 1)
def test_week_and_time_composed_rule(self, rule_type): week_rule = NthTradingDayOfWeek(0) if rule_type == 'week_start' else \ NDaysBeforeLastTradingDayOfWeek(4) time_rule = AfterOpen(minutes=60) week_rule.cal = self.cal time_rule.cal = self.cal composed_rule = week_rule & time_rule should_trigger = composed_rule.should_trigger week_minutes = self.cal.minutes_for_sessions_in_range( pd.Timestamp("2014-01-06", tz='UTC'), pd.Timestamp("2014-01-10", tz='UTC')) dt = pd.Timestamp('2014-01-06 14:30:00', tz='UTC') trigger_day_offset = 0 trigger_minute_offset = 60 n_triggered = 0 for m in week_minutes: if should_trigger(m): self.assertEqual( m, dt + timedelta(days=trigger_day_offset) + timedelta(minutes=trigger_minute_offset)) n_triggered += 1 self.assertEqual(n_triggered, 1)
def test_week_and_time_composed_rule(self, type): week_rule = NthTradingDayOfWeek(0) if type == 'week_start' else \ NDaysBeforeLastTradingDayOfWeek(4) time_rule = AfterOpen(minutes=60) week_rule.cal = self.cal time_rule.cal = self.cal composed_rule = week_rule & time_rule should_trigger = composed_rule.should_trigger week_minutes = self.cal.minutes_for_sessions_in_range( pd.Timestamp("2014-01-06", tz='UTC'), pd.Timestamp("2014-01-10", tz='UTC') ) dt = pd.Timestamp('2014-01-06 14:30:00', tz='UTC') trigger_day_offset = 0 trigger_minute_offset = 60 n_triggered = 0 for m in week_minutes: if should_trigger(m): self.assertEqual(m, dt + timedelta(days=trigger_day_offset) + timedelta(minutes=trigger_minute_offset)) n_triggered += 1 self.assertEqual(n_triggered, 1)
def test_far_after_open(self): minute_groups = minutes_for_days(self.cal, ordered_days=True) after_open = AfterOpen(hours=9, minutes=25) after_open.cal = self.cal for session_minutes in minute_groups: for i, minute in enumerate(session_minutes): if i != 564: self.assertFalse(after_open.should_trigger(minute)) else: self.assertTrue(after_open.should_trigger(minute))
def test_invalid_offset(self): with self.assertRaises(ValueError): AfterOpen(hours=12, minutes=1) with self.assertRaises(ValueError): AfterOpen(hours=0, minutes=0) with self.assertRaises(ValueError): BeforeClose(hours=12, minutes=1) with self.assertRaises(ValueError): BeforeClose(hours=0, minutes=0)
def test_offset_too_far(self): minute_groups = minutes_for_days(self.cal, ordered_days=True) # Neither rule should ever fire, since they are configured to fire # 11+ hours after the open or before the close. a NYSE session is # never longer than 6.5 hours. after_open_rule = AfterOpen(hours=11, minutes=11) after_open_rule.cal = self.cal before_close_rule = BeforeClose(hours=11, minutes=5) before_close_rule.cal = self.cal for session_minutes in minute_groups: for minute in session_minutes: self.assertFalse(after_open_rule.should_trigger(minute)) self.assertFalse(before_close_rule.should_trigger(minute))
def test_AfterOpen(self): should_trigger = AfterOpen(minutes=5, hours=1).should_trigger for d in self.trading_days: for m in islice(d, 65): self.assertFalse(should_trigger(m)) for m in islice(d, 65, None): self.assertTrue(should_trigger(m))
def live_algo_start(offset=2): ny_tz = pytz.timezone('America/New_York') now = datetime.now(ny_tz) now = "%0d:%0d" % (now.hour, now.minute) td = datetime.strptime(now, "%H:%M") - datetime.strptime( "09:30", "%H:%M") h, r = divmod(td.seconds, 3600) m, s = divmod(r, 60) m = m + offset return AfterOpen(offset=None, hours=h, minutes=m)
def test_AfterOpen(self, ms): should_trigger = AfterOpen(minutes=5, hours=1).should_trigger for m in islice(ms, 64): # Check the first 64 minutes of data. # We use 64 because the offset is from market open # at 13:30 UTC, meaning the first minute of data has an # offset of 1. self.assertFalse(should_trigger(m)) for m in islice(ms, 64, None): # Check the rest of the day. self.assertTrue(should_trigger(m))
def setUpClass(cls): cls.env = TradingEnvironment() # On the AfterOpen and BeforeClose tests, we want ensure that the # functions are pure, and that running them with the same input will # provide the same output, regardless of whether the function is run 1 # or N times. (For performance reasons, we cache some internal state # in AfterOpen and BeforeClose, but we don't want it to affect # purity). Hence, we use the same before_close and after_open across # subtests. cls.before_close = BeforeClose(hours=1, minutes=5) cls.after_open = AfterOpen(hours=1, minutes=5) cls.class_ = None # Mark that this is the base class.
def market_open(offset=None, hours=None, minutes=None): return AfterOpen(offset=offset, hours=hours, minutes=minutes)