Направления и города
Для наличных направлений город становится частью пары и TXT-кода, чтобы курс не смешивался с другими городами.
iEXRates собирает предложения BestChange, рассчитывает итоговые курсы по вашим правилам, следит за конкурентами, публикует TXT-файлы и показывает оператору, почему курс получился именно таким.
Модуль создан для обменников, которым важно не просто получить курс из BestChange, а управлять позицией, маржой, комиссиями, городами, исключениями, формулами и скоростью обновления на большом количестве направлений.
топ-1, топ-2, топ-3 и конкретные конкуренты
теги, комиссии, шаги, округление и preview
отдельный файл под каждый профиль
быстрое обновление больших списков
Главная идея
Администратор задаёт профиль, направления и правила. Дальше система сама обновляет справочники, проверяет доступные пары, получает офферы, применяет формулы, защищает позицию и готовит файлы выдачи для сайта обменника.
Для наличных направлений город становится частью пары и TXT-кода, чтобы курс не смешивался с другими городами.
Можно учитывать резерв, лимиты, метки обменников, black list, свой обменник и нулевые значения.
Система умеет ориентироваться на конкретного конкурента и автоматически вставать выше или ниже него.
Что входит
Пример работы
Один раз задаются правила, дальше iEXRates сам получает рынок, выбирает корректный оффер, применяет защиту и публикует итоговый курс.
Например, BTC на наличные RUB, с обязательным городом Москва.
Позиция #2, быть выше выбранного обменника или брать среднее по топ-10.
Фильтры, резерв, лимиты, black list, комиссия, округление и защита от резких скачков.
Готовый код вида BTC-CASHRUB_MSK попадает в файл профиля и доступен сайту.
Формулы
Формула показывает доступные теги, объясняет каждый шаг расчёта и позволяет проверить результат до сохранения. Это удобно, когда курс должен учитывать не одну позицию, а несколько условий сразу.
пример правила
[pos:3]
+ step_to_competitor
− 0.15%Слежка и комиссии
Для каждого направления можно выбрать обменник-ориентир, режим “встать выше” или “встать ниже”, минимальный шаг, лимит изменения, комиссию и fallback, если нужный конкурент исчез из выдачи.
пример правила
Направление может ориентироваться не только на позицию, но и на конкретный обменник из выдачи BestChange.
Можно настроить курс так, чтобы он постоянно был чуть выше выбранного конкурента или аккуратно ниже него.
Лимит изменения и антискачок не дают курсу резко уйти из-за случайного оффера или временной ошибки рынка.
Для курса можно задать +1, -1, +1%, -1%, /5, /5% или свою формулу, чтобы сразу учитывать маржу и расходы.
Правила могут учитывать позиции, резерв, лимиты, метки обменников, город и чёрные списки.
Trace показывает, какой оффер выбран, какой шаг применён, где сработала комиссия и почему итог попал в TXT.
Аналитика
Операционный центр показывает скорость обновления, свежесть TXT, состояние очередей, ошибки API, историю расчётов и качество каждого направления.
Показывается длительность обновления, количество успешных пар, необновлённые направления и скорость в секунду.
Можно смотреть итоговый курс, raw rate, позицию, spread между местами и поведение конкурентов.
Проблема оформляется как понятная карточка: где упало, что было с ключом, URL, направлением и TXT.
Вход по ключам, группы прав, пользователи и журнал действий помогают безопасно работать команде.
Быстрое ядро
Go-ядро разделяет работу на этапы: справочники, проверка направлений, получение офферов, расчёт, защита позиции и генерация файлов. Это снижает задержки и позволяет масштабировать систему на тысячи пар.
dictionary.sync
Валюты, города, обменники и метки обновляются на сервере и используются из локального хранилища.
presence.scan
Система может сначала проверить, какие пары реально существуют, чтобы не грузить лишние курсы.
rates.fetch
URL/key pool, лимиты, повторы, кеш снимков и fallback помогают выдерживать нестабильность API.
rates.calculate
Формулы, позиции, комиссии, шаги и ограничения собираются в один понятный итоговый курс.
guard.apply
Проверяется целевая позиция, конкурент, минимальный шаг и допустимое изменение.
txt.generate
TXT пересобирается только при изменениях, поэтому публикация остаётся быстрой.
Дополнительные источники
Для Binance, Bybit, WhiteBIT, Heleket, файловых и ручных курсов предусмотрены отдельные профили, собственные коды, комиссии, TXT-файлы и серверная пагинация.
[binance_usdt-btc][bybit_usdt-btc][whitebit_usdt-btc][heleket_usdt-btc][manual_usdt-btc]готовый курс, обратный 1/курс или своя комиссия
Полезные материалы
Инструкции и помощь с настройкой вашего продукта.
Под капотом
iEXRates разделён на админку, API и отдельное Go-ядро. Админка не обращается к BestChange напрямую: она работает с готовыми данными из PostgreSQL, Redis и журналов, а обновление курсов выполняет серверный конвейер.
Frontend
React/Vite SPA с i18n, TanStack Query, серверными таблицами, виртуальными списками и живыми операционными разделами.
кеш запросов, обновления без перезагрузки и стабильная работа экранов
пагинация, фильтры и виртуальные списки для тысяч записей
быстрая сборка и адаптивный интерфейс админки
строгая типизация форм, API-контрактов и состояния интерфейса
Backend
NestJS 11 объединяет admin API, public API, настройки профилей, права доступа, scheduler, очередь задач и события для админки.
единый API для профилей, направлений, логов, доступа и источников
основная база, строгие модели и миграции схемы
горячий кеш, live-состояние, блокировки и быстрые снимки
быстрые журналы, история обновлений и аналитика событий
Infra
iEXRates разворачивается как отдельный серверный продукт: Go-ядро, Docker Compose, Nginx, PostgreSQL, Redis, ClickHouse и публичная выдача TXT-файлов.
worker pool, batch-обновления, rate limit и атомарная генерация файлов
единый запуск админки, API, engine, PostgreSQL, Redis, ClickHouse и Nginx
проксирование API и публичная выдача TXT-файлов
рекомендованная база для установки на сервер
Готово для обменника
Подключение настраивается под ваш обменник: профили, API-ключи, зеркала, направления, формулы, стратегия позиции, TXT-файлы, дополнительные источники и аналитика обновлений.
Проект подключается к действующей лицензии iEXExchanger и работает как дополнительный модуль к основной платформе.