Приветствую вас, начинающие (и не только) портфелеводы. В прошлый раз (https://smart-lab.ru/blog/492069.php) мы значительно облегчили себе жизнь, частично автоматизировав ввод сделок. Сегодня сделаем еще один небольшой шажок в светлое будущее, научим наш Гугл документ по расписанию забирать актуальные котировки.
Шаг этот будет немного скучный (так как придется немного попрограммировать), но, надеюсь, полезный.
Итак, приступим. Без лишних слов хочу показать Гугл документ, в котором уже реализовано обновление котировок: https://docs.google.com/spreadsheets/d/1vGj_NszrlVt-1sA225RAgkOLEkdiGBmnSa3lTpsWfzI/edit?usp=sharing
Вполне возможно, что вам этого будет достаточно. Если же остались вопросы, то коротенько опишу, что он делает и как работает.
Во-первых, в этом документ есть лист «Портфель», который содержит информацию по вашим ценным бумагам. Для примера я оставил несколько бумаг (акций и облигаций), убрав все лишнее (в том числе и форматирование).
Для обновления котировок нужно нажать большую красную кнопку, после чего скрипт запросит у вас (вы должны быть залогинены в Гугл) определенные разрешения (их нужно дать, иначе не работает) и начнет получать данные. По результаты работы выдает такое сообщение:
Как же все работает?
Сначала в скрипте (сам скрипт можно скачать по ссылке: my.pcloud.com/publink/show?code=XZG0Q17ZuC1NsO3HKY8PaD2e8cAzXR5Byz47) идет «настроечная часть», где нужно прописать правильный ID листа, УРЛы до данных и т.п.:
var sheet_id = «1vGj_NszrlVt-1sA225RAgkOLEkdiGBmnSa3lTpsWfzI»;
var googleSpreadSheet = SpreadsheetApp.openById(sheet_id);
var micex_xml_stocks_url = «www.micex.ru/issrpc/marketdata/stock/shares/daily/download/micex_stock_shares.xml?collection_id=3&board_group_id=57&start=0&limit=10000&lang=ru»;
//OFZ bonds
var micex_bonds_url_ofz = «www.micex.ru/issrpc/marketdata/stock/bonds/daily/download/micex_stock_bonds.xml?collection_id=7&board_group_id=58&start=0&limit=1000&lang=ru»;
//my tickers settigns
var rangeDefPortfolio = «A8:AC120»;
var myBadTickersGlobal = ['TODO:','EXTRA']; //no real tickers which exist in my Portfolio. I want to ignore them
var myTickersDataGlobal = {}; //Some extra data about my tickers parsed from the Portolio sheet. I need to know number of lots, types, etc...
var myTickersGlobal = collectMyTickersNew();
var limitForWarningGlobal = 4;
var warningsArr = []; //if a price changes — we'll push info about changed ticker into this global array
var allErrors = [];
С помощью функции collectMyTickersNew() собираются данные о ваших ценных бумагах с листа «Портфель». Это нужно, чтобы сохранять информацию только по нужным активам.
Основная функция — stocksAndBondsRealTime(), именно ее нужно запускать, чтобы получить обновленные котировки. Сама она достаточно простая.
Сначала забирает XML данные по указанным в начале адресам, формирует массив в нужном формате, а потом записывает его на лист «XMLStocks».
Все легко и элегантно, в результате на листе XMLStocks появляются нужные нам данные:
Для облигаций дополнительно сохраняется информация по купону (дата и размер следующего и т.д.), экспирации, НКД.
Потом эти данные можно использовать для подсчета будущих денежных поступлений (описывал здесь: https://smart-lab.ru/blog/492305.php)
Осталось два небольших действия:
1. На листе «Портфель» в колонку «Рыночная цена» прописываем формулу, которая будет показывать актуальные данные с листа XMLStocks: VLOOKUP($A8,XMLStocks!$A$2:$P$98, 3, FALSE)
2. Добавляем в триггеры проекта регулярное выполнение функции stocksAndBondsRealTime()

Я запускаю эту функцию раз в час, чаще необходимости не вижу. Да и зачем создавать лишнюю нагрузку на сервера Гугла и Биржи?
В дополнение для каждой бумаги в портфеле я добавил две колонки «Цена алерта покупать» и «Цена алерта продавать». Они нужны для оповещения по почте, когда рыночная цена оказывается меньше или больше желаемой. Скрипт, получив все котировки, проверяет целевые цены и формирует массив на отправку. Также у меня есть оповещения (код функций я здесь не привожу, там все несложно, просто сравниваю одну цену с другой), если цена какой-то бумаги изменилась больше, чем на заданную величину (limitForWarningGlobal = 4 в моем случае). Выглядит письмо примерно так:
Сначала я думал, что это мне будет полезно, но в реальной жизни оказалось, что я все равно никаких действий не предпринимаю, даже если цена поменялась на эти 4-5 процента. Разве что может быть полезно узнать, что облигации ваши сильно просели. Если у эмитента начались какие-то проблемы, то облигации падают не так быстро, как акции. Можно успеть слить их процентов по 90 от номинала, а не дожидаться падения до 30% и ниже (как у меня было с Татфондбанком)
=googlefinance? не, не слышали
имхо, если можно формулами, то скрипты избыточны
В итоге нашел
=GOOGLEFINANCE($A2,«price»)
Где А2 префикс биржи и тикер
И
=GOOGLEFINANCE($A2,«changepct»)
Изменение процентное цены
Этих двух значений вполне хватает для портфеля акций на американском рынке и российском
Обновление происходит автоматически (не знаю точный интервал, но около 1 минуты)
не могу запустить скрипт
Как понимаю красная кнопка в режиме редактирования и
функционал свой не отрабатывает
Открывал готовый файл https://docs.google.com/spreadsheets/d/1vGj_NszrlVt-1sA225RAgkOLEkdiGBmnSa3lTpsWfzI/edit?usp=sharing
Просьба напишите как запустить
поиском пользовался
остался бубен и форум SL))
Спасибо!