Tinkoff / investAPI

399 stars 136 forks source link

Отличаются FIGI у операций связанных по parent_id #459

Closed Rashid567 closed 1 year ago

Rashid567 commented 1 year ago

Добрый день!

GetOperationsByCursorRequest мне вернул данные по двум связанным операциям:

Opr №1 - 'Покупка 20 облигаций Синара - Транспортные Машины выпуск 3'

id = '33877822245' position_uid = '1213388c-113f-4889-b74f-02a27a66f3ce' date = datetime.datetime(2022, 12, 16, 8, 8, 8, tzinfo=zoneinfo.ZoneInfo(key='Etc/UTC')) figi = 'TCSS0A105M91' instrument_uid = '34eb0ecc-e03f-46a6-8e78-4094a58efe7d'

Opr №2 - 'Комиссия брокера' - 'Синара - Транспортные Машины выпуск 3'

id = '3574444564' parent_operation_id = '33877822245' position_uid = '1213388c-113f-4889-b74f-02a27a66f3ce' date = datetime.datetime(2022, 12, 16, 13, 8, 46, 197000, tzinfo=zoneinfo.ZoneInfo(key='Etc/UTC')) figi = 'TCS00A105M91' instrument_uid = 'f508293e-50e2-4593-a2ed-2a1338ef4323'

У них отличаются figi (на один символ), но совпадают position_uid.

Как с этим быть и можно ли вообще полагаться на FIGI?

nonamegithub commented 1 year ago

и можно ли вообще полагаться на FIGI?

не нужно

Rashid567 commented 1 year ago

@nonamegithub, Спасибо!

Ещё один вопрос: position_uid это внешний ключ на Asset.uid?

nonamegithub commented 1 year ago

на Asset.uid?

Не боюсь показаться недалеким, но я не понял зачем он вообще нужен, даже прочитав документацию. Уверен, что и из команды разработчиков вряд ли кто сможет внятно объяснить его предназначение.

а

position_uid это внешний ключ

на position_uid из методов bonds, currencies, etfs, futures, shares, options из InstrumentsService

Rashid567 commented 1 year ago

@nonamegithub, покопавшись в данных и связях сложилась следующая картина:

Links

  1. Здесь Asset начинает играть ключевую роль, если требуется агрегация операций по активу (акции / облигации и т.д.).

  2. Не покидают меня ощущения, что position_uid ведет на скрытый параметр Asset-а или на скрытый объект, который соотносится с Asset-ом связью 1 к 1.

  3. Выяснил, почему FIGI нужно избегать использовать (вместо него использовать instrument_uid), но не везде это получится сделать.

    Почему следуют избегать: У инструмента могут поменять FIGI (происходит это редко). В этом случае старый инструмент удаляется/скрывается от пользователей, и создается новый. Так же создается связь между старым и новым инструментом с type = figi_changed.

    Пример изменения FIGI: Акции обыкновенные Совкомфлота

    Где придётся использовать FIGI:

    • Получение купонов
    • Получение дивидендов
    • Другие методы сервиса инструментов

И появились новые вопросы:

1) Зачем применять тип quotation там, где он не нужен? Пример: issue_size_plan в AssetBond

2) Зачем нужно было связывать купоны и дивиденды с инструментами, а не с активами? И что с ними произойдёт при смене инструмента?

AlexanderVolkovTCS commented 1 year ago

figi TCSS0A105M91 = это инструмент RU000A105M91_PSAU figi TCS00A105M91 = это инструмент RU000A105M91_TQCB

Оба инструмента относятся к одной и той же позиции. Это нормальная ситуация, когда вы одну и ту же позицию можете изменять разными торговыми инструментами (например, биржевой и внебиржевой)

По второму вопросу действительно иерархия такая: Asset (актив) -> Position(позиция) -> Instrument (инструмент) Связь 1 к N, у актива может быть несколько позиций, а позицию можно изменять несколькими инструментами.

Здесь Asset начинает играть ключевую роль, если требуется агрегация операций по активу (акции / облигации и т.д.).

верно

Где придётся использовать FIGI:

Получение купонов Получение дивидендов

в эти методы будет добавлен instrument_uid в 1.7

Зачем применять тип quotation там, где он не нужен? Пример: issue_size_plan в AssetBond

Сделано так исходя из внутреннего представления параметра как числа с плавающей точкой, вероятно на случай, если параметр не будет целым.

Зачем нужно было связывать купоны и дивиденды с инструментами, а не с активами? И что с ними произойдёт при смене инструмента?

Legacy брокера. Планируется добавить параметр _positionuid после доработки внутренних сервисов.

nonamegithub commented 1 year ago

Не боюсь показаться недалеким, но я не понял зачем он вообще нужен, даже прочитав документацию. Уверен, что и из команды разработчиков вряд ли кто сможет внятно объяснить его предназначение.

Оказался в состоянии когнитивного диссонанса, ознакомившись с ответом специалиста, и соотнеся его с информацией, полученной мною ранее, из документации. По факту оказалось, что я, как и прежде, в порядке, а причиной явилось переписывание разработчиками "втихую" раздела investAPI-main\src\docs\faq_identification.md документации. Я не против, на самом деле: пусть таким способом, но будем вносить ясность во все "темные" моменты документации InvestAPI.

Rashid567 commented 1 year ago

@AlexanderVolkovTCS, @nonamegithub Спасибо за разъяснения!

nonamegithub commented 1 year ago

ту же позицию можете изменять разными торговыми инструментами

@AlexanderVolkovTCS - слово "изменять" постоянно режет слух в вышеупомянутом контексте. Может есть смысл использовать слово "представлять", если Вы конечно не против? Например: "...позиция может быть представлена различными торговыми инструментами..."

AlexanderVolkovTCS commented 1 year ago

переписывание разработчиками "втихую"

Это я и переписал) Не думаю, что каждое обновление документации нужно как-то дополнительно анонсировать.

слово "изменять" постоянно режет слух в вышеупомянутом контексте

@nonamegithub да в том то и дело, что слово "представление" тоже не совсем корректно. Позиция в терминах Тинькофф Инвестиций - актив, которым вы владеете, позиция имеет только количественную оценку. Например, у вас в позициях акции сбера в количестве 2х штук. GetPositions() возвращает список ваших позиций.

А инструмент - это способ купить/продать позицию в указанном режиме торгов. Инструмент уже имеет котировки. Инструментов может быть несколько. Ордера могут выставляться только по инструментам.

Можно использовать термин "увеличить/уменьшить позицию"

nonamegithub commented 1 year ago

mshukilovich неплохо мысли выражает по русски, в отличие от SRadyukov. Пусть подключается к процессу.