Exemplo n.º 1
0
 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)
Exemplo n.º 2
0
 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
Exemplo n.º 3
0
 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)
Exemplo n.º 4
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()
Exemplo n.º 5
0
 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
Exemplo n.º 6
0
 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)
Exemplo n.º 7
0
    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
Exemplo n.º 8
0
 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
Exemplo n.º 9
0
 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)
Exemplo n.º 10
0
 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)