<h1>Pré-calcul du taux de change</h1>
<h2>Algorithme</h2>
Quickex utilise un système de taux dynamique pour générer des prévisions de taux de change, en s’appuyant sur l’analyse de la profondeur de marché des fournisseurs de liquidité. Alors que le flux par défaut analyse la profondeur du marché et renvoie un résultat calculé de manière réaliste, le paramètre <code>markup</code> peut influencer le taux renvoyé par l’algorithme de prédiction du taux.
Le paramètre <code>markup</code> influencera le pré-calcul du taux renvoyé par notre système de la manière suivante :
<div style=”font-family: ui-monospace,SFMono-Regular,Menlo,Consolas,;”>A_final = A_calculated × (1 − (K_markup / 100))</div>
<div style=”margin-top: 10px;”>
<div style=”margin-top: 10px;”>
<div style=”margin: 16px 0; font-family: system-ui, -apple-system, BlinkMacSystemFont,;”>
<table style=”width: 100%; border-collapse: collapse; background: #111111; color: #f5f5f5;”>
<thead>
<tr>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>Paramètre</th>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>A_final</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>Montant final à recevoir (prévisionnel)</td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>A_calculated</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>Montant avant application du markup</td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>K_markup</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>Pourcentage de markup</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
D’après la formule fournie, une valeur de <code>markup</code> de 0,3, appliquée à un échange de 1 BTC → USDT, donnera les résultats suivants et augmentera le prix prévisionnel final de 0,3 % :
<div style=”font-family: ui-monospace,SFMono-Regular,Menlo,Consolas,;”>Exemple : 49549.728053855135 * (1 – \dfrac{0.3}{100}) = 49401.07886969357</div>
<h2>API</h2>
Les données de taux peuvent être obtenues via un appel à l’API <code>v1</code> vers le point de terminaison <code>/api/v1/rates/public/one</code>. L’API <code>v1</code> ne nécessite ni autorisation par clé API ni liste blanche d’adresses IP.
<div style=”margin: 16px 0; font-family: system-ui, -apple-system, BlinkMacSystemFont,;”>
<table style=”width: 100%; border-collapse: collapse; background: #111111; color: #f5f5f5;”>
<thead>
<tr>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>Paramètre</th>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>Description</th>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>Exemple</th>
</tr>
</thead>
<tbody>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>instrumentFromCurrencyTitle</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>Devise source</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>BTC</span></td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>instrumentFromNetworkTitle</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>Réseau de la devise source</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>BTC</span></td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>instrumentToCurrencyTitle</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>Devise cible</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>USDT</span></td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>instrumentToNetworkTitle</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>Réseau de la devise cible</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>TRC20</span></td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>rateMode</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>FLOATING / FIXED</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>FLOATING</span></td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>claimedDepositAmount</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>Montant du dépôt</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>1</span></td>
</tr>
<tr>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”display: inline-block; padding: 2px 8px; border-radius: 4px; background: #333333; color: #f97373; font-family: monospace; font-size: 0.9em;”>markup</span></td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”>Pourcentage de markup</td>
<td style=”border: 1px solid #3a3a3a; padding: 10px 12px;”><span style=”font-family: monospace;”>0.3</span></td>
</tr>
</tbody>
</table>
</div>
<div style=”background: #0d0d0d; border: 1px solid rgba(127,127,127,.3); border-radius: 14px; padding: 16px 18px; box-shadow: 0 1px 1px rgba(0,0,0,.2); margin-bottom: 16px; font-family: monospace; color: #dcdcdc;”>
<pre style=”margin: 0; line-height: 1.25; white-space: pre;”><span style=”color: #9cdcfe;”>GET</span> <span style=”color: #d1006c;”>/api/v1/rates/public/one
?instrumentFromCurrencyTitle=BTC
&instrumentFromNetworkTitle=BTC
&instrumentToCurrencyTitle=USDT
&instrumentToNetworkTitle=TRC20
&rateMode=FLOATING
&claimedDepositAmount=1
&markup=0.3</span>
{
‘<span style=”color: #9cdcfe;”>instrumentFrom</span>’: {
‘<span style=”color: #9cdcfe;”>currencyTitle</span>’: ‘BTC’,
‘<span style=”color: #9cdcfe;”>networkTitle</span>’: ‘BTC’,
‘<span style=”color: #9cdcfe;”>precisionDecimals</span>’: 11
},
‘<span style=”color: #9cdcfe;”>instrumentTo</span>’: {
‘<span style=”color: #9cdcfe;”>currencyTitle</span>’: ‘USDT’,
‘<span style=”color: #9cdcfe;”>networkTitle</span>’: ‘TRC20’,
‘<span style=”color: #9cdcfe;”>precisionDecimals</span>’: 1
},
‘<span style=”color: #9cdcfe;”>depositRules</span>’: {
‘<span style=”color: #9cdcfe;”>minAmount</span>’: ‘0.0010202831699481001984’,
‘<span style=”color: #9cdcfe;”>maxAmount</span>’: ‘0’
},
‘<span style=”color: #9cdcfe;”>withdrawalRules</span>’: {
‘<span style=”color: #9cdcfe;”>minAmount</span>’: ‘51.324600057525118367’,
‘<span style=”color: #9cdcfe;”>maxAmount</span>’: ‘0’,
‘<span style=”color: #9cdcfe;”>withdrawalFeeRules</span>’: {
‘<span style=”color: #9cdcfe;”>maxAmount</span>’: ‘1’,
‘<span style=”color: #9cdcfe;”>minAmount</span>’: ‘1’
}
},
‘<span style=”color: #9cdcfe;”>minConfirmationsToWithdraw</span>’: 2,
‘<span style=”color: #9cdcfe;”>minConfirmationsToTrade</span>’: 2,
‘<span style=”color: #9cdcfe;”>updatedAt</span>’: ‘2024-08-05T13:31:44.315Z’,
‘<span style=”color: #9cdcfe;”>liquidityProviderPublicCode</span>’: ‘radio’,
‘<span style=”color: #9cdcfe;”>amountToGet</span>’: ‘50201.90689595’,
‘<span style=”color: #9cdcfe;”>amountToGive</span>’: ‘1’,
‘<span style=”color: #9cdcfe;”>marketMinAmount</span>’: ‘0.1’,
‘<span style=”color: #9cdcfe;”>enableFixedRate</span>’: <span style=”color: #569cd6;”>true</span>,
‘<span style=”color: #9cdcfe;”>amountToGiveCurrencyTitle</span>’: ‘BTC’,
‘<span style=”color: #9cdcfe;”>rateMode</span>’: ‘FLOATING’,
‘<span style=”color: #9cdcfe;”>finalNetworkFeeAmount</span>’: ‘0’,
‘<span style=”color: #9cdcfe;”>platformFee_Absolute</span>’: <span style=”color: #569cd6;”>null</span>,
‘<span style=”color: #9cdcfe;”>liquidityProviderQuotes</span>’: {
‘<span style=”color: #9cdcfe;”>sellQuote</span>’: {
‘<span style=”color: #9cdcfe;”>baseValue</span>’: ‘1’,
‘<span style=”color: #9cdcfe;”>quoteValue</span>’: ‘50304.27’
},
‘<span style=”color: #9cdcfe;”>buyQuote</span>’: {
‘<span style=”color: #9cdcfe;”>baseValue</span>’: ‘50294.99’,
‘<span style=”color: #9cdcfe;”>quoteValue</span>’: ‘1’
}
},
‘<span style=”color: #9cdcfe;”>price</span>’: ‘50201.90689595’,
‘<span style=”color: #9cdcfe;”>marketLeftPrice</span>’: ‘50304.27’,
‘<span style=”color: #9cdcfe;”>marketRightPrice</span>’: ‘0.000019882696069727819809’,
‘<span style=”color: #9cdcfe;”>marketAmountToGet</span>’: ‘50243.798064469251204’,
‘<span style=”color: #9cdcfe;”>marketAmountToGetUSDT</span>’: ‘50243.798064469251204’,
‘<span style=”color: #9cdcfe;”>quotesWithoutNetworkFee</span>’: {
‘<span style=”color: #9cdcfe;”>sellQuote</span>’: {
‘<span style=”color: #9cdcfe;”>baseValue</span>’: ‘1’,
‘<span style=”color: #9cdcfe;”>quoteValue</span>’: ‘50202.90689595’
},
‘<span style=”color: #9cdcfe;”>buyQuote</span>’: {
‘<span style=”color: #9cdcfe;”>baseValue</span>’: ‘50294.99’,
‘<span style=”color: #9cdcfe;”>quoteValue</span>’: ‘0.997985’
}
},
‘<span style=”color: #9cdcfe;”>quotes</span>’: {
‘<span style=”color: #9cdcfe;”>sellQuote</span>’: {
‘<span style=”color: #9cdcfe;”>baseValue</span>’: ‘1’,
‘<span style=”color: #9cdcfe;”>quoteValue</span>’: ‘50201.90689595’
},
‘<span style=”color: #9cdcfe;”>buyQuote</span>’: {
‘<span style=”color: #9cdcfe;”>baseValue</span>’: ‘50294.99’,
‘<span style=”color: #9cdcfe;”>quoteValue</span>’: ‘0.99796512097183797717’
}
},
‘<span style=”color: #d1006c;”>markup</span>’: ‘0.3’
}
</pre>
</div>
La valeur de la signature est générée à l’aide de <span class=”notion-enable-hover” spellcheck=”false” data-token-index=”1″>hmac sha256</span>. Les données transmises sont la concaténation, sous forme de chaîne, de l’horodatage, de la représentation sous forme de chaîne du corps de la requête et de la clé publique, tandis que la clé privée est utilisée comme clé pour la fonction <span class=”notion-enable-hover” spellcheck=”false” data-token-index=”3″>hmac</span> :
<div style=”background: #0d0d0d; border: 1px solid rgba(127,127,127,.3); border-radius: 14px; padding: 16px 18px; box-shadow: 0 1px 1px rgba(0,0,0,.2); margin-bottom: 16px; font-family: monospace; color: #dcdcdc; line-height: 1.5; white-space: pre;”>
<span style=”color: #569cd6;”>function</span> signRequest(requestBody) {
<span style=”color: #569cd6;”>const</span> timestamp = <span style=”color: #569cd6;”>new</span> Date().getTime();
<span style=”color: #569cd6;”>const</span> publicKey = <span style=”color: #ce9178;”>’ZgzycV6Sf78BZKuyIAiz+0Bor002+0/rx1gLKsmYCsY='</span>;
<span style=”color: #569cd6;”>const</span> privateKey = <span style=”color: #ce9178;”>’a482a8e3a3ff9aeadefb11d3d8c11253e7e8412e05ef2b8599016cc87a64b7d6′</span>;
<span style=”color: #569cd6;”>const</span> encoder = <span style=”color: #569cd6;”>new</span> TextEncoder();
<span style=”color: #569cd6;”>const</span> data = encoder.encode(
timestamp + JSON.stringify(requestBody) + publicKey,
);
<span style=”color: #569cd6;”>const</span> hmac = createHmac(<span style=”color: #ce9178;”>’sha256′</span>, privateKey);
<span style=”color: #569cd6;”>const</span> dataSign = hmac.update(data);
<span style=”color: #569cd6;”>const</span> signature = dataSign.digest(<span style=”color: #ce9178;”>’base64′</span>);
<span style=”color: #569cd6;”>return</span> signature;
}
signRequest({ myKey: <span style=”color: #ce9178;”>’myValue'</span> })
</div>
<h2>Exemple de code d’intégration</h2>
<div style=”margin: 16px 0; font-family: system-ui, -apple-system, BlinkMacSystemFont,;”>
<div style=”display: flex; align-items: center; gap: 12px; padding: 10px 18px; border-radius: 9999px; background: #242424; color: #e5e5e5;”>
<div style=”width: 24px; height: 24px; border-radius: 6px; background: #3b82f6; display: flex; align-items: center; justify-content: center; color: #ffffff; font-weight: bold; font-size: 16px; flex-shrink: 0;”>i</div>
<div style=”font-size: 0.95rem;”>Pour la version Python, consultez notre
<a style=”color: #e5e5e5; text-decoration: underline;” href=”https://pypi.org/project/quickex-sdk/”>
SDK sur PyPi
</a></div>
<div></div>
</div>
</div>
<div style=”background: #0d0d0d; border: 1px solid rgba(127,127,127,.3); border-radius: 14px; padding: 16px 18px; box-shadow: 0 1px 1px rgba(0,0,0,.2); margin-bottom: 16px; font-family: monospace; color: #dcdcdc; line-height: 1.5; white-space: pre;”>
<span style=”color: #569cd6;”>const</span> { createHmac } = require(<span style=”color: #ce9178;”>’crypto'</span>);
<span style=”color: #569cd6;”>const</span> API_PREFIX = <span style=”color: #ce9178;”>’https://quickex.io/api/'</span>;
<span style=”color: #569cd6;”>const</span> PUBKEY = <span style=”color: #ce9178;”>’public_key'</span>; <span style=”color: #6a9955;”>// changeme</span>
<span style=”color: #569cd6;”>const</span> PRIVKEY = <span style=”color: #ce9178;”>’private_key'</span>; <span style=”color: #6a9955;”>// changeme</span>
<span style=”color: #569cd6;”>function</span> signRequest(requestBody, timestamp) {
<span style=”color: #569cd6;”>const</span> encoder = <span style=”color: #569cd6;”>new</span> TextEncoder();
<span style=”color: #569cd6;”>const</span> data = encoder.encode(timestamp + JSON.stringify(requestBody) + PUBKEY);
<span style=”color: #569cd6;”>const</span> hmac = createHmac(<span style=”color: #ce9178;”>’sha256′</span>, PRIVKEY);
<span style=”color: #569cd6;”>const</span> dataSign = hmac.update(data);
<span style=”color: #569cd6;”>const</span> signature = dataSign.digest(<span style=”color: #ce9178;”>’base64′</span>);
<span style=”color: #569cd6;”>return</span> signature;
}
<span style=”color: #569cd6;”>async function</span> createOrder() {
<span style=”color: #569cd6;”>const</span> clientBrowserFingerprint = <span style=”color: #ce9178;”>’6b3add86bec11616427d069556a33548′</span>;
<span style=”color: #569cd6;”>const</span> orderRateMode = <span style=”color: #ce9178;”>’FLOATING'</span>;
<span style=”color: #569cd6;”>const</span> depositAmount = <span style=”color: #ce9178;”>’1′</span>;
<span style=”color: #569cd6;”>const</span> clientDestinationAddress = <span style=”color: #ce9178;”>’TUhw6S1HyXDhycKvTec3x7HNGQfNn3Vhpc'</span>;
<span style=”color: #569cd6;”>const</span> clientDestinationAddressMemo = <span style=”color: #569cd6;”>null</span>;
<span style=”color: #569cd6;”>const</span> markup = <span style=”color: #ce9178;”>’0.3′</span>;
<span style=”color: #569cd6;”>const</span> instrumentFromCurrencyTitle = <span style=”color: #ce9178;”>’BTC'</span>;
<span style=”color: #569cd6;”>const</span> instrumentFromNetworkTitle = <span style=”color: #ce9178;”>’BTC'</span>;
<span style=”color: #569cd6;”>const</span> instrumentToCurrencyTitle = <span style=”color: #ce9178;”>’USDT'</span>;
<span style=”color: #569cd6;”>const</span> instrumentToNetworkTitle = <span style=”color: #ce9178;”>’TRC20′</span>;
<span style=”color: #6a9955;”>// Étape 1. Préparer le corps de la requête createOrder en utilisant les données de taux obtenues</span>
<span style=”color: #569cd6;”>const</span> createOrderRequestBody = {
rateMode: orderRateMode,
instrumentFrom: {
currencyTitle: instrumentFromCurrencyTitle,
networkTitle: instrumentFromNetworkTitle,
},
instrumentTo: {
currencyTitle: instrumentToCurrencyTitle,
networkTitle: instrumentToNetworkTitle,
},
destinationAddress: clientDestinationAddress,
destinationAddressMemo: clientDestinationAddressMemo,
refundAddress: <span style=”color: #569cd6;”>null</span>,
refundAddressMemo: <span style=”color: #569cd6;”>null</span>,
markup: markup,
claimedNetworkFee: <span style=”color: #569cd6;”>null</span>,
legacyOrderId: <span style=”color: #569cd6;”>null</span>,
referrerId: <span style=”color: #569cd6;”>null</span>,
claimedDepositAmount: depositAmount,
utmData: [],
browserFingerprint: clientBrowserFingerprint,
};
<span style=”color: #6a9955;”>// Étape 2. Préparer la signature à partir de la paire de clés et des données de la requête createOrder</span>
<span style=”color: #569cd6;”>const</span> timestamp = <span style=”color: #569cd6;”>new</span> Date().getTime();
<span style=”color: #569cd6;”>const</span> signature = signRequest(createOrderRequestBody, timestamp);
<span style=”color: #6a9955;”>// Étape 3. Appeler le point de terminaison API v2 create-order</span>
<span style=”color: #569cd6;”>const</span> order = JSON.parse(
<span style=”color: #569cd6;”>await</span> (
<span style=”color: #569cd6;”>await</span> fetch(<span style=”color: #ce9178;”>`${API_PREFIX}v2/orders/public/create`</span>, {
method: <span style=”color: #ce9178;”>’POST'</span>,
headers: {
<span style=”color: #ce9178;”>’x-api-public-key'</span>: PUBKEY,
<span style=”color: #ce9178;”>’x-api-timestamp'</span>: timestamp,
<span style=”color: #ce9178;”>’x-api-signature'</span>: signature,
<span style=”color: #ce9178;”>’content-type'</span>: <span style=”color: #ce9178;”>’application/json; charset=utf-8′</span>,
},
body: JSON.stringify(createOrderRequestBody),
})
).text(),
);
console.log(<span style=”color: #ce9178;”>’order'</span>, order);
}
<span style=”color: #569cd6;”>void</span> createOrder();
</div>