Формулы позволяют находить курс для валютной пары, даже если биржа напрямую не предоставляет цен для данной пары. Например, нам нужно рассчитать цену BTC -> RUB. Прямого курса нет, но можно рассчитать его через 3ю валюту: BTC -> KGS -> RUB.
Кроме расчета курса при обменах, формулы еще используются для указания мин и макс суммы обмена и скидок. Например, для BTC -> RUB можно задать лимит в любой активной валюте - DOGE или USDT. Он будет пересчитан автоматически по текущему курсу. Поэтому формулы выделены отдельно и не привязаны к направлениям.
Сейчас для каждой пары валют можно задать только одну формулу.
/api/formulaМетод: GET
Описание: Загружает сохраненную формулу.
Права: 🟡 админка.
Параметры:
from - код валюты Отдаю, например BTC. Обязательный параметр;to - код валюты Получаю. Обязательный параметр;Ответ:
{
"type": "success",
"message": null,
"data": {
"id": 1,
"from": "RUB",
"to": "ETH",
"tag": "Cbr_RUB_EUR * Binance_EUR_EURI_buy * Binance_EURI_ETH_buy",
"reserve": "auto",
"lastUpdated": "2025-06-16 21:48:34",
"isEnabled": true,
"price": 0.000004825993433195978,
"spread": 0.13220134023363964
},
"action": null
}Подробности:
tag - сама формула. Большинство бирж позволяют загрузить поля buy и sell, в таком случае мы можем рассчитать спред. Если нет - то используем поле price, в таком формате данные предоставляет CoinMarketCap.isEnabled - использовать ли эту формулу. Если выключить, то все направления, где она используется, также будут отключены.price - текущая цена. Может быть равна 0, если не удается загрузить цену. Число попыток можно задать на странице биржи;spread - разница между ценой покупки и продажи, в процентах. Может быть равен 0;reserve - запасной вариант, если не удается загрузить курс. Варианты:
auto - найти новую формулу (по умолчанию);CoinMarketCap - переключиться на курс с CoinMarketCap. Это условие срабатывает только один раз. При этом курс добавляется в общий список, что позволяет его использовать для составления других формул в ручном или автоматическом режиме.off - отключить формулу и все направления, где она используется.Если формула не найдена, возвращается warning:
Ответ:
{
"type": "warning",
"message": "Формула не найдена",
"data": null,
"action": null
}/api/formulaМетод: PUT, POST
Описание: Добавляет новую формулу (PUT) или сохраняет (POST).
Права: 🔴 админка + isEditDirection.
Запрос:
{
"from": "RUB",
"to": "ETH",
"tag": "Cbr_RUB_ZAR * Binance_ZAR_ETH_buy",
"reserve": "auto",
"isEnabled": true
}Все параметры обязательны. Подробности:
from - код валюты Отдаю;to - код валюты Получаю;tag - формула;reserve - запасной вариант, если формула не работает;isEnabled - использовать ли эту формулу.Ответ:
{
"type": "success",
"message": "Формула RUB -> ETH добавлена",
"data": null,
"action": null
}/api/formulas/generateМетод: GET
Описание: Составляет новую формулу.
Права: 🔴 админка + isEditDirection, т.к. поиск занимает время.
Параметры:
from - код валюты Отдаю, например BTC. Обязательный параметр;to - код валюты Получаю. Обязательный параметр;calcMode - режим поиска;
auto - найти кросс-курс (по умолчанию);CoinMarketCap - Загрузить курс с CoinMarketCap;fromFile - Загрузить курс из файла на сервере. Файл называется kurs.json, его нужно создать.fromFile для данной пары будет выдавать ошибку.Пример файла kurs.json:
[
{
"from": "BTC",
"to": "USDT",
"price": 95000.0
}
]Алгоритм поиска для auto:
BTC-ETH;BTC-USDT-ETH. Максимальное число вершин <=5, т.к. поиск занимает время;Ответ:
{
"type": "success",
"message": null,
"data": {
"referentPrice": 0.000004826192891183676,
"referentSource": "CoinMarketCap",
"list": [
{
"path": "RUB -> USDT -> INJ -> ETH",
"price": 0.000004826162837544283,
"tag": "Cbr_RUB_USDT * Bybit_USDT_INJ_buy * Binance_INJ_ETH_buy",
"spread": 1.7976931348623157e+308
}
]
},
"action": null
}/api/formulasМетод: GET
Описание: Запрашивает список формул.
Права: 🟡 админка.
Параметры:
start - с какого по счету элемента начать выдачу данных. Например, если start = 10, то ответ начнется с 11-го элемента. По умолчанию start = 0.count - максимальное количество направлений для загрузки за один раз. Например, если count = 50, будет возвращено 50 элементов, начиная с позиции, указанной в start;isActive:
true - искать только по активным формулам;false - только по отключенным;isActive - по всем формулам;filter - фильтр по коду валюты или по тексту формулы. Будут найдены все валюты, которые содержат это слово. Например, если задать фильтр USD, будут получены все направления с USDT и USD. Если задать bybit, то будут получены все формулы, которые берут курс с биржи Bybit.Ответ:
{
"type": "success",
"message": null,
"data": {
"items": [
{
"id": 1,
"from": "RUB",
"to": "ETH",
"tag": "Cbr_RUB_ZAR * Binance_ZAR_ETH_buy",
"reserve": "auto",
"lastUpdated": "2025-06-16 22:07:03",
"isEnabled": true,
"price": 4.822979924657339e-7,
"spread": 0.2135622607997012
}
],
"total": 1,
"page": 1,
"pageSize": 100
},
"action": null
}/api/formulasМетод: DELETE
Описание: Удаляет формулы. Хотя они добавляются автоматически, этот метод тоже может пригодиться. Например, если одна из валют больше не нужна в обменнике.
Права: 🔴 админка + isEditDirection.
Параметры:
ids - список id для удаления. Целые числа, разделенные запятыми.Права: isEditCurrency
Ответ:
{
"type": "success",
"message": "Удалены формулы: BTC -> USDT, BTC -> ETH",
"data": null,
"action": null
}