Предварительный расчёт курса
Алгоритм
Quickex использует динамическую систему курсов для формирования прогноза обменного курса на основе анализа глубины рынка поставщиков ликвидности. При этом стандартный процесс анализирует глубину рынка и возвращает реалистично рассчитанный результат, однако параметр markup может повлиять на курс, возвращаемый алгоритмом прогнозирования.
Параметр markup будет влиять на предварительный расчёт курса, возвращаемый нашей системой, следующим образом:
| Параметр | Описание |
|---|---|
| A_final | Итоговая сумма к получению (прогноз) |
| A_calculated | Сумма до применения Markup |
| K_markup | Процент наценки |
Исходя из приведённой формулы, значение markup 0.3 для обмена 1 BTC → USDT даст следующий результат, увеличивая итоговую прогнозную цену на 0,3%:
API
Данные по курсам можно получить через вызов API v1 к эндпоинту /api/v1/rates/public/one. Для API v1 не требуется авторизация по API-ключу или добавление IP-адреса в белый список.
| Параметр | Описание | Пример |
|---|---|---|
instrumentFromCurrencyTitle |
Исходная валюта | BTC |
instrumentFromNetworkTitle |
Сеть исходной валюты | BTC |
instrumentToCurrencyTitle |
Целевая валюта | USDT |
instrumentToNetworkTitle |
Сеть целевой валюты | TRC20 |
rateMode |
FLOATING / FIXED | FLOATING |
claimedDepositAmount |
Сумма депозита | 1 |
markup |
Процент наценки | 0.3 |
GET /api/v1/rates/public/one ?instrumentFromCurrencyTitle=BTC &instrumentFromNetworkTitle=BTC &instrumentToCurrencyTitle=USDT &instrumentToNetworkTitle=TRC20 &rateMode=FLOATING &claimedDepositAmount=1 &markup=0.3
{
“instrumentFrom“: {
“currencyTitle“: “BTC”,
“networkTitle“: “BTC”,
“precisionDecimals“: 11
},
“instrumentTo“: {
“currencyTitle“: “USDT”,
“networkTitle“: “TRC20”,
“precisionDecimals“: 1
},
“depositRules“: {
“minAmount“: “0.0010202831699481001984”,
“maxAmount“: “0”
},
“withdrawalRules“: {
”
Параметр markup в процессе обработки ордера
Алгоритм
Параметр markup также должен передаваться при создании ордера, чтобы корректно рассчитать комиссию по ордеру. При передаче параметра markup Quickex применяет к алгоритму расчёта комиссии следующую формулу:
| Awithdrawal | Сумма валюты, отправляемая клиенту по результатам обмена |
| Aexchange | Сумма валюты, которой располагает Quickex после выполнения нашей торговой стратегии |
| Cplatform (%) | Процент комиссии, определённый Quickex |
| Kmarkup | markup значение параметра |
На основе приведённой формулы значение markup 0.3, переданное при создании ордера, увеличит процент комиссии Quickex на 0,3. В следующем примере комиссия Quickex установлена на уровне 1 процента:
Используя предыдущий пример, обмен 1 BTC на USDT по рыночной цене 50243.798064469251204 BTC:USDT даст следующую сумму вывода для клиента:
На основе приведённой формулы значение markup 0.3, переданное при создании ордера, увеличит процент комиссии Quickex на 0,3.
После того как обмен с параметром markup переходит в состояние COMPLETED, параметр markup используется в формуле расчёта партнёрской маржи:
| Caffiliate | Сумма валюты, отправляемая на кошелёк партнёра за один обмен (партнёрская маржа) |
| Cplatform | Сумма валюты, которую Quickex получил от обмена (маржа платформы) |
| Caffiliate (%) | Процент комиссии, установленный для партнёра |
| Kmarkup | markup значение параметра |
Передача параметра markup
При создании ордера API Quickex принимает параметр markup вместе с другими параметрами ордера:
“rateMode”: “FLOATING”,
“instrumentFrom”: {
“currencyTitle”: “USDT”,
“networkTitle”: “TRC20”
},
“instrumentTo”: {
“currencyTitle”: “BTC”,
“networkTitle”: “BTC”
},
“destinationAddress”: “bc1qxy2kgdygjrsqtzq2n0yrf2493p83kkfjhx0wlh”,
“destinationAddressMemo”: null,
“refundAddress”: null,
“refundAddressMemo”: null,
“claimedNetworkFee”: null,
“legacyOrderId”: null,
“referrerId”: “aff_616”,
“claimedDepositAmount”: “125000”,
“utmData”: [],
“browserFingerprint”: “6b3add86bec11616427d069556a33548”,
“markup”: “0.2” // <— здесь
}
Значение множителя markup передаётся вместе с другими параметрами.
Использование API v2
Использование эндпоинтов API v2 требует дополнительной настройки авторизации. Без необходимых параметров авторизации эндпоинты v2 будут возвращать ошибку 403 Forbidden.
Интеграция состоит из двух шагов: создание API-ключа и использование этого ключа в API-запросах. После создания API-ключа наши b2b-клиенты получают пару ключей для подписания своих запросов, а также список IP-адресов в белом списке, которые могут обращаться к API-эндпоинтам.
Создание API-ключа
При создании API-ключа необходимо передать массив IP-адресов, добавленных в белый список:
POST /api/v1/users/generate-api-key Request: { "name": "test", "whiteListIp": ["127.0.0.1"], "isActive": true } Response: { "apiId": 40, "name": "test", "isActive": true, "publicKey": "ZgzycV6Sf78BZKuyIAiz+0Bor002+0/rx1gLKsmYCsY=", "secretKey": "a482a8e3a3ff9aeadefb11d3d8c11253e7e8412e05ef2b8599016cc87a64b7d6", "whiteListIp": [ "127.0.0.1" ], "createdAt": "2024-08-05T13:54:18.427Z" }
Ответ будет содержать пару ключей, необходимых для авторизации при работе с API v2 .
Просмотр ваших API-ключей
Если для вашей интеграции требуется использовать более одного API-ключа, вы можете получить их список через эндпоинт list:
GET /api/v1/users/list-api-key
[
{
“apiId”: 40,
“name”: “test”,
“isActive”: true,
“settings”: {},
“publicKey”: “ZgzycV6Sf78BZKuyIAiz+0Bor002+0/rx1gLKsmYCsY=”,
“whiteListIp”: [
“127.0.0.1”
],
“createdAt”: “2024-08-05T13:54:18.427Z”
}
]
Управление вашими API-ключами
Управление существующими API-ключами выполняется через нашу линию поддержки b2b-клиентов. Это включает:
- Удаление API-ключей
- Добавление новых IP-адресов в белый список для существующего API-ключа
- Обновление и добавление настроек для API-ключа (например, минимальные/максимальные значения параметра markup)
- Деактивацию API-ключей
Использование API-ключа
Для работы с API v2 в каждом запросе необходимо указывать 3 заголовка:
| Заголовок | Значение |
|---|---|
| x-api-public-key | Ваш открытый ключ, полученный при создании API-ключа |
| x-api-timestamp | UNIX-временная метка |
| x-api-signature | Подпись запроса |
Значение подписи генерируется с использованием hmac sha256. Передаваемые данные представляют собой конкатенацию в строку метки времени, строкового представления тела запроса и публичного ключа, тогда как приватный ключ используется в качестве ключа для функции hmac :
const timestamp = new Date().getTime();
const publicKey = “ZgzycV6Sf78BZKuyIAiz+0Bor002+0/rx1gLKsmYCsY=”;
const privateKey = “a482a8e3a3ff9aeadefb11d3d8c11253e7e8412e05ef2b8599016cc87a64b7d6”;
const encoder = new TextEncoder();
const data = encoder.encode(
timestamp + JSON.stringify(requestBody) + publicKey,
);
const hmac = createHmac(‘sha256’, privateKey);
const dataSign = hmac.update(data);
const signature = dataSign.digest(‘base64’);
return signature;
}
signRequest({ myKey: “myValue” })
Пример кода интеграции
SDK на PyPi
const API_PREFIX = ‘https://quickex.io/api/’;
const PUBKEY = ‘public_key’; // измените значение
const PRIVKEY = ‘private_key’; // измените значение
function signRequest(requestBody, timestamp) {
const encoder = new TextEncoder();
const data = encoder.encode(timestamp + JSON.stringify(requestBody) + PUBKEY);
const hmac = createHmac(‘sha256’, PRIVKEY);
const dataSign = hmac.update(data);
const signature = dataSign.digest(‘base64’);
return signature;
}
async function createOrder() {
const clientBrowserFingerprint = ‘6b3add86bec11616427d069556a33548’;
const orderRateMode = ‘FLOATING’;
const depositAmount = ‘1’;
const clientDestinationAddress = ‘TUhw6S1HyXDhycKvTec3x7HNGQfNn3Vhpc’;
const clientDestinationAddressMemo = null;
const markup = ‘0.3’;
const instrumentFromCurrencyTitle = ‘BTC’;
const instrumentFromNetworkTitle = ‘BTC’;
const instrumentToCurrencyTitle = ‘USDT’;
const instrumentToNetworkTitle = ‘TRC20’;
// Шаг 1. Подготовьте тело запроса createOrder, используя полученные данные по курсу
const createOrderRequestBody = {
rateMode: orderRateMode,
instrumentFrom: {
currencyTitle: instrumentFromCurrencyTitle,
networkTitle: instrumentFromNetworkTitle,
},
instrumentTo: {
currencyTitle: instrumentToCurrencyTitle,
networkTitle: instrumentToNetworkTitle,
},
destinationAddress: clientDestinationAddress,
destinationAddressMemo: clientDestinationAddressMemo,
refundAddress: null,
refundAddressMemo: null,
markup: markup,
claimedNetworkFee: null,
legacyOrderId: null,
referrerId: null,
claimedDepositAmount: depositAmount,
utmData: [],
browserFingerprint: clientBrowserFingerprint,
};
// Шаг 2. Подготовьте подпись на основе пары ключей и данных запроса createOrder
const timestamp = new Date().getTime();
const signature = signRequest(createOrderRequestBody, timestamp);
// Шаг 3. Вызовите эндпоинт API v2 create-order
const order = JSON.parse(
await (
await fetch(${API_PREFIX}v2/orders/public/create, {
method: ‘POST’,
headers: {
‘x-api-public-key’: PUBKEY,
‘x-api-timestamp’: timestamp,
‘x-api-signature’: signature,
‘content-type’: ‘application/json; charset=utf-8’,
},
body: JSON.stringify(createOrderRequestBody),
})
).text(),
);
console.log(‘order’, order);
}
void createOrder();