def run_schedule_only(schedule_functions, start_date, end_date, logger): for date in TradeTime.generate_dates(start_date, end_date): sf_dt_list = map(lambda x: [x, x.time_rule.get_datetime(date)], schedule_functions) sf_dt_list.sort(key=lambda x: x[1]) for sf_dt in sf_dt_list: if Container.context.terminate_p: return schedule_function = sf_dt[0] dt = sf_dt[1] if schedule_function.date_rule.validate(dt): Container.data.set_datetime(dt) logger.set_dt(dt) try: start = datetime.datetime.now() if TradeTime.is_half_trade_day(dt.date()) and schedule_function.half_days is False: pass else: schedule_function.my_func() end = datetime.datetime.now() # logger.info('Spend time for schedule function: %s seconds' % (end - start).seconds) except Exception as e: logger.error('Trace: ' + traceback.format_exc(), False) logger.error('Error: get action arguments failed: %s, %s' % (str(e), traceback.format_exc())) Container.data.set_datetime(datetime.datetime(date.year, date.month, date.day, 16, 0, 0)) Container.analysis.add_portfolio_trace(date, Container.api.portfolio)
def validate_integrity_for_real_time_data(self, symbol='SVXY', ): us_dt = datetime.datetime.now(tz=pytz.timezone('US/Eastern')) now = datetime.datetime(us_dt.year, us_dt.month, us_dt.day, us_dt.hour, us_dt.minute, us_dt.second) integrity_p = True latest_date = TradeTime.get_latest_trade_date() start_time = datetime.datetime(latest_date.year, latest_date.month, latest_date.day, 9, 30, 0) if TradeTime.is_half_trade_day(latest_date): default_end_time = datetime.datetime(latest_date.year, latest_date.month, latest_date.day, 13, 0, 0) else: default_end_time = datetime.datetime(latest_date.year, latest_date.month, latest_date.day, 16, 0, 0) end_time = min(now, default_end_time) minutes_count = range((end_time - start_time).seconds / 60 + 1) trade_minutes = map(lambda x: start_time + datetime.timedelta(minutes=x), minutes_count) # print trade_minutes rows = self.get_min_time_and_price(symbol, start_time, end_time) # print rows j = 0 # self.logger.info('rows = %s, \n trade_minutes = %s' %(rows[-2:], trade_minutes[-2:])) for i, time in enumerate(trade_minutes): if j >= len(rows): break # rows length may less than trade_minutes for 1 elements. if rows[j][0].minute > time.minute or rows[j][0].hour > time.hour: integrity_p = False else: j = j + 1 return integrity_p, rows
def get_datetime(self, date): if TradeTime.is_half_trade_day(date): passed_minutes = 13 * 60 - self.hours * 60 - self.minutes else: passed_minutes = 16 * 60 - self.hours * 60 - self.minutes return datetime.datetime(date.year, date.month, date.day, int(math.floor(passed_minutes / 60)), passed_minutes % 60, 0)
def run(self, current_time): dt = convert_to_us_east_dt(current_time) if TradeTime.is_half_trade_day(dt.date()) and self.half_days is False: return # if you want to run the schedule function immediately, # you would need to add below 2 line code, given the correct time interval. # dt += datetime.timedelta(hours=12, minutes=33) # print dt if self.date_rule.validate(dt) and self.time_rule.validate(dt): self.my_func()
def validate(self, dt): if TradeTime.is_trade_day(dt.date()): if TradeTime.is_half_trade_day(dt.date()) and self.hours * 60 + self.minutes >= 3*60 + 30: return False else: passed_minutes = dt.hour * 60 + dt.minute - (9*60 + 30) if passed_minutes == self.hours * 60 + self.minutes: return True else: return False return False
def add_missing_data_in_real_time( self, symbol='SVXY', ): us_dt = datetime.datetime.now(tz=pytz.timezone('US/Eastern')) now = datetime.datetime(us_dt.year, us_dt.month, us_dt.day, us_dt.hour, us_dt.minute, us_dt.second) if TradeTime.is_trade_day(now.date()): default_start_time = datetime.datetime(now.year, now.month, now.day, 9, 30, 0) start_time = max( default_start_time, datetime.datetime(now.year, now.month, now.day, now.hour - 1, now.minute, 0)) if now > start_time: if TradeTime.is_half_trade_day(now.date()): default_end_time = datetime.datetime( now.year, now.month, now.day, 13, 0, 0) else: default_end_time = datetime.datetime( now.year, now.month, now.day, 16, 0, 0) end_time = min(now, default_end_time) if end_time > start_time: minutes_count = range((end_time - start_time).seconds / 60 + 1) trade_minutes = map( lambda x: start_time + datetime.timedelta(minutes=x), minutes_count) # print trade_minutes rows = self.get_time_and_price(symbol, start_time, end_time) # print rows j = 0 missing_records = [] for i, time in enumerate(trade_minutes): if rows[j][0] > time: if j > 0: price = rows[j - 1][1] else: price = rows[0][1] missing_records.append( Equity(symbol, time, price, price, price, price, 0, 0)) else: j = j + 1 if len(missing_records) > 0: self.insert(missing_records) return len(missing_records)
def validate(self, dt): if TradeTime.is_trade_day(dt.date()): if TradeTime.is_half_trade_day(dt.date()): if self.hours * 60 + self.minutes >= 3.5 * 60: return False else: left_minutes = 13 * 60 - (dt.hour * 60 + dt.minute) if left_minutes == self.hours * 60 + self.minutes: return True else: return False else: left_minutes = 16 * 60 - (dt.hour * 60 + dt.minute) if left_minutes == self.hours * 60 + self.minutes: return True else: return False return False
def validate_integrity_for_min_data(self, symbol): print symbol us_dt = datetime.datetime.now(tz=pytz.timezone('US/Eastern')) now = datetime.datetime(us_dt.year, us_dt.month, us_dt.day, us_dt.hour, us_dt.minute, us_dt.second) integrity_p = True latest_date = TradeTime.get_latest_trade_date() start_time = datetime.datetime(latest_date.year, latest_date.month, latest_date.day, 9, 30, 0) if TradeTime.is_half_trade_day(latest_date): default_end_time = datetime.datetime(latest_date.year, latest_date.month, latest_date.day, 13, 0, 0) else: default_end_time = datetime.datetime(latest_date.year, latest_date.month, latest_date.day, 16, 0, 0) end_time = min(now, default_end_time) minutes_count = range((end_time - start_time).seconds / 60 + 1) trade_minutes = map( lambda x: start_time + datetime.timedelta(minutes=x), minutes_count) # print trade_minutes rows = self.get_time_and_price(symbol, start_time, end_time) # print rows j = 0 missing_time = [] for i, time in enumerate(trade_minutes): if i >= len(rows): break if rows[j][0] > time: if j > 0: price = rows[j - 1][1] else: price = rows[0][1] if not (time.hour == 9 and time.minute == 30): missing_time.append(time) else: j = j + 1 if len(missing_time) > 0: integrity_p = False return integrity_p, missing_time
def run_schedule_and_handle_function(schedule_functions, handle_function, start_date, end_date, logger): for dt in TradeTime.generate_datetimes(start_date, end_date): if Container.context.terminate_p: return Container.data.set_datetime(dt) logger.set_dt(dt) for schedule_function in schedule_functions: try: schedule_function.run(dt) except Exception as e: logger.error('Trace: ' + traceback.format_exc(), False) logger.error('Error: get action arguments failed:' + str(e)) try: handle_function() except Exception as e: logger.error('Trace: ' + traceback.format_exc(), False) logger.error('Error: get action arguments failed:' + str(e)) if dt.minute == 0: if (TradeTime.is_half_trade_day(dt.date()) and dt.hour == 13) or dt.hour == 16: Container.analysis.add_portfolio_trace(dt.date(), Container.api.portfolio)
def add_missing_data_in_real_time(self, symbol='SVXY', ): us_dt = datetime.datetime.now(tz=pytz.timezone('US/Eastern')) now = datetime.datetime(us_dt.year, us_dt.month, us_dt.day, us_dt.hour, us_dt.minute, us_dt.second) if TradeTime.is_trade_day(now.date()): default_start_time = datetime.datetime(now.year, now.month, now.day, 9, 30, 0) start_time = max(default_start_time, datetime.datetime(now.year, now.month, now.day, now.hour-1, now.minute, 0)) if now > start_time: if TradeTime.is_half_trade_day(now.date()): default_end_time = datetime.datetime(now.year, now.month, now.day, 13, 0, 0) else: default_end_time = datetime.datetime(now.year, now.month, now.day, 16, 0, 0) end_time = min(now, default_end_time) if end_time > start_time: minutes_count = range((end_time - start_time).seconds/60 + 1) trade_minutes = map(lambda x: start_time + datetime.timedelta(minutes=x), minutes_count) # print trade_minutes rows = self.get_min_time_and_price(symbol, start_time, end_time) # print rows j = 0 missing_records = [] # self.logger.info('rows = %s, \n trade_minutes = %s' %(rows[-2:], trade_minutes[-2:])) for i, time in enumerate(trade_minutes): if j >= len(rows): break # rows length may less than trade_minutes for 1 elements. if rows[j][0].minute > time.minute or rows[j][0].hour > time.hour: if j > 0: # price = rows[j-1][1] price = self.get_nearest_price(time, symbol) else: price = rows[0][1] # self.logger.info('missing record: j = %s, time=%s'%(j, time)) missing_records.append((symbol, time, price)) else: j = j + 1 if len(missing_records) > 0: for record in missing_records: self.insert(*record) return len(missing_records)