[ПОЛЕЗНО] Скрипт Google Spreadsheets для парсинга курсов криптовалют через API + ЗАПРОС ПОМОЩИ [СКРИПТ]


Меня тут попросили помочь с криптоаналитикой, а я как раз свою обновлять собирался, и вот занялся частью автоматизации загрузки информации с API бирж прямо в Google Scripts (без выхода из гугл-таблиц).

Analysis

Аналитику делаем с Аней (@anikanaum), за подробные критерии и большую проделанную работу уже сейчас ей отдельное спасибо! Но перейду к автоматизации, к той части, которой занимаюсь я.

Задача была достаточно простая - загружать через API бирж курсы котировок на сейчас и месяц назад по имени валюты, и сохранять эти данные в таблицу. Обрабатывая возвращающийся JSON.

Всё это реализуемо при помощи гугл-скрипта ниже. Если у вас есть опыт работы с этой штукой, ниже будет один вопрос. А пока рассмотрим сам скрипт (работает, но с определенными "моментами").

Что надо иметь для начала

  • Гугл-таблица, в которой, например, такие колонки:
    Колонка C - имена валют (большими буквами, без пробелов и знаков, пример: LTC, XMR, XPM)
    Колонка D - оставляйте пустой, туда запишутся текущие курсы
    ** Колонка E - оставляете пустой, туда запишутся курсы 30 дней назад
  • Если приготовили таблицу с колонкой C и именами валют, запомните номера строк, на которых эти валюты указаны. Например, если у вас 16 валют в строках с 5 по 20, то скрипт для вас заработает из коробки. Если нет - в range укажите строки, где записаны требуемые валюты, через запятую

Script

Как запустить

  1. В таблице нажмите "Инструменты - редактор скриптов"
  2. Скопируйте скрипт ниже и вставьте его основное поле.
  3. Если условия выше выполнены и менять ничего не нужно, нажмите стрелку вправо (кнопку "плей"), вернитесь в таблицу и смотрите как примерно раз в 2-4 секунды заполняются соответствующие поля
function myFunction() {

var range = [5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];

var source = "C";                    // Из какой колонки берем значения
var target = "D";                    // В какую колонку пишем значения
var historical = "E";                // Куда пишем исторические значения
var historicaltime = "2592000";      // Сколько секунд назад значения интересуют (60*60*24*30, т.е. за месяц)
var currentunixtime = Date.now();

var monthago = currentunixtime - historicaltime      // Рассчет времени месяц назад
var base = "BTC"                                     // Базовая валюта

//var url = 'https://www.poloniex.com/public?command=returnTicker'

var ss = SpreadsheetApp.getActiveSpreadsheet();      // Выбираем активную таблицу
var sheet = ss.getSheetByName("Биржа");              // Выбираем нужную страницу

var index;
for (index = 0; index < range.length; ++index) {

var currency = sheet.getRange(source+range[index]).getValue();    // Берём название валюты из таблицы

var url = 'https://min-api.cryptocompare.com/data/price?fsym='+base+'&tsyms='+currency;   // Загружаем URL
var response = UrlFetchApp.fetch(url, {'muteHttpExceptions': true});                      // Получаем ответ
var json = response.getContentText();                                                     // Обрабатываем ответ
var data = JSON.parse(json);                                                              // Парсим json
var buf = 'data.'+currency                                                                // Формируем переменную по которой парсить результаты
SpreadsheetApp.getActiveSheet().getRange(target+range[index]).setValue(eval(buf));        // Пишем в ячейку распарсенный результат (eval(buf))

Utilities.sleep(2000); 

url = 'https://min-api.cryptocompare.com/data/pricehistorical?fsym='+base+'&tsyms='+currency+'&ts='+monthago
response = UrlFetchApp.fetch(url, {'muteHttpExceptions': true});
json = response.getContentText();
data = JSON.parse(json);
buf = 'data.'+base+'.'+currency
//eval(buf);
SpreadsheetApp.getActiveSheet().getRange(historical+range[index]).setValue(eval(buf));

Utilities.sleep(2000); 

}
}

