Вы знаете множество сервисов, которые предоставляют курсы фиатных и крипто- валют. В разной степени им свойственны недостатки:
-
Единственный источник данных
-
Предоставляются как SaaS на их хостинге
-
Завышенная стоимость подписки
-
Сложный API
Ключевой мотив создания ADAMANT Currencyinfo — надежность. Вот недавний и очередной пример фейла Coinmarketcap:
По курьей причине API Coinmarketcap отдавал курсы некоторых криптовалют с дефектом ~98%. Если у вас свой обменник, я уверен, что вы бы не хотели отдать 1000 INJ за 370 USD при реальной стоимости 20k USD.
Аналогичные проблемы мы наблюдаем и у других провайдеров курсов с частотой 1–2 раза в год.
Резюме
Мы сделали сервис, который собирает данные курсов валют от нескольких источников и анализирует их корректность, и хостится на собственном сервере.
Currencyinfo полностью бесплатен и с открытым кодом: https://github.com/Adamant-im/currencyinfo
Написали на TypeScript, для установки на ваш сервер/VPS можно использовать Docker или собрать из репозитория. Требования к VPS минимальны, а для подключения источников данных достаточно их бесплатных аккаунтов. Уведомляет о сомнительных курсах в Slack, Discord или ADAMANT Messenger.
Как проверяем курсы
Currencyinfo получает данные из источников, которые вы указали в конфиге и анализирует валидность курса каждой валюты:
-
Считает ненадежными курс валюты, если получили данные менее, чем от minSources источников
-
Группирует курсы валюты по rateDifferencePercentThreshold
-
Выбирает самую надежную группу по groupPercentage или весам надежности weight
-
Считает финальный курс как средний/мин/макс, выбирает по приоритету источников priorities, или по весу надежности weight.
Вот пример для вычисления курса ADM/USD, когда получили разные курсы от трех источников — Coinmarketcap, Coingecko и Cryptocompare:
Детальное описание алгоритма — в GitHub Wiki.
Источники данных
Currencyinfo умеет работать с данными:
-
MOEX — Московская биржа. Увы, USD и EUR они не торгуют, но данные по RUB и CNY актуальны.
-
Currency API — Обновляет данные раз в день, поэтому имеет смысл только для фиата
-
ExchangeRate.Host — Предоставляет актуальные курсы фиата, драгоценных металлов и биткоина
-
CoinMarketCap — Курсы криптовалют с ежеминутными обновлениями
-
CryptoCompare — Курсы фиата криптовалют с частыми обновлениями
-
CoinGecko — Курсы криптовалют с ежеминутными обновлениями
С какими источниками данных работать вы укажете в конфиге. Некоторые из них требуют API-ключи, но для Currencyinfo с обновлением refreshInterval в 10 минут достаточно бесплатных аккаунтов. Если хотите получать курсы чаще — смотрите тарифы соответствующих источников данных.
Пример запроса
Текущий курс:
GET http://localhost:36661/get?coin=ADM
{ "success": true, "date": 1726827454221, "result": { "ADM/USD": 0.029495299897, "ADM/RUB": 2.738651632396, "ADM/EUR": 0.026429853379, "ADM/CNY": 0.208056836954, "ADM/JPY": 4.243900904361, "ADM/BTC": 4.64113e-7, "ADM/ETH": 0.000011601089, "ADM/KRW": 39.384183204721 }, "last_updated": 1726827222510, "version": "4.1.0" }
Курс в момент времени:
GET http://localhost:36661/getHistory?coin=ADM×tamp=1725185959
{ "success": true, "date": 1726827656521, "result": [ { "_id": "66d43eb65a01993b593fed57", "date": 1725185716605, "tickers": { "ADM/KRW": 39.986732414654, "ADM/ETH": 0.000012060532, "ADM/BTC": 5.14865e-7, "ADM/JPY": 4.370208962216, "ADM/CNY": 0.212048693004, "ADM/EUR": 0.027028233555, "ADM/RUB": 2.73320760724, "ADM/USD": 0.029895049192 } } ], "last_updated": 1726827222510, "version": "4.1.0" }
Еще больше надежности
Помимо верификации самих курсов валют, нам важно контролировать и доступность API сервиса. Вот как мы это делаем:
-
Запустили сервис у надежного VPS-провайдера
-
Настроили заббикс, который проверяет состояние VPS в целом и дату последнего обновления курсов «last_updated»: 1726827222510
-
Настроили уведомления от Currencyinfo
-
Запустили не один сервис Currencyinfo, а два, и в приложениях (Мессенджер АДАМАНТ, бот-обменник, виджеты) делаем их Health check
ссылка на оригинал статьи https://habr.com/ru/articles/844858/
Добавить комментарий