Tinkoff / invest-openapi

Документация для Тинькофф Инвестиции OpenApi
https://tinkoff.github.io/invest-openapi/
456 stars 52 forks source link

Ограничение на число HTTP запросов по факту меньше, чем в документации #648

Closed IvanIvanov1985 closed 2 years ago

IvanIvanov1985 commented 2 years ago

Добрый день. В документации указано, что количество GET запросов в /market/candles ограничено числом 240 в минуту на пользователя. Но по факту у меня ограничение меньше - я получаю код 429 раньше, чем после 240 запросов в минуту.

Я делал следующие эксперименты:

  1. Выполнение 240 запросов в /market/candles, ожидание минуту после последнего запроса и снова выполнение 240 запросов и так несколько раз

  2. Выполнение 240 запросов начинается в границу минуты (00 секунд), следующая пачка запросов в границу следующей минуты и т.д.

  3. Проверял это на тикерах в том числе иностранных из СПб биржи - то же самое (т.е. ограничение мосбиржи не влияет)

Во всех случаях я получаю следующий результат:

  1. Первая пачка из 240 запросов проходит нормально
  2. По остальным пачкам код 429 получаю раньше (примерно начиная с 100-го запроса уже), несмотря на то, что в 1-м эксперименте гарантированно с последенго запроса проходит минута.

Нормально всё работает, только если делать не более 120 запросов в минуту. Вроде бы на момент, когда я регистрировался ограничение было как раз 120, потом подняли (поправьте, если перепутал). Может это быть связано с этим и мне надо просто перерегистрироваться? Или ограничение 240 на самом деле распространяется на интервал, больший, чем минута?

ArtyomovOleg commented 2 years ago

Можете распределить запросы равномерно по секундам, тогда будет работать.

IvanIvanov1985 commented 2 years ago

Да, спасибо, так работает. Видимо технически ограничение работает не в минуту, а за меньший интервал времени. Правда строго 240 запросов в минуту не всегда получается, но почти 240 есть, это скорее всего связано с неточностью измерения времени на самом клиенте.

Правда если размазывать по секундам, возникает ещё пара вопросов:

  1. Чтобы получить минутные свечи по 240 тикерам каждую минуту и уложиться в лимит, нужно начинать запросы сразу после завершения этой минуты (максимум в 01 секунду). Есть ли в этой ситуации риск того, в момент 01 секунды свеча за прошлую минуту не будет завершена на сервере, и я получу искажённые данные (неправильный close_price)? Думаю, что есть, в связи с тем, что синхронизация часов на клиенте и сервере может разбежаться более чем на секунду. Cейчас чтобы гарантировать отсутствие такого риска я начинаю запросы в 30 секунд каждой минуты. С размазыванием по секундам 240 запросов так сделать не получится.

  2. У меня сейчас стоит свой request limiter на клиенте. Если я перейду на новый алгоритм более равномерного размазывания по секундам, есть вероятность, что время от времени я буду постоянно получать 429 из-за неточностей измерения времени. Это не приведёт к тому, что рано или поздно ip моего клиента забанят в чёрный список? Или банят, только если очень-очень много 429?

P.S. Есть ещё streaming интерфейс, но там 6 подключений и в доках рекомендуют не более 30 тикеров на подключение, иначе всё будет падать в частый reconnect. Т.е. только websocket не обойтись, чтобы получить нужный поток данных.

AlexanderVolkovTCS commented 2 years ago

Это не приведёт к тому, что рано или поздно ip моего клиента забанят в чёрный список

Бан может быть, если суммарное количество запросов с айпи превысит 1000 в минуту.

рекомендуют не более 30 тикеров

Цифра 30 условна и зависит от ликвидности бумаги и типа подписки. Жестких ограничений по количеству подписок нет, главное - успевать забирать присланные из сокета данные.