Пример #1
0
def run_scheduled_tasks():
    for task in TASKS:
        utc_now = DateTime.now()
        task.next_run = utc_now.replace(hour=task.hour,
                                        minute=task.minute,
                                        second=0,
                                        microsecond=0)
        if task.next_run < utc_now:
            task.next_run += task.interval

    while flow.wait(60.0):
        for task in TASKS:
            if task.next_run < DateTime.now():
                try:
                    LOG.info(f'Task: {task.function.__name__} has started')
                    task.running = True
                    task.function()
                except:
                    LOG.fatal(
                        f'Task: {task.function.__name__} should always catch exceptions'
                    )
                finally:
                    LOG.info(f'Task: {task.function.__name__} has finished')
                    if 'interval' in task:
                        task.next_run += task.interval
                        task.last_run = DateTime.now()
                        task.running = False
                    else:
                        TASKS.remove(task)
Пример #2
0
def security_update_by_interval(engine: Any, interval: timedelta):
    LOG.info(f'>> {security_update.__name__} source: {tool.source_name(engine, interval)}')

    default_range = Clazz(dt_to=config.datetime_from())
    with engine.SecuritySeries(interval) as security_series:
        time_range = security_series.time_range()
        LOG.debug(f'Time range entries: {len(time_range)}')

    for exchange_name in config.EXCHANGES:
        with store.ExchangeSeries() as exchange_series:
            securities = exchange_series[exchange_name]

        with engine.Session() as session:
            with flow.Progress(f'security-update: {exchange_name}', securities) as progress:
                for security in securities:
                    progress(security.symbol)
                    dt_from = time_range.get(security.symbol, default_range).dt_to
                    dt_to = tool.last_session(exchange_name, interval, DateTime.now())
                    for slice_from, slice_to in tool.time_slices(dt_from, dt_to, interval, 4096):
                        time_series = session.series(security.symbol, slice_from, slice_to, interval)

                        with engine.SecuritySeries(interval, editable=True) as security_series:
                            security_series += time_series

        LOG.info(f'Securities: {len(securities)} updated in the exchange: {exchange_name}')
Пример #3
0
def execute():
    symbol = 'ABC.NYSE'
    interval = tool.INTERVAL_1D
    begin = DateTime(2014, 11, 18).to_timestamp()
    end = DateTime.now().to_timestamp()
    show_vma(symbol, interval, begin, end)
    show_valid_swings(symbol, interval, begin, end)
    show_candidate_swings(symbol, interval, begin, end)
    show_strategy(symbol, interval, begin, end)
Пример #4
0
def security_verify(engine: Any):
    interval = tool.INTERVAL_1D
    source_name = tool.source_name(engine, interval)
    health_name = tool.health_name(engine, interval)
    LOG.info(f'>> {security_verify.__name__} source: {source_name}')

    with engine.SecuritySeries(interval) as security_series:
        time_range = security_series.time_range()

    with store.File(health_name, editable=True) as health:
        for exchange_name in config.EXCHANGES:
            health[exchange_name] = {}
            last_session = tool.last_session(exchange_name, interval, DateTime.now())

            with store.ExchangeSeries() as exchange_series:
                securities = exchange_series[exchange_name]

            entries = []
            with flow.Progress(health_name, securities) as progress:
                for security in securities:
                    progress(security.symbol)

                    result = Clazz()
                    symbol_range = time_range.get(security.symbol)
                    if symbol_range:
                        overlap, missing = time_series_verify(engine,
                                                              security.symbol,
                                                              symbol_range.dt_from,
                                                              last_session,
                                                              interval)
                        if overlap:
                            result.overlap = overlap
                        if missing:
                            result.missing = missing
                            if len(missing) > config.HEALTH_MISSING_LIMIT:
                                result.message = f'The missing limit reached: {len(missing)}'
                        if last_session in missing:
                            result.message = f'The last session {symbol_range.dt_to} < {last_session}'
                    else:
                        result.message = 'There is no time series for this symbol'

                    if result:
                        short_symbol, _ = tool.symbol_split(security.symbol)
                        health[exchange_name][short_symbol] = result

                    entry = security.entry(health_name)
                    entry[health_name] = 'message' not in result
                    entries += [entry]

            with store.ExchangeSeries(editable=True) as exchange_series:
                exchange_series |= entries

            LOG.info(f'Securities: {len(securities)} verified in the exchange: {exchange_name}')
Пример #5
0
def schedule_endpoint():
    if request.method == 'POST':
        LOG.info(f'Scheduling function {task_daily.__name__}')
        task = Clazz(next_run=DateTime.now().replace(microsecond=0),
                     running=False,
                     function=task_daily)
        TASKS.append(task)

    LOG.info('Listing threads and tasks')
    threads = [{
        'name': thread.name,
        'daemon': thread.daemon,
        'alive': thread.is_alive()
    } for thread in threading.enumerate()]

    content = dict(threads=threads, tasks=TASKS)
    return json.dumps(content,
                      option=json.OPT_INDENT_2,
                      default=tool.json_default).decode('utf-8')
Пример #6
0
def execute():
    symbol = 'ABC.NYSE'
    begin = DateTime(2017, 11, 1).to_timestamp()
    end = DateTime.now().to_timestamp()
    show_swings(symbol, begin, end)
Пример #7
0
                               value=config.EXCHANGES[0],
                               placeholder='exchange',
                               className='choice',
                               persistence=True)

engine_choice = dcc.Dropdown(id='engine-choice',
                             options=[{
                                 'label': s,
                                 'value': s
                             } for s in ENGINES],
                             value=list(ENGINES.keys())[0],
                             placeholder='engine',
                             className='choice',
                             persistence=True)

datetime_from = DateTime.now() - timedelta(days=3 * 365)

date_choice = dcc.DatePickerSingle(id='date-from',
                                   date=datetime_from.date(),
                                   display_format=DATE_PICKER_FORMAT,
                                   className='choice',
                                   persistence=True)

score_choice = dcc.Input(id='score-choice',
                         type='number',
                         min=1,
                         max=8,
                         step=1,
                         value=3,
                         className='score',
                         persistence=True)