Назад к блогу

Кросс-курсы валют: как их рассчитывать и использовать (руководство для разработчиков)

V
Vlado Grigirov
May 09, 2026
Exchange Rates Currency API Forex Education Developer Guide Finexly

Если вашему приложению нужно конвертировать бразильские реалы в индийские рупии, норвежские кроны в сингапурские доллары или любую другую пару, в которой доллара США нет ни с одной стороны, вам предстоит работать с кросс-курсами. Большинство валютных API и форекс-площадок котируют тысячи пар против доллара, но лишь горстка пар торгуется напрямую между двумя не-USD валютами. Всё остальное — а это длинный хвост — рассчитывается как кросс-курс.

В этом руководстве мы объясним, что такое кросс-курс, разберём формулу в трёх её формах, приведём проверяемые примеры расчёта и продакшн-код на JavaScript, Python, PHP и cURL. Также мы рассмотрим ловушки, из-за которых в реальных системах появляются ошибки порядка одного процента: округление, бид-аск-спред, устаревшие котировки и неверная инверсия.

Что такое кросс-курс

Кросс-курс — это цена одной валюты, выраженная в другой, когда ни одна из них не является локальной или базовой валютой исходных котировок. На практике это почти всегда означает валютную пару без доллара США, выведенную из двух пар, в каждой из которых присутствует доллар.

Например, курс EUR/JPY формально является кросс-курсом. Хотя EUR/JPY — одна из самых активно торгуемых пар в мире и имеет собственный котируемый рынок, базовая логика остаётся прежней: возьмите EUR/USD, возьмите USD/JPY, перемножьте — и вы получите ту же цифру, которую вам бы озвучил банк в Токио. Рыночная котировка и расчётный кросс жёстко связаны арбитражем: если они расходятся, трейдеры включаются и доводят их обратно до соответствия.

Валюты без ликвидного прямого рынка — скажем, нигерийская найра против филиппинского песо (NGN/PHP) — существуют только в виде кросс-курсов. Сколько-нибудь значимого рынка NGN/PHP не существует. Любой, кто котирует эту пару, рассчитывает её из NGN/USD и USD/PHP.

Техническое определение делает разницу нагляднее:

  • Прямой курс — это курс, который активно котируется на рынке или в агрегированном фиде.
  • Кросс-курс рассчитывается из двух или более прямых курсов, имеющих общую базовую валюту (как правило, USD).

Большинство API-провайдеров, включая Finexly, отдают кросс-курсы прозрачно: вы запрашиваете любую пару, а движок выполняет арифметику внутри. Однако понимать, как устроена эта арифметика, важно — она влияет на то, как вы обрабатываете точность, спреды и крайние случаи.

Почему кросс-курсы важны для разработчиков

Кросс-курсы появляются в трёх категориях приложений:

Трансграничные платежи и переводы. Филиппинский фрилансер, выставляющий счёт бразильскому клиенту, хочет понимать, во сколько BRL обойдутся его тарифы в PHP. Прямого рынка BRL/PHP нет — платформа рассчитывает его через USD.

Мультивалютная электронная коммерция. Норвежскому продавцу, показывающему цены сингапурскому покупателю, нужен NOK/SGD. Stripe, Adyen и большинство платёжных провайдеров считают этот кросс внутри и поверх добавляют свою FX-маржу.

Финансовая аналитика и трейдинг. Количественные системы хеджируют риски по портфелям, номинированным во множестве валют. Чтобы понять чистую экспозицию в EUR, нужно перевести позиции в MXN, INR, ZAR и BRL в EUR — все это кросс-расчёты.

Во всех случаях качество вашего кросс-курса полностью зависит от качества и свежести двух базовых USD-пар. EUR/USD двухсекундной давности в сочетании с USD/JPY 60-секундной давности даст кросс, ошибочный ровно на величину движения JPY за это время. О том, откуда берутся курсы и как они обновляются, см. наш гид как работают валютные курсы.

Формула кросс-курса

Возможны три случая в зависимости от того, как котируются две исходные пары. Общий принцип прост: если записать курсы в виде дробей, общая валюта должна сократиться.

Случай 1: USD — котируемая валюта в обеих парах

Пусть имеется:

  • EUR/USD = 1,0850 (1 EUR покупает 1,0850 USD)
  • GBP/USD = 1,2620 (1 GBP покупает 1,2620 USD)

