การคำนวณอัตราแลกเปลี่ยนล่วงหน้า
อัลกอริทึม
Quickex ใช้ระบบอัตราแลกเปลี่ยนแบบไดนามิกเพื่อสร้างการคาดการณ์อัตราแลกเปลี่ยน โดยใช้การวิเคราะห์ความลึกของตลาดจากผู้ให้บริการสภาพคล่อง ในขณะที่โฟลว์ค่าเริ่มต้นจะวิเคราะห์ความลึกของตลาดและส่งคืนผลลัพธ์ที่คำนวณอย่างสมจริง พารามิเตอร์ markup สามารถมีอิทธิพลต่ออัตราแลกเปลี่ยนที่อัลกอริทึมการคาดการณ์ส่งคืนได้
พารามิเตอร์ markup จะมีผลต่อการคำนวณอัตราแลกเปลี่ยนล่วงหน้าที่ระบบของเราส่งคืนดังนี้:
| พารามิเตอร์ | คำอธิบาย |
|---|---|
| A_final | จำนวนสุดท้ายที่คาดว่าจะได้รับ |
| A_calculated | จำนวนเงินก่อนใช้ markup |
| K_markup | เปอร์เซ็นต์ของ markup |
จากสูตรที่ให้ไว้ ค่าพารามิเตอร์ markup เท่ากับ 0.3 สำหรับการแลกเปลี่ยน 1 BTC → USDT จะให้ผลลัพธ์ดังต่อไปนี้ โดยทำให้ราคาคาดการณ์สุดท้ายเพิ่มขึ้น 0.3%:
API
ข้อมูลอัตราแลกเปลี่ยนสามารถดึงได้ผ่านการเรียก API v1 ไปยัง endpoint /api/v1/rates/public/one โดย API v1 ไม่จำเป็นต้องใช้การยืนยันตัวตนด้วยคีย์ API หรือการทำ IP whitelisting
| พารามิเตอร์ | คำอธิบาย | ตัวอย่าง |
|---|---|---|
| instrumentFromCurrencyTitle | สกุลเงินต้นทาง | BTC |
| instrumentFromNetworkTitle | เครือข่ายของสกุลเงินต้นทาง | BTC |
| instrumentToCurrencyTitle | สกุลเงินปลายทาง | USDT |
| instrumentToNetworkTitle | เครือข่ายของสกุลเงินปลายทาง | TRC20 |
| rateMode | FLOATING / FIXED | FLOATING |
| claimedDepositAmount | จำนวนเงินฝาก | 1 |
| markup | เปอร์เซ็นต์ของ 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" }
พารามิเตอร์ 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
ระหว่างการสร้างออร์เดอร์ Quickex API จะรับพารามิเตอร์ 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
การใช้งาน endpoint ของ API v2 ต้องมีการตั้งค่าการยืนยันตัวตนเพิ่มเติม หากไม่มีพารามิเตอร์การยืนยันตัวตนที่จำเป็น endpoint v2 จะส่งกลับข้อผิดพลาด 403 Forbidden
การเชื่อมต่อประกอบด้วยสองขั้นตอน — การสร้างคีย์ API และการเชื่อมการใช้งานคีย์ดังกล่าวเข้ากับคำขอ API เมื่อสร้างคีย์ API แล้ว ลูกค้า b2b ของเราจะได้รับคู่กุญแจสำหรับใช้เซ็นคำขอของตน พร้อมทั้งรายการที่อยู่ IP ใน whitelist ที่สามารถเข้าถึง endpoint ของ API ได้
คุณต้องมีคุกกี้ยืนยันตัวตนที่ยังใช้งานอยู่เพื่อทำคำขอ
/api/v1/users/*
การสร้างคีย์ API
ระหว่างการสร้างคีย์ API จำเป็นต้องส่งอาร์เรย์ของ IP ที่อยู่ใน 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”
}
การตอบกลับจะมีคู่กุญแจที่จำเป็นต้องใช้ในการยืนยันตัวตนของ API v2
ฟิลด์
secretKey
จะแสดงเพียงครั้งเดียวเท่านั้นในระหว่างการสร้างคีย์ API เราแนะนำให้บันทึกค่าไว้ทันทีหลังจากสร้างคีย์ API แล้ว
การแสดงรายการคีย์ API ของคุณ
หากการเชื่อมต่อของคุณจำเป็นต้องใช้มากกว่าหนึ่งคีย์ API คุณสามารถดึงรายการคีย์เหล่านั้นได้อย่างง่ายดายผ่าน 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”
}
]
การจัดการคีย์ API ของคุณ
การจัดการคีย์ API ที่มีอยู่สามารถทำได้ผ่านช่องทางซัพพอร์ตลูกค้า b2b ของเรา ซึ่งรวมถึง:
- การลบคีย์ API
- การเพิ่ม IP ใหม่ใน whitelist ให้กับคีย์ API ที่มีอยู่
- การอัปเดตและเพิ่มการตั้งค่าสำหรับคีย์ API (เช่น ค่าต่ำสุด/ค่าสูงสุดของค่า markup)
- การปิดใช้งานคีย์ API
การใช้งานคีย์ API
API v2 ต้องกำหนด header 3 ตัวในทุกคำขอ:
| Header | ค่า |
|---|---|
| x-api-public-key | public key ของคุณที่ได้รับระหว่างการสร้างคีย์ API |
| x-api-timestamp | ค่าเวลาแบบ UNIX timestamp |
| x-api-signature | ลายเซ็นของคำขอ |
ค่าลายเซ็นจะถูกสร้างโดยใช้ hmac sha256 ข้อมูลที่ใช้คือสตริงที่ได้จากการต่อ timestamp ข้อความตัวอักษรของ body คำขอ และ public key เข้าด้วยกัน โดยใช้ private key เป็น key ให้กับฟังก์ชัน 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” })
ตัวอย่างโค้ดสำหรับการเชื่อมต่อ
SDK ของเราบน PyPi
const { createHmac } = require(‘crypto’);
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: เตรียม request body ของ 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: เรียก endpoint create-order ของ 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();