Проблемы скрипта

  1. Маленькая проблема. Пока что не обрабатываются ошибки. Если вдруг вы постаивли пробел в названии валюты или неправильно указали его (указали несуществущую валюту), скрипт остановится на "этом месте". Вам придется редактировать Range или перезапускать с начала. Подробности об ошибке можно посмотреть, запустив скрипт кнопкой Bug (с жучком), вместо кнопки Play.
  2. Большая проблема. Rate limit exceeded (что-то вроде "лимит запросов достигнут"). Примерно после 100 запросов, на вскидку, постоянно начинает выскакивать эта ошибка. Подробности об ошибке можно посмотреть, запустив скрипт кнопкой Bug (с жучком), вместо кнопки Play. Если подождать около часа, точно не могу сказать - проходит. На следующий день, точно!

Problem
картинка просто в тему

Нужна помощь

Я пока не понял почему такие низкие лимиты на обработку гуглом (вроде как указано - 1 запрос в секунду, и не сказано ничего о лимитах после 100 запросов), и как с ними бороться (не хотелось бы внешними обработчиками). Если вы знаете как обойти эти ограничения или вписаться в них, просьба - комментируйте! Да и вообще, просто так. Комментируйте :)

Чуть более старая версия скрипта

https://pastebin.com/LgAHskux

С вами на связи линуксоид, альтернативщик,
Den Ivanov aka @SXIII


Кинорецензии Краудсписок Презентации Аналитика
СПО Криптовалюты Linux Скрипты


Comments 17


спасибки, очень интересно... дождусь зимы - попробую))))

19.05.2017 17:26
0

@sergiy, пожалуйста! Почему так долго? :)

19.05.2017 18:35
0

Спасибо за этот небольшой tutorial) Пригодится

19.05.2017 17:33
0

@allforyou, всё для тебя ;) пожалуйста

19.05.2017 18:36
0

А не проще ли расшарить готовую гугло-таблицу? Типа опен сорс. )

19.05.2017 19:26
0

@vadbars - во-первых, она не готова. Во-вторых, она не моя. В-третьих, подобные таблицы есть уже, но там меньше обычно инфы и она другая или устаревшая :) В-четвертых, готовое - это не спортивно и не развивает так, как исходники.

20.05.2017 01:08
0

Помоему, очень крутая инициатива! Хоть я и не трейдер, но затею оценил=)

19.05.2017 19:33
0

@ac1d инициатива крутая, особенно с той точки зрения, чтоб подключить людей. У меня собственная таблица давно есть, много над ней работал, но она подустарела - одному тяжеловато актуализировать всё время. Привет передам =)

20.05.2017 01:10
0

Ане привет, она молодец:)

19.05.2017 19:34
0

Красота, как раз не хватало такой страницы в мою таблицу что бы ее больше автоматизировать. Большое спасибо. На днях попробую и отпишусь, есть одна просьба и пару предложений по улучшению.
Как то в телеграме один тип более функциональную продавал за 0.0300 битка.

20.05.2017 09:20
0

@skyvirus - врядли более функциональную. У нас тут порядка 50 критериев по каждой крипте :) И уже два скрипта, автоматизирующие сбор инфы.

20.05.2017 09:23
0

Да я так на вскидку, просто прочитал что сбор только цен и все. А был полноценый портфель. С удовольствием попробую ваш вариант и надеюсь смогу что то предложить. Но это уже наверное вечером когда компютеру доберусь.

Я там вчера еще вопрос задавал в посте про легкую OS. Не могли бы ответить, буду вам признателен.

20.05.2017 09:27
0

@sxiii наконецто добрался до этой таблицы. Создал и себе такую, спасибо. Вот только вы писали про 50 критериев. А по факту сам скрипт парсит только цены на сейчас и 30 дней надаз. А где же остальной функционал?
Цены то можно посмотреть и в том же табТрейдере

16.06.2017 08:09
0

@sxiii, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующей категории:

  • Голосов - 10 позицию - 101 Голосов
21.05.2017 07:32
0

Спасибо! Заценю в ближайщее время )

26.05.2017 10:54
0

@hohohoney пожалуйста :)

27.05.2017 01:37
0

Добрый день! Спасибо за эту полезность! Можно спросить, у меня такая ошибка вылезает:
TypeError: Не удается вызвать метод "getRange" объекта null. (строка 22, файл Код)

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

11.06.2017 02:37
0