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