<h1>پیشمحاسبه نرخ</h1>
<h2>الگوریتم</h2>
Quickex از یک سیستم نرخ پویا برای تولید پیشبینیهای نرخ تبدیل استفاده میکند و برای این کار، تحلیل عمق بازار تأمینکنندگان نقدینگی را به کار میگیرد. در حالی که جریان پیشفرض عمق بازار را تحلیل کرده و یک نتیجه محاسبهشده و واقعبینانه برمیگرداند، پارامتر <code>markup</code> میتواند بر نرخی که توسط الگوریتم پیشبینی نرخ برگردانده میشود تأثیر بگذارد.
پارامتر <code>markup</code> پیشمحاسبه نرخ را که توسط سیستم ما بازگردانده میشود به شکل زیر تحت تأثیر قرار میدهد:
<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;”>پارامتر</th>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>توضیحات</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;”>مبلغ نهایی قابل دریافت (پیشبینیشده)</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;”>مبلغ قبل از اعمال 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;”>درصد markup</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
بر اساس فرمول ارائهشده، مقدار <code>markup</code> برابر با 0.3 برای یک تبدیل 1 BTC → USDT نتایج زیر را به دست میدهد و باعث میشود قیمت نهاییِ پیشبینیشده به اندازه 0.3٪ افزایش یابد:
<div style=”font-family: ui-monospace,SFMono-Regular,Menlo,Consolas,;”>مثال: 49549.728053855135 * (1 – \dfrac{0.3}{100}) = 49401.07886969357</div>
<h2>API</h2>
اطلاعات نرخها را میتوان از طریق یک فراخوانی API <code>v1</code> به اندپوینت <code>/api/v1/rates/public/one</code> به دست آورد. API <code>v1</code> به مجوز کلید API یا لیست سفید کردن (whitelisting) آدرسهای 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;”>پارامتر</th>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>توضیحات</th>
<th style=”border: 1px solid #3a3a3a; padding: 10px 12px; text-align: left;”>مثال</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;”>ارز مبدأ</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;”>شبکه ارز مبدأ</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;”>ارز مقصد</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;”>شبکه ارز مقصد</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;”>مبلغ واریز</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;”>درصد 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>
مقدار امضا با استفاده از <span class=”notion-enable-hover” spellcheck=”false” data-token-index=”1″>hmac sha256</span> تولید میشود. دادهای که استفاده میشود، الحاق (concat) رشتهایِ مهر زمانی (timestamp)، نمایش رشتهای بدنهٔ درخواست و کلید عمومی است، در حالی که کلید خصوصی بهعنوان کلید تابع <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>نمونه کد یکپارچهسازی</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;”>برای نسخهٔ Python، به
<a style=”color: #e5e5e5; text-decoration: underline;” href=”https://pypi.org/project/quickex-sdk/”>
SDK ما در 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;”>// گام ۱. آمادهسازی بدنهٔ درخواست createOrder با استفاده از دادههای نرخِ بهدستآمده</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;”>// گام ۲. آمادهسازی امضا بر پایهٔ جفتکلید و دادههای درخواست 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;”>// گام ۳. فراخوانی اندپوینت create-order در API v2</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>