erhosen / gas-tinkoff-trades

Google Apps Script that imports your operations from Tinkoff Investments into Google Spreadsheets
MIT License
124 stars 28 forks source link

Некритичная проблема с вызовом TI_GetPortfolio() #15

Open Mefodyev opened 1 year ago

Mefodyev commented 1 year ago

Вызов TI_GetPortfolio() периодически возвращает Exception: Request failed for https://invest-public-api.tinkoff.ru returned code 429 (строка 271).

Не могу уловить порядок воспроизведения ошибки, возникает от случая к случаю. В круглых скобках ссылаюсь на номер счета из другого листа в виде =TI_GetPortfolio('Счета'!A2). Если писать в скобках сам номер, не поможет. Все подгрузится, только если из формулы убрать "=" и вставить заново. Причем, с обычным счетом портфолио подгружается сразу, а с ИИС падает чаще. Остальные функции работают корректно.

Хочется чтоб при открытии документа все погружалось сразу, без вмешательства в ячейки. Возможно, я что-то настроил не до конца. Подскажите пож. нормально ли это и как избавиться от ошибки.

HiHat commented 1 year ago

Думаю, что это ошибка API и ее надо регистрировать тут: https://github.com/Tinkoff/investAPI/issues

Mefodyev commented 9 months ago

@HiHat хочу поднять тот же вопрос. Ошибку не регал, т.к. она на время уходила. Сейчас кол-во инструментов в портфеле увеличилось и она вернулась. По моим наблюдениям, суть во времени выполнения запроса (~30 секунд). С портфелями, где инструментов мало, или запрос идет менее 30 секунд, все в порядке: image

Но если их много и запрос длится больше 30 секунд, то выполняется с ошибкой:

Снимок экрана 2024-01-02 в 19 21 56

И причина с предпоследним невыполненным шагом (не дождался конца):

Снимок экрана 2024-01-02 в 22 10 38

В документации их API не лазил, не знаю правильно ли описанное мной поведение. Уточняю на всякий случай, ошибка только(?) на их стороне и о ней тоже надо сообщать сюда? https://github.com/Tinkoff/investAPI/issues

PozhidaevGM commented 9 months ago

Я когда-то делал для своих целей форк без оформления тут, где решал проблему за счет кэширования инструментов (большой портфель не может обработаться, т.к. там на каждый элемент заново идёт обращение в тинёк о получении его характеристик). Т.е. решить можно только за счёт того, что если "сегодня" функцию еще не вызывал, то нужно будет запустить функцию несколько раз, чтобы кэш заполнился и 30 секунд хватало. Вечером выложу кусок, может кто-то из вас интегрирует (или сам закодит)

HiHat commented 9 months ago

Я когда-то делал для своих целей форк без оформления тут, где решал проблему за счет кэширования инструментов (большой портфель не может обработаться, т.к. там на каждый элемент заново идёт обращение в тинёк о получении его характеристик). Т.е. решить можно только за счёт того, что если "сегодня" функцию еще не вызывал, то нужно будет запустить функцию несколько раз, чтобы кэш заполнился и 30 секунд хватало. Вечером выложу кусок, может кто-то из вас интегрирует (или сам закодит)

Будем благодарны, если поделитесь примером! Почитал немного об ограничениях обхода лимита на время выполнения за 30 секунд и способах обхода, но пока не придумал как лучше реализовать!

HiHat commented 9 months ago

В документации их API не лазил, не знаю правильно ли описанное мной поведение. Уточняю на всякий случай, ошибка только(?) на их стороне и о ней тоже надо сообщать сюда? https://github.com/Tinkoff/investAPI/issues

Нет, похоже при больших портфелях происходит слишком много запросов к API и срабатывает ограничение на 23.5 секунды, которое скрипт пытается подождать, но его ожидание прерывается средой GAS, т.к. на бесплатном тарифе функция должна выполнятся не более чем за 30 секунд. Надеюсь найдём способ как оптимизировать скрипт и обойти ограничения API и среды GAS!

HiHat commented 9 months ago

При подготовке информации по портфелю, по каждому инструменту через API запрашивается его тикер. Можно сделать быстрый вариант вывода портфеля, где будут только FIGI инструментов! :)

Mefodyev commented 9 months ago

При подготовке информации по портфелю, по каждому инструменту через API запрашивается его тикер. Можно сделать быстрый вариант вывода портфеля, где будут только FIGI инструментов! :)

Нет, не вариант, смысл вывода всего портфеля был в возможности построить детализированную сводную таблицу со всей нужной инфой. Сама по себе фига никакого бизнес-смысла не несёт. Либо (правда проблему это не решит), можно сделать урезанный вариант getportfolio без кол-ва бумаг, ср. цены покупки, ст-ти покупки, нкд, и валюта три раза почему-то возвращается.

PozhidaevGM commented 9 months ago

Я когда-то делал для своих целей форк без оформления тут, где решал проблему за счет кэширования инструментов (большой портфель не может обработаться, т.к. там на каждый элемент заново идёт обращение в тинёк о получении его характеристик). Т.е. решить можно только за счёт того, что если "сегодня" функцию еще не вызывал, то нужно будет запустить функцию несколько раз, чтобы кэш заполнился и 30 секунд хватало. Вечером выложу кусок, может кто-то из вас интегрирует (или сам закодит)

HiHat уже сделал кэширование инструментов по фигам, значит выхода два:

  1. Костыль: запускать функцию несколько раз, пока все фиги не закэшируются; Как просрочится кэш - заново.
  2. Выгрузить на дополнительный лист фиги-имя, и "ВПРом" их подставлять потом уже на листе вне GAS (закоммитил сейчас изменения для вывода такой таблицы)

ЗЫЖ Обратите внимание, что фиги есть далеко не у всех инструментов, и надо наверное переходить на Uid

HiHat commented 9 months ago

В общем пока реализовано только кеширование получения имен инструментов по FIGI. На больших портфелях может работать не с первого раза (пока кэш не наполниться). Позже, возможно, придумаем, как обойти ограничение в 30 секунд на выполнение функций.