Нужен EUR/GBP. Формула:

EUR/GBP = (EUR/USD) / (GBP/USD)
EUR/GBP = 1.0850 / 1.2620 = 0.8598

Значит, 1 евро покупает 0,8598 фунта. В обеих исходных котировках USD стоит справа, поэтому делим.

Случай 2: USD — базовая валюта в обеих парах

Пусть имеется:

  • USD/JPY = 152,30
  • USD/CHF = 0,8920

Нужен JPY/CHF. Формула:

JPY/CHF = (USD/CHF) / (USD/JPY)
JPY/CHF = 0.8920 / 152.30 = 0.005857

Значит, 1 иена покупает 0,005857 швейцарского франка. В обеих исходных котировках USD стоит слева, поэтому делим, но с обратным соотношением.

Случай 3: USD в одной паре — база, в другой — котировка (смешанный)

Это самый частый случай и именно в нём чаще всего ошибаются. Пусть имеется:

  • EUR/USD = 1,0850 (USD — котировка)
  • USD/JPY = 152,30 (USD — база)

Нужен EUR/JPY. Формула:

EUR/JPY = (EUR/USD) × (USD/JPY)
EUR/JPY = 1.0850 × 152.30 = 165.25

Значит, 1 евро покупает 165,25 иены. Доллары сокращаются чисто: евро за доллар умножить на доллары за иену остаётся евро за иену. В смешанном случае умножаем.

Простое правило: запишите пары как дроби, выровняйте так, чтобы USD сократился, и далее умножайте или делите соответствующим образом. Та валюта, что осталась в числителе, и становится базой вашего кросс-курса.

Примеры, которые можно проверить

Проверяйте эти числа на любом крупном валютном фиде. Точные значения будут плавать с рынком; важна структура.

Пример 1: EUR/JPY (смешанный)

При EUR/USD = 1,0850 и USD/JPY = 152,30:

EUR/JPY = 1.0850 × 152.30 = 165.2455

Пример 2: GBP/CHF (смешанный)

При GBP/USD = 1,2620 и USD/CHF = 0,8920:

GBP/CHF = 1.2620 × 0.8920 = 1.1257

Пример 3: AUD/NZD (обе котируются против USD)

При AUD/USD = 0,6630 и NZD/USD = 0,6010:

AUD/NZD = 0.6630 / 0.6010 = 1.1031

Значит, 1 австралийский доллар покупает 1,1031 новозеландского доллара.

Пример 4: BRL/INR (обе с USD в качестве базы)

При USD/BRL = 5,0850 и USD/INR = 84,20:

BRL/INR = (USD/INR) / (USD/BRL) = 84.20 / 5.0850 = 16.561

Значит, 1 бразильский реал покупает 16,561 индийской рупии.

Чтобы освежить трёхбуквенные стандартизированные коды валют, см. наш гид по кодам ISO 4217.

Обратные курсы и инверсия пар

Иногда фид отдаёт USD/EUR, а вам нужен EUR/USD. Обратная величина:

EUR/USD = 1 / (USD/EUR)

Если USD/EUR = 0,9217, то EUR/USD = 1 / 0,9217 = 1,0850.

Два практических нюанса об обратных курсах:

Во-первых, округление накапливается. Если округлить курс до 4 знаков, затем взять обратный и снова округлить, можно внести ошибку 0,01% и более. Для приложений с высокой точностью держите обратное значение в полной плавающей точности до самого финального шага отображения. Стратегии работы с точностью подробно разобраны в нашем посте лучшие практики кэширования и обработки ошибок в валютных API.

Во-вторых, бид и аск меняются местами при инверсии. Если у GBP/USD бид 1,2618 и аск 1,2622, то у USD/GBP бид равен 1/1,2622 = 0,7923, а аск равен 1/1,2618 = 0,7925. Бид одной пары — это обратная величина аска другой пары, а не бида.

Бид-аск-спред у кросс-курсов

Когда вы строите кросс-курс из двух базовых пар, спреды складываются.

Пусть:

  • EUR/USD: бид 1,0848, аск 1,0852 (спред 4 пункта)
  • USD/JPY: бид 152,27, аск 152,33 (спред 6 пунктов)

Тогда у подразумеваемого кросса EUR/JPY:

