Сергей Ветко
Сергей Ветко личный блог
12 сентября 2018, 12:35

Автоматическое получение биржевых котировок в Google Spreadsheet

Приветствую вас, начинающие (и не только) портфелеводы. В прошлый раз (https://smart-lab.ru/blog/492069.php) мы значительно облегчили себе жизнь, частично автоматизировав ввод сделок. Сегодня сделаем еще один небольшой шажок в светлое будущее, научим наш Гугл документ по расписанию забирать актуальные котировки.

Шаг этот будет немного скучный (так как придется немного попрограммировать), но, надеюсь, полезный.

Итак, приступим. Без лишних слов хочу показать Гугл документ, в котором уже реализовано обновление котировок: https://docs.google.com/spreadsheets/d/1vGj_NszrlVt-1sA225RAgkOLEkdiGBmnSa3lTpsWfzI/edit?usp=sharing

Вполне возможно, что вам этого будет достаточно. Если же остались вопросы, то коротенько опишу, что он делает и как работает.

Во-первых, в этом документ есть лист «Портфель», который содержит информацию по вашим ценным бумагам. Для примера я оставил несколько бумаг (акций и облигаций), убрав все лишнее (в том числе и форматирование).

Автоматическое получение биржевых котировок в Google Spreadsheet

Для обновления котировок нужно нажать большую красную кнопку, после чего скрипт запросит у вас (вы должны быть залогинены в Гугл) определенные разрешения (их нужно дать, иначе не работает) и начнет получать данные. По результаты работы выдает такое сообщение:

Автоматическое получение биржевых котировок в Google Spreadsheet

Как же все работает?

Сначала в скрипте (сам скрипт можно скачать по ссылке: 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 появляются нужные нам данные:

Автоматическое получение биржевых котировок в Google Spreadsheet

Для облигаций дополнительно сохраняется информация по купону (дата и размер следующего и т.д.), экспирации, НКД.

Потом эти данные можно использовать для подсчета будущих денежных поступлений (описывал здесь: https://smart-lab.ru/blog/492305.php)

Осталось два небольших действия:

1. На листе «Портфель» в колонку «Рыночная цена» прописываем формулу, которая будет показывать актуальные данные с листа XMLStocks: VLOOKUP($A8,XMLStocks!$A$2:$P$98, 3, FALSE)

2. Добавляем в триггеры проекта регулярное выполнение функции stocksAndBondsRealTime() 

Автоматическое получение биржевых котировок в Google Spreadsheet
Я запускаю эту функцию раз в час, чаще необходимости не вижу. Да и зачем создавать лишнюю нагрузку на сервера Гугла и Биржи?

В дополнение для каждой бумаги в портфеле я добавил две колонки «Цена алерта покупать» и «Цена алерта продавать». Они нужны для оповещения по почте, когда рыночная цена оказывается меньше или больше желаемой. Скрипт, получив все котировки, проверяет целевые цены и формирует массив на отправку. Также у меня есть оповещения (код функций я здесь не привожу, там все несложно, просто сравниваю одну цену с другой), если цена какой-то бумаги изменилась больше, чем на заданную величину (limitForWarningGlobal = 4 в моем случае). Выглядит письмо примерно так:

Автоматическое получение биржевых котировок в Google Spreadsheet

Сначала я думал, что это мне будет полезно, но в реальной жизни оказалось, что я все равно никаких действий не предпринимаю, даже если цена поменялась на эти 4-5 процента. Разве что может быть полезно узнать, что облигации ваши сильно просели. Если у эмитента начались какие-то проблемы, то облигации падают не так быстро, как акции. Можно успеть слить их процентов по 90 от номинала, а не дожидаться падения до 30% и ниже (как у меня было с Татфондбанком)

 

 

 

58 Комментариев
  • Гденьги ☭
    12 сентября 2018, 12:58
    Можно пойти дальше и использовать https://datastudio.google.com/gallery


  • Grigoriy Romanenkov
    12 сентября 2018, 13:02
    =importxml? не, не слышали
    =googlefinance? не, не слышали
    имхо, если можно формулами, то скрипты избыточны
      • Grigoriy Romanenkov
        12 сентября 2018, 13:20
        Сергей Ветко, могу сходу привести пример с башнефтью преф, например. Он не вытаскивается Google Finance, поэтому на его примере зарюхал importxml.
        Обратите внимание, что источник может быть любой. В этом примере — яху финансе, но там нету ОФЗ, я сейчас сходу не нашёл.
        =ПОДСТАВИТЬ(ПОДСТАВИТЬ(ИНДЕКС(IMPORTXML(СЦЕПИТЬ(«finance.yahoo.com/quote/BANEP.ME»);"//*[@class='Trsdu(0.3s)']");1;1);",";"");".";",")

        То есть, если надо именно ОФЗ, то надо найти сайт где есть котировки — и переписать xml-path в запросе в формуле.
        С помощью ПОДСТАВИТЬ исправляем формат (точка -> запятая)
          • Grigoriy Romanenkov
            12 сентября 2018, 13:41
            Сергей Ветко, вот и я о том же — можно в формулу вкорячить сайт мосбиржи, а если на мосбирже нет (очевидно) котировок других бирж — то любой другой сайт. 
  • Иван Симпл
    12 сентября 2018, 18:47
    Интересно! Искал что то похожее когда себе портфель в гугл таблицах создавал. 
    В итоге нашел

    =GOOGLEFINANCE($A2,«price»)
    Где А2 префикс биржи и тикер

    И

    =GOOGLEFINANCE($A2,«changepct»)
    Изменение процентное цены

    Этих двух значений вполне хватает для портфеля акций на американском рынке и российском
    Обновление происходит автоматически (не знаю точный интервал, но около 1 минуты) 

      • Артём Курбатов
        16 октября 2020, 14:37
        Сергей Ветко, аналогично, а ещё для просмотра состояния портфеля нужно открывать саму таблицу и невозможно строить график во времени, поэтому я подумал немного в другую сторону и сделал телеграм-бота, который по расписанию обновляет котировки и отправляет сообщение с результатами, может вам тоже понравится misterbuffett.ru
  • АлексейЧ.
    21 сентября 2018, 08:26
    технический вопрос

    не могу запустить скрипт
    Как понимаю красная кнопка в режиме редактирования и 
    функционал свой не отрабатывает

    Открывал готовый файл https://docs.google.com/spreadsheets/d/1vGj_NszrlVt-1sA225RAgkOLEkdiGBmnSa3lTpsWfzI/edit?usp=sharing

    Просьба напишите как запустить 
    поиском пользовался
    остался бубен и форум SL))
    Спасибо!
      • АлексейЧ.
        21 сентября 2018, 15:39
        Сергей Ветко, пока нет
        возможно у меня не установлены отдельные дополнения.
        как можно вызвать триггеры текущего проекта?
          • АлексейЧ.
            22 сентября 2018, 04:33
            Сергей Ветко, заработало!!! Сергей спасиб!
            остался вопрос, как вызвать меню с периодичностью обновления - 
            “Триггеры текущего проекта”

              • АлексейЧ.
                23 сентября 2018, 05:43
                Сергей Ветко, Спасибо! Запустил! 
              • АлексейЧ.
                23 сентября 2018, 05:44
                Сергей Ветко, Спасибо за помощь.
  • Артем П.
    05 ноября 2018, 22:22

    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»;

    А как формируются эти ссылки? Есть чтото вышестоящее со ссылками? Ибо например в акциях нету ETFов, в бондах нету корпоратива, попробовал поподбирать collection_id= другие ключи подставлять типа boardid все безуспешно
  • Сергей
    09 апреля 2019, 20:50
    Здравствуйте Сергей. 
    Не могли бы Вы выложить образец своей Таблицы учета облигаций и акций с помощью Google Spreadsheet?
    С уважением Сергей.
  • Сергей
    10 апреля 2019, 07:36
    Здравствуйте Сергей. 
    Интересует шаблон с учетом облигаций на одном листе, акций на другом, а лист портфель суммарно. 
  • Илья
    16 апреля 2019, 13:32
    Здравствуйте, Сергей!
    Спасибо большое за статью и файл.
    А можете рассказать как поменять скрипт таким образом, чтобы в ценах разделителем между рублями и копейками была не точка, а запятая?
  • Илья
    16 апреля 2019, 14:16
    я пробовал поставить в настройках документа формат российский, для всех ячеек разделитель становится запятая.
    но скрипт берёт данные из xml файла с сайта биржи, где разделитель — точки
    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
    в результате в формулах получаются ошибки.
    а как вы тогда переносите сделки из quik в эксель и потом в из экселя в гугл?
    у меня данные из quik в эксель тоже выгружаются с разделителем — запятая.
    • Дмитрий
      30 октября 2019, 23:36
      Илья, в гугле можно воспользоваться функцией SUBSTITUTE, чтобы заменить точки на запятые
  • Илья
    16 апреля 2019, 14:40
    а у меня везде запятые, что тоже было очень удобно :-)
  • Сергей Кузьмичев
    10 июля 2019, 16:33
    IMPORTXML(«iss.moex.com/issrpc/marketdata/stock/shares/daily/download/micex_stock_shares.xml?collection_id=3&board_group_id=57&start=0&limit=10000&lang=ru», "//row[@SECID="«SBER»"]/@LAST")

    Вставляем в google sheets. Не благодарите




    • Олег Кузьмин
      21 июля 2019, 20:32
      Сергей Кузьмичев, что-то у меня не работает :/

  • Дмитрий
    30 октября 2019, 23:13
    Шикарный пост, шикарные комментарии! Ребята, всем огромное спасибо
  • Stanislav Statkevich
    23 декабря 2019, 12:42
    Все сломалось. Московская биржа поменяла ISS.
  • Stanislav Statkevich
    23 декабря 2019, 12:48
    Я тупенький, я их теперь даже найти не могу. (
  • guldan
    23 декабря 2019, 13:44
    Да сломались акции
    iss.moex.com/issrpc/marketdata/stock/shares/daily/download/micex_stock_shares.xml?_id=3&board_group_id=57

    При этом облигации работают
  • Stanislav Statkevich
    23 декабря 2019, 14:11
    Все теперь вместо iss.moex.com/issrpc/
    iss.moex.com/iss/
    Но еще и параметры старые не подходят. :(
  • Stanislav Statkevich
    24 декабря 2019, 06:57
    Заработало все по старым запросам.
  • Даниил Высоцкий
    26 января 2020, 11:12

    Отличная статья! Сергей, спасибо за готовый скрипт. =)

    Чуть-чуть допили его под себя, добавив ссылку на листинг ETF-фондов:

    // ETF bonds
    var micex_bonds_url_etf = «iss.moex.com/issrpc/marketdata/stock/shares/daily/download/micex_stock_shares.xml?collection_id=151&board_group_id=57&start=0&limit=100000&lang=ru»;



    И соответственно в stocksAndBondsRealTime():

    allStocksAndBonds = allStocksAndBonds.concat(collectStocksFromXML(micex_bonds_url_etf, 'etf'));


     
  • Максим Филенко
    30 июля 2020, 15:43
    Доброго дня! Подскажите, может знаете, как c moex забрать историю курсов валют? Желательно в разрезе open, low, up, close?
  • Дмитрий Sh
    22 февраля 2021, 21:27
    подскажите пожалуйста если сможете 
    low52 и high52 на привелигерованные акции
    через importxml полагаю нужно тянуть — найти не могу 
  • Sergej M
    28 мая 2021, 09:30
    Недавно стала появляться такая ошибка «White spaces are required between publicId and systemId». С чем может быть связана?

Активные форумы
Что сейчас обсуждают

Старый дизайн
Старый
дизайн