Мы захотели надежности, и сделали интегратор курсов валют ADAMANT Currencyinfo
Вы знаете множество сервисов, которые предоставляют курсы фиатных и крипто- валют. В разной степени им свойственны недостатки:
Единственный источник данных
Предоставляются как 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
Считает финальный курс как средний/мин/макс, выбирает по приоритету источников 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