Bid = 1.0848 × 152.27 = 165.183
Ask = 1.0852 × 152.33 = 165.309

Это 12,6 пункта спреда на кроссе — шире, чем у любой из исходных пар. На практике у напрямую котируемого рынка EUR/JPY спред меньше, чем у этого расчётного, потому что у ликвидных кросс-пар есть собственные маркетмейкеры.

Вывод для разработчиков: средне-рыночные кросс-курсы, рассчитанные из двух USD-пар, — это оценка настоящего прямого рынка. Достаточно для отображения цен на чекауте, нормально для аналитики, но не то, что банк или брокер реально вам исполнит. Различие между mid-market и дилерским курсом разобрано в нашем гиде по средне-рыночному курсу.

Как считать кросс-курсы через Finexly API

Обычно считать кросс-курсы вручную не нужно. API Finexly принимает любую базу и любой список целевых валют и отдаёт кросс с консистентной точностью. Вот как им пользоваться в четырёх популярных стеках.

cURL

curl "https://api.finexly.com/v1/latest?base=BRL&symbols=INR,PHP,NGN" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ответ:

{
  "base": "BRL",
  "date": "2026-05-09",
  "rates": {
    "INR": 16.561,
    "PHP": 11.272,
    "NGN": 312.45
  }
}

JavaScript (Node 20+, Fetch)

async function getCrossRates(base, targets) {
  const url = `https://api.finexly.com/v1/latest?base=${base}&symbols=${targets.join(",")}`;
  const res = await fetch(url, {
    headers: { Authorization: `Bearer ${process.env.FINEXLY_API_KEY}` }
  });
  if (!res.ok) throw new Error(`Finexly API error: ${res.status}`);
  return res.json();
}

const data = await getCrossRates("BRL", ["INR", "PHP", "NGN"]);
console.log(`1 BRL = ${data.rates.INR} INR`);

Python

import os
import requests

def get_cross_rates(base, targets):
    url = "https://api.finexly.com/v1/latest"
    params = {"base": base, "symbols": ",".join(targets)}
    headers = {"Authorization": f"Bearer {os.environ['FINEXLY_API_KEY']}"}
    response = requests.get(url, params=params, headers=headers, timeout=10)
    response.raise_for_status()
    return response.json()

data = get_cross_rates("BRL", ["INR", "PHP", "NGN"])
print(f"1 BRL = {data['rates']['INR']} INR")

PHP

<?php
function getCrossRates(string $base, array $targets): array {
    $symbols = implode(',', $targets);
    $url = "https://api.finexly.com/v1/latest?base={$base}&symbols={$symbols}";
    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . getenv('FINEXLY_API_KEY')],
        CURLOPT_TIMEOUT => 10,
    ]);
    $body = curl_exec($ch);
    if (curl_errno($ch)) throw new RuntimeException(curl_error($ch));
    curl_close($ch);
    return json_decode($body, true);
}

$data = getCrossRates('BRL', ['INR', 'PHP', 'NGN']);
echo "1 BRL = {$data['rates']['INR']} INR\n";

Во всех четырёх примерах API сам делает арифметику кросс-курса и возвращает точные mid-market-значения. Можно поменять базу на любую из 170+ поддерживаемых валют и запросить любое число целевых валют одним вызовом. Дополнительные паттерны под конкретные стеки — в нашем руководстве по Currency API на Python, гиде по интеграции с Node.js и гиде по PHP.

Когда кросс-курс стоит считать самому

Даже при наличии хорошего API существуют три сценария, когда вы считаете кросс-курсы по своим данным, а не получаете их от API:

Бэктест исторических стратегий. Если у вас на собственных серверах хранятся годами тиковые данные EUR/USD и USD/JPY, локальный расчёт EUR/JPY избавляет от миллионов запросов к внешнему API. Засевайте данные через исторические эндпоинты курсов, а кроссы вычисляйте уже в движке бэктеста.

Низколатентные приложения. Алгоритмические торговые системы часто заранее считают кроссы из базовых USD-пар в памяти, потому что экономия одного сетевого ROUND-TRIPа имеет значение. Расплата — вы берёте на себя ответственность за синхронизацию и свежесть.

Кастомные смешанные курсы. Некоторые платформы котируют внутренние курсы, смешивая несколько источников или добавляя наценку. Считая кросс самостоятельно, вы можете применить свою бизнес-логику до того, как покажете курс клиенту.

Если ваш кейс ни один из перечисленных — страница чекаута, инструмент выставления счетов, внутренний дашборд — пусть API сам отдаёт кросс. Это будет точнее, проще в поддержке и быстрее в реализации.

Частые ошибки при расчёте кросс-курсов

Это ошибки, которые мы чаще всего видим при ревью кода у разработчиков.

Инверсия не той пары. Когда исходные пары котируются в противоположных направлениях (одна с USD-базой, другая с USD-котировкой), легко умножить там, где нужно было инвертировать и поделить. Всегда выписывайте курсы в виде дробей и проверяйте, что общая валюта реально сокращается.

Слишком раннее округление. Классический баг: округлили исходный курс до четырёх знаков, потом перемножили. Сложение округлений даёт ошибку 0,01–0,1%. В финансовых вычислениях держите полную точность и округляйте только при отображении.

Использование устаревших курсов. Если ваши исходные курсы получены с разницей 30 секунд, кросс из них внутренне противоречив. Запрашивайте обе котировки одним вызовом API (это и делает ?symbols=A,B,C в Finexly API), чтобы у них была одна метка времени.

Смешение будних и выходных данных. Форекс закрыт в выходные. Если ваша cron-задача забрала EUR/USD в пятницу в 17:01 EST, а USD/JPY — в пятницу в 16:59 EST, можно ненароком смешать живые и устаревшие данные. Стандартизируйте все запросы курсов под один рыночный таймстамп. Подробнее — в нашем гиде по часам работы рынка форекс.

Игнорирование спреда для транзакционного использования. Кросс-курсы из mid-market-источников хороши для отображения, но если идут реальные деньги, нужен бид или аск в зависимости от направления сделки. Моделируйте спред в коде явно, не полагайтесь на mid.

Часто задаваемые вопросы

Что такое кросс-курс простыми словами?

Это валютный курс между двумя валютами, рассчитанный через курс каждой из них к третьей общей валюте, обычно к доллару США. Например, курс EUR/JPY выводится из EUR/USD и USD/JPY.

Считаются ли EUR/JPY и GBP/JPY кросс-курсами?

Формально да. Они не включают доллар США и по строгому определению являются кроссами. Однако обе пары торгуются настолько активно в прямом виде, что у них есть собственные котируемые рынки и они ведут себя как основные пары на практике.

Почему кросс-курсы важны?

Кросс-курсы дают возможность котировать и торговать валюты, между которыми нет ликвидного прямого рынка, — а это большинство пар в мире. Они необходимы для трансграничных платежей, мультивалютной коммерции и глобальной финансовой аналитики.

Можно ли считать кросс-курс без USD в качестве промежуточной валюты?

Да. В роли моста подходит любая общая валюта. EUR иногда используется в европоцентричных расчётах, JPY — на некоторых азиатских рынках. USD выбирают по умолчанию потому, что против него котируется больше пар — и качество данных выше.

Насколько точны рассчитанные кросс-курсы по сравнению с прямой рыночной котировкой?

Для ликвидных кроссов вроде EUR/JPY или GBP/CHF расчётные и прямые курсы практически совпадают благодаря арбитражу. Для неликвидных кроссов, таких как NGN/PHP, расчётный курс — единственная доступная точка отсчёта, отдельного прямого рынка для сравнения попросту нет.

Считает ли Finexly кросс-курсы автоматически?

Да. Вы запрашиваете любую базу и любой список целевых валют — API возвращает консистентные mid-market кросс-курсы. Самостоятельно ничего считать или инвертировать не нужно.

Начните работу с Finexly

Готовы использовать кросс-курсы в реальном времени в своём приложении? Получите бесплатный API-ключ Finexly — кредитная карта не требуется. На бесплатном тарифе доступны 1000 запросов в месяц, а по мере роста трафика можно перейти на наши платные тарифы. API поддерживает более 170 валют и бесшовно считает кросс-курсы для любой пары, чтобы вы могли заниматься продуктом, а не FX-арифметикой.

Vlado Grigirov

Senior Currency Markets Analyst & Financial Strategist

Vlado Grigirov is a senior currency markets analyst and financial strategist with over 14 years of experience in foreign exchange markets, cross-border finance, and currency risk management. He has wo...

View full profile →