Pre-calculating rate
Algorithm
Quickex utiliza um sistema de taxa dinâmica para gerar previsões de taxa de câmbio, usando a análise da profundidade de mercado dos provedores de liquidez. Enquanto o fluxo padrão analisa a profundidade de mercado e retorna um resultado calculado de forma realista, o parâmetro markup pode influenciar a taxa retornada pelo algoritmo de previsão de taxa.
O parâmetro markup irá influenciar o pré-cálculo da taxa retornado pelo nosso sistema da seguinte forma:
| Parameter | Description |
|---|---|
| A_final | Montante final a receber (previsto) |
| A_calculated | Montante antes da aplicação do markup |
| K_markup | Percentual de markup |
Com base na fórmula fornecida, um valor de markup de 0.3, aplicado a uma troca de 1 BTC → USDT, produzirá os seguintes resultados, fazendo com que o preço previsto final aumente em 0,3%:
API
Os dados de taxas podem ser obtidos por meio de uma chamada de API v1 para o endpoint /api/v1/rates/public/one. A API v1 não requer autorização por chave de API nem whitelisting de IP.
| Parameter | Description | Example |
|---|---|---|
| instrumentFromCurrencyTitle | Moeda de origem | BTC |
| instrumentFromNetworkTitle | Rede da moeda de origem | BTC |
| instrumentToCurrencyTitle | Moeda de destino | USDT |
| instrumentToNetworkTitle | Rede da moeda de destino | TRC20 |
| rateMode | FLOATING / FIXED | FLOATING |
| claimedDepositAmount | Valor do depósito | 1 |
| markup | Percentual de 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': { '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 no fluxo de ordens
Algorithm
O parâmetro markup também deve ser enviado durante a criação do pedido para garantir uma comissão de ordem válida. Com o parâmetro markup informado, a Quickex aplicará a seguinte fórmula ao algoritmo de cálculo da comissão da ordem:
| Awithdrawal | Quantidade de moeda enviada ao cliente como resultado da troca |
| Aexchange | Quantidade de moeda que a Quickex tinha disponível após executar nossa estratégia de negociação |
| Cplatform (%) | Percentual de comissão definido pela Quickex |
| Kmarkup | Valor do parâmetro markup |
Com base na fórmula fornecida, um valor de markup de 0.3 informado durante a criação do pedido aumentará em 0.3 o percentual de comissão da Quickex. No exemplo a seguir, a comissão da Quickex está definida em 1 por cento:
Usando o exemplo anterior, uma troca de 1 BTC para USDT com base no preço de mercado de 50243.798064469251204 BTC: USDT resultará no seguinte montante de saque do cliente:
Com base na fórmula fornecida, um valor de markup de 0.3 informado durante a criação do pedido aumentará em 0.3 o percentual de comissão da Quickex.
Depois que uma troca com um parâmetro markup entra no estado COMPLETED, o parâmetro markup será usado na fórmula de cálculo da margem do parceiro:
| Caffiliate | Quantidade de moeda enviada para a carteira do afiliado por troca (margem do afiliado) |
| Cplatform | Quantidade de moeda que a Quickex obteve com a troca (margem da plataforma) |
| Caffiliate (%) | Percentual de comissão definido para o afiliado |
| Kmarkup | Valor do parâmetro markup |
Passing the markup parameter
Durante a criação do pedido, a API da Quickex aceita o parâmetro markup juntamente com outros parâmetros de criação de pedidos:
‘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’ // <— here
}
O valor multiplicador de markup é enviado juntamente com os demais parâmetros.
Using API v2
O uso dos endpoints da API v2 exige uma configuração adicional de autorização. Sem os parâmetros de autorização necessários, os endpoints v2 retornarão erros 403 Forbidden.
A integração é composta de duas etapas – criar uma chave de API e integrar seu uso nas requisições à API. Ao criar uma chave de API, nossos clientes B2B receberão um par de chaves para assinar suas requisições, juntamente com uma lista de endereços IP em whitelist que podem acessar os endpoints da API.
é necessário ter um cookie de autorização ativo para executar
/api/v1/users/*
requisições.
Creating an API key
Ao criar a chave de API, é necessário enviar um array de IPs em whitelist:
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' }
A resposta conterá o par de chaves que é necessário para uso durante a autorização da API v2 .
O campo
secretKey
será exibido apenas uma vez, durante a criação da chave de API. Recomendamos salvá-lo imediatamente após criar a chave de API.
Listing your API keys
Se a sua integração precisar utilizar mais de uma chave de API, você pode listá-las facilmente por meio do endpoint 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' } ]
Managing your API keys
O gerenciamento de chaves de API existentes pode ser feito por meio da nossa linha de suporte ao cliente B2B. Isso inclui:
- Exclusão de chaves de API
- Adição de novos IPs em whitelist a uma chave de API existente
- Atualização e adição de configurações para uma chave de API (por exemplo: valores mínimo/máximo para o valor de markup)
- Desativação de chaves de API
Using the API key
A API v2 exige que 3 cabeçalhos sejam definidos em cada requisição:
| Header | Value |
|---|---|
| x-api-public-key | Sua chave pública obtida durante a criação da chave de API |
| x-api-timestamp | Timestamp UNIX |
| x-api-signature | Uma assinatura da requisição |
O valor da assinatura é gerado usando hmac sha256. Os dados enviados são a concatenação em forma de string do timestamp, da representação em string do corpo da requisição e da chave pública, enquanto a chave privada é usada como chave para a função 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’ })
Sample integration code
SDK no PyPi
const { createHmac } = require(‘crypto’);
const API_PREFIX = ‘https://quickex.io/api/’;
const PUBKEY = ‘public_key’; // changeme
const PRIVKEY = ‘private_key’; // changeme
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’;
// Step 1. Prepare createOrder request body using obtained rate data
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,
};
// Step 2. Prepare signature based on key pair and createOrder request data
const timestamp = new Date().getTime();
const signature = signRequest(createOrderRequestBody, timestamp);
// Step 3. Call API v2 create-order endpoint
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();