Comments 13
Жаль, что вам не подошёл календарь торговых дней самой биржи
Да, в любом случае мне пришлось бы писать алгоритм поиска ближайшего торгового дня и какой-то момент я подумал, что лучше управлять этим внутри проекта, но после вашего комментария еще раз взглянул на то, что предоставляет moex и кажется, что стоит брать информацию оттуда. Как минимум, я вижу свою ошибку, что я брал производственный календарь в качестве источника данных, но это не совсем верно, так как не рабочий день != не торговый день. Например, 2024-01-03 был таким днем - не рабочий, но торговый (и еще несколько подобных ему).
Кажется, что я могу уйти от констант и ориентироваться на то, что вы указали. Спасибо!
интересное решение Давид
def get_last_trade_day(cls, start_dt: datetime = datetime.now()) -> dict[str, str | bool]:
Это не очень удачно написанная функция.
Про то, что она не нужна, уже выше разобрали. dict[str, str | bool]
Не сразу узнал в этой анотации день.
Используйте объекты вместо примитивов. Получите автодополнение и простоту понимания.
class TraidingDay(NamedTuple):
trade_date: date
is_trading_now: bool
is_trading_now я бы в функцию превратил, чтобы не хранить быстро протухающие данные.
Функция делает две вещи, определяет последний день и проверяют послений ли день сегодня. Стоит разбить на 3 функции чтобы получилось что-то типа.
Вместо одно большой получился несколько маленьких.
def get_last_trade_day(...)
last_trading_date = _get_last_trading_date(...)
is_trading = _is_trading(...)
...
Вместо цикла без переменной и переназначения переменной, можно просто проверять каждый день отдельно.
for days_before in range(cnst.MAX_DAYS_WEEKENDS):
... = _is_this_day_last(start=start_dt, days_before=days_before)
Функция в любом случае будет нужна, так как для определения последнего торгового дня нужно уметь искать назад в том случае, если сегодняшний день не торговый.
В тоже время, я действительно могу отказаться от констант в виде кортежа из значений WORKDAYS
и WEEKDAYS
. К слову, я уже это внедрил в проект.
Не совсем понял, что именно не так с данным тайп хинтом? dict[str, str | bool]
Функция возвращает словарь, ключи которого - это строка, а значения строка или булево значение - это так и есть в реальности.
К слову, на данный момент я в некоторых местах начал использовать namedtuple
- это уже добавлено в проект, в частности для константных значений.
Идея сделать is_trading_now()
функцией звучит весьма верно, только не совсем уверен, действительно ли полезна для проекта такая высокая актуальность данных, хотя, конечно, замечание верное.
Не совсем понял, что именно не так с данным тайп хинтом?
dict[str, str | bool]
Для человека он бесполезен. Чтобы работать с возвращаемым значением, мне нужно будет смотреть в функцию. Какие там ключи? Какого типа у каждого ключа значение?
Для статического анализатора тоже. Он постоянно будет спотыкаться на том, что у него либо один тип, либо другой. Тип Union (str | bool
) подходит только для аргументов, как возвращаемое значение он вреден.
Внутри каждого engines
есть расписание
Например для engines/stock
:
https://iss.moex.com/iss/engines/stock.json
см. блоки "timetable"
и "dailytable"
MoexBuilder: как я создаю библиотеку на Python. Часть 1