Precálculo del tipo de cambio
Algoritmo
Quickex utiliza un sistema de tipos dinámicos para generar predicciones de tipos de cambio, utilizando el análisis de la profundidad de mercado de los proveedores de liquidez. Mientras que el flujo por defecto analizará la profundidad del mercado y devolverá un resultado calculado de forma realista, el parámetro markup puede influir en el tipo devuelto por el algoritmo de predicción de tipos.
El parámetro markup influirá en el precálculo del tipo devuelto por nuestro sistema de la siguiente manera:
| Parámetro | Descripción |
|---|---|
| A_final | Importe final a recibir (previsto) |
| A_calculated | Importe antes de aplicar markup |
| K_markup | Porcentaje de recargo |
Basándose en la fórmula indicada, un valor de markup de 0.3, establecido para un intercambio de 1 BTC → USDT, dará el siguiente resultado, aumentando el precio final previsto en un 0,3%:
API
Los datos de tipos pueden obtenerse mediante una llamada a la API v1 al endpoint /api/v1/rates/public/one. La API v1 no requiere autorización mediante clave de API ni lista blanca de IP.
| Parámetro | Descripción | Ejemplo |
|---|---|---|
| instrumentFromCurrencyTitle | Moneda de origen | BTC |
| instrumentFromNetworkTitle | Red de la moneda de origen | BTC |
| instrumentToCurrencyTitle | Moneda de destino | USDT |
| instrumentToNetworkTitle | Red de la moneda de destino | TRC20 |
| rateMode | FLOATING / FIXED | FLOATING |
| claimedDepositAmount | Importe del depósito | 1 |
| markup | Porcentaje de recargo | 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": { "minAmount": "51.324600057525118367", "maxAmount": "0", "withdrawalFeeRules": { "maxAmount": "1", "minAmount": "1" } }, "minConfirmationsToWithdraw": 2, "minConfirmationsToTrade": 2, "updatedAt": "2024-08-05T13:31:44.315Z", "liquidityProviderPublicCode": "radio", "amountToGet": "50201.90689595", "amountToGive": "1", "marketMinAmount": "0.1", "enableFixedRate": true, "amountToGiveCurrencyTitle": "BTC", "rateMode": "FLOATING", "finalNetworkFeeAmount": "0", "platformFee_Absolute": null, "liquidityProviderQuotes": { "sellQuote": { "baseValue": "1", "quoteValue": "50304.27" }, "buyQuote": { "baseValue": "50294.99", "quoteValue": "1" } }, "price": "50201.90689595", "marketLeftPrice": "50304.27", "marketRightPrice": "0.000019882696069727819809", "marketAmountToGet": "50243.798064469251204", "marketAmountToGetUSDT": "50243.798064469251204", "quotesWithoutNetworkFee": { "sellQuote": { "baseValue": "1", "quoteValue": "50202.90689595" }, "buyQuote": { "baseValue": "50294.99", "quoteValue": "0.997985" } }, "quotes": { "sellQuote": { "baseValue": "1", "quoteValue": "50201.90689595" }, "buyQuote": { "baseValue": "50294.99", "quoteValue": "0.99796512097183797717" } }, "markup": "0.3" }
Parámetro markup en el flujo de órdenes
Algoritmo
El parámetro markup también debe enviarse durante la creación de la orden para garantizar una comisión de orden válida. Cuando se envía el parámetro markup, Quickex aplicará la siguiente fórmula al algoritmo de cálculo de la comisión:
| Awithdrawal | Cantidad de moneda enviada al cliente como resultado del intercambio |
| Aexchange | Cantidad de moneda que Quickex tenía disponible después de ejecutar nuestra estrategia de trading |
| Cplatform (%) | Porcentaje de comisión definido por Quickex |
| Kmarkup | Markup valor del parámetro |
Basándose en la fórmula indicada, un valor de markup de 0.3, proporcionado durante la creación de la orden, aumentará el porcentaje de comisión de Quickex en 0.3. En el siguiente ejemplo, la comisión de Quickex se establece en 1 por ciento:
Usando el ejemplo anterior, un intercambio de 1 BTC a USDT basado en el precio de mercado de 50243.798064469251204 BTC: USDT dará como resultado la siguiente cantidad de retirada por el cliente:
Basándose en la fórmula indicada, un valor de markup de 0.3, proporcionado durante la creación de la orden, aumentará el porcentaje de comisión de Quickex en 0.3.
Después de que un intercambio con el parámetro markup entre en el estado COMPLETED, el parámetro markup se utilizará en la fórmula de cálculo del margen del afiliado:
| Caffiliate | Cantidad de moneda enviada al monedero del afiliado por intercambio (margen del afiliado) |
| Cplatform | Cantidad de moneda que Quickex obtuvo del intercambio (margen de la plataforma) |
| Caffiliate (%) | Porcentaje de comisión definido para el afiliado |
| Kmarkup | Markup valor del parámetro |
Envío del parámetro markup
Durante la creación de la orden, la API de Quickex acepta el parámetro markup junto con otros parámetros de creación de la orden:
“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” // <— aquí
}
El valor del multiplicador markup se envía junto con los demás parámetros.
Uso de la API v2
El uso de los endpoints de la API v2 requiere una configuración adicional de autorización. Sin los parámetros de autorización necesarios, los endpoints de v2 devolverán errores 403 Forbidden.
La integración se compone de dos pasos: crear una clave de API e integrar su uso en las solicitudes a la API. Al crear una clave de API, nuestros clientes b2b reciben un par de claves para firmar sus solicitudes, junto con una lista de direcciones IP en lista blanca que pueden acceder a los endpoints de la API.
debe tener una cookie de autorización activa para realizar solicitudes a
/api/v1/users/*
.
Creación de una clave de API
Al crear la clave de API, se debe enviar un array de IPs en lista blanca:
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’
}
La respuesta contendrá el par de claves que es necesario utilizar durante la autorización de la API v2 .
El campo
secretKey
se mostrará solo una vez, durante la creación de la clave de API. Recomendamos guardarlo inmediatamente después de crear la clave de API.
Listado de tus claves de API
Si tu integración requiere utilizar más de una clave de API, puedes listarlas fácilmente a través del endpoint list:
function signRequest(requestBody) {
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’ })
Gestión de tus claves de API
La gestión de las claves de API existentes se realiza a través de nuestra línea de soporte para clientes b2b. Esto incluye:
- Eliminación de claves de API
- Adición de nuevas IPs en lista blanca a una clave de API existente
- Actualización y adición de ajustes para una clave de API (por ejemplo: valores mínimo/máximo para el valor de markup)
- Desactivación de claves de API
Uso de la clave de API
La API v2 requiere establecer 3 cabeceras en cada solicitud:
| Cabecera | Valor |
|---|---|
| x-api-public-key | Tu clave pública obtenida durante la creación de la clave de API |
| x-api-timestamp | Marca de tiempo UNIX |
| x-api-signature | Una firma de la solicitud |
El valor de la firma se genera utilizando hmac sha256. Los datos que se pasan son la concatenación en una cadena de la marca de tiempo, la representación en cadena del cuerpo de la solicitud y la clave pública, mientras que la clave privada se utiliza como clave para la función hmac :
function signRequest(requestBody) {
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” })
Ejemplo de código de integración
SDK en PyPi
const { createHmac } = require(‘crypto’);
const API_PREFIX = ‘https://quickex.io/api/’;
const PUBKEY = ‘public_key’; // cambiar aquí
const PRIVKEY = ‘private_key’; // cambiar aquí
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’;
// Paso 1. Prepara el cuerpo de la solicitud createOrder usando los datos de tipo obtenidos
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,
};
// Paso 2. Prepara la firma basada en el par de claves y en los datos de la solicitud createOrder
const timestamp = new Date().getTime();
const signature = signRequest(createOrderRequestBody, timestamp);
// Paso 3. Llama al endpoint create-order de la API v2
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();