Меня тут попросили помочь с криптоаналитикой, а я как раз свою обновлять собирался, и вот занялся частью автоматизации загрузки информации с API бирж прямо в Google Scripts (без выхода из гугл-таблиц).
Аналитику делаем с Аней (@anikanaum), за подробные критерии и большую проделанную работу уже сейчас ей отдельное спасибо! Но перейду к автоматизации, к той части, которой занимаюсь я.
Задача была достаточно простая - загружать через API бирж курсы котировок на сейчас и месяц назад по имени валюты, и сохранять эти данные в таблицу. Обрабатывая возвращающийся JSON.
Всё это реализуемо при помощи гугл-скрипта ниже. Если у вас есть опыт работы с этой штукой, ниже будет один вопрос. А пока рассмотрим сам скрипт (работает, но с определенными "моментами").
Что надо иметь для начала
- Гугл-таблица, в которой, например, такие колонки:
** Колонка C - имена валют (большими буквами, без пробелов и знаков, пример: LTC, XMR, XPM)
** Колонка D - оставляйте пустой, туда запишутся текущие курсы
** Колонка E - оставляете пустой, туда запишутся курсы 30 дней назад - Если приготовили таблицу с колонкой C и именами валют, запомните номера строк, на которых эти валюты указаны. Например, если у вас 16 валют в строках с 5 по 20, то скрипт для вас заработает из коробки. Если нет - в range укажите строки, где записаны требуемые валюты, через запятую
Как запустить
- В таблице нажмите "Инструменты - редактор скриптов"
- Скопируйте скрипт ниже и вставьте его основное поле.
- Если условия выше выполнены и менять ничего не нужно, нажмите стрелку вправо (кнопку "плей"), вернитесь в таблицу и смотрите как примерно раз в 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);
}
}
Проблемы скрипта
- Маленькая проблема. Пока что не обрабатываются ошибки. Если вдруг вы постаивли пробел в названии валюты или неправильно указали его (указали несуществущую валюту), скрипт остановится на "этом месте". Вам придется редактировать Range или перезапускать с начала. Подробности об ошибке можно посмотреть, запустив скрипт кнопкой Bug (с жучком), вместо кнопки Play.
- Большая проблема. Rate limit exceeded (что-то вроде "лимит запросов достигнут"). Примерно после 100 запросов, на вскидку, постоянно начинает выскакивать эта ошибка. Подробности об ошибке можно посмотреть, запустив скрипт кнопкой Bug (с жучком), вместо кнопки Play. Если подождать около часа, точно не могу сказать - проходит. На следующий день, точно!
картинка просто в тему
Нужна помощь
Я пока не понял почему такие низкие лимиты на обработку гуглом (вроде как указано - 1 запрос в секунду, и не сказано ничего о лимитах после 100 запросов), и как с ними бороться (не хотелось бы внешними обработчиками). Если вы знаете как обойти эти ограничения или вписаться в них, просьба - комментируйте! Да и вообще, просто так. Комментируйте :)
Чуть более старая версия скрипта
https://pastebin.com/LgAHskux
С вами на связи линуксоид, альтернативщик,
Den Ivanov aka @SXIII
Добрый день! Спасибо за эту полезность! Можно спросить, у меня такая ошибка вылезает:
TypeError: Не удается вызвать метод "getRange" объекта null. (строка 22, файл Код)
Скрипт не правил, кроме того, что рэндж расширил до 61 строки. Проверил тикеры - все без пробелов, большими буквами, каждая в новой ячейке столбца С.
Спасибо! Заценю в ближайщее время )
@hohohoney пожалуйста :)
@sxiii, Поздравляю!
Ваш пост был упомянут в моем хит-параде в следующей категории:
Красота, как раз не хватало такой страницы в мою таблицу что бы ее больше автоматизировать. Большое спасибо. На днях попробую и отпишусь, есть одна просьба и пару предложений по улучшению.
Как то в телеграме один тип более функциональную продавал за 0.0300 битка.
@skyvirus - врядли более функциональную. У нас тут порядка 50 критериев по каждой крипте :) И уже два скрипта, автоматизирующие сбор инфы.
@sxiii наконецто добрался до этой таблицы. Создал и себе такую, спасибо. Вот только вы писали про 50 критериев. А по факту сам скрипт парсит только цены на сейчас и 30 дней надаз. А где же остальной функционал?
Цены то можно посмотреть и в том же табТрейдере
Да я так на вскидку, просто прочитал что сбор только цен и все. А был полноценый портфель. С удовольствием попробую ваш вариант и надеюсь смогу что то предложить. Но это уже наверное вечером когда компютеру доберусь.
Я там вчера еще вопрос задавал в посте про легкую OS. Не могли бы ответить, буду вам признателен.
Ане привет, она молодец:)
Помоему, очень крутая инициатива! Хоть я и не трейдер, но затею оценил=)
@ac1d инициатива крутая, особенно с той точки зрения, чтоб подключить людей. У меня собственная таблица давно есть, много над ней работал, но она подустарела - одному тяжеловато актуализировать всё время. Привет передам =)
А не проще ли расшарить готовую гугло-таблицу? Типа опен сорс. )
@vadbars - во-первых, она не готова. Во-вторых, она не моя. В-третьих, подобные таблицы есть уже, но там меньше обычно инфы и она другая или устаревшая :) В-четвертых, готовое - это не спортивно и не развивает так, как исходники.
Спасибо за этот небольшой tutorial) Пригодится
@allforyou, всё для тебя ;) пожалуйста
спасибки, очень интересно... дождусь зимы - попробую))))
@sergiy, пожалуйста! Почему так долго? :)