มาร์กอัปเอพีไอ

Author profile photo
ทีม Quickex
26 พฤศจิกายน 2568
~4 นาทีในการอ่าน

การคำนวณอัตราแลกเปลี่ยนล่วงหน้า

อัลกอริทึม

Quickex ใช้ระบบอัตราแลกเปลี่ยนแบบไดนามิกเพื่อสร้างการคาดการณ์อัตราแลกเปลี่ยน โดยใช้การวิเคราะห์ความลึกของตลาดจากผู้ให้บริการสภาพคล่อง ในขณะที่โฟลว์ค่าเริ่มต้นจะวิเคราะห์ความลึกของตลาดและส่งคืนผลลัพธ์ที่คำนวณอย่างสมจริง พารามิเตอร์ markup สามารถมีอิทธิพลต่ออัตราแลกเปลี่ยนที่อัลกอริทึมการคาดการณ์ส่งคืนได้

พารามิเตอร์ markup จะมีผลต่อการคำนวณอัตราแลกเปลี่ยนล่วงหน้าที่ระบบของเราส่งคืนดังนี้:

A_final = A_calculated × (1 − (K_markup / 100))
พารามิเตอร์ คำอธิบาย
A_final จำนวนสุดท้ายที่คาดว่าจะได้รับ
A_calculated จำนวนเงินก่อนใช้
markup
K_markup เปอร์เซ็นต์ของ markup

จากสูตรที่ให้ไว้ ค่าพารามิเตอร์ markup เท่ากับ 0.3 สำหรับการแลกเปลี่ยน 1 BTC → USDT จะให้ผลลัพธ์ดังต่อไปนี้ โดยทำให้ราคาคาดการณ์สุดท้ายเพิ่มขึ้น 0.3%:

ตัวอย่าง: 49549.728053855135 * (1 – \dfrac{0.3}{100}) = 49401.07886969357

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 จะใช้สูตรต่อไปนี้ในอัลกอริทึมคำนวณค่าคอมมิชัน:

A_{withdrawal} = A_{exchange} * (1 – \dfrac {(C_{platform\ (\%)} + K_{markup})}{100})
Awithdrawal จำนวนเหรียญที่ส่งให้ลูกค้าเป็นผลลัพธ์ของการแลกเปลี่ยน
Aexchange จำนวนเหรียญที่ Quickex มีอยู่หลังจากดำเนินกลยุทธ์การเทรดของเรา
Cplatform (%) เปอร์เซ็นต์ค่าคอมมิชันที่กำหนดโดย Quickex
Kmarkup markup
ค่าพารามิเตอร์

จากสูตรที่ให้ไว้ ค่าพารามิเตอร์ markup เท่ากับ 0.3 ที่ถูกส่งในระหว่างการสร้างออร์เดอร์จะเพิ่มเปอร์เซ็นต์ค่าคอมมิชันของ Quickex อีก 0.3 ในตัวอย่างต่อไปนี้ ค่าคอมมิชันของ Quickex ถูกตั้งไว้ที่ 1 เปอร์เซ็นต์:

A_{withdrawal} = A_{exchange} * (1 – \dfrac {1 + 0.3}{100})

โดยอ้างอิงจากตัวอย่างก่อนหน้า การแลกเปลี่ยน 1 BTC เป็น USDT โดยใช้ราคาตลาด 50243.798064469251204 BTC: USDT จะทำให้จำนวนเงินที่ถอนให้ลูกค้าเป็นดังนี้:

50243.798064469251204 * (1 – \dfrac{1 + 0.3}{100}) = 49590.62868963115

จากสูตรที่ให้ไว้ ค่าพารามิเตอร์ markup เท่ากับ 0.3 ที่ถูกส่งในระหว่างการสร้างออร์เดอร์จะเพิ่มเปอร์เซ็นต์ค่าคอมมิชันของ Quickex อีก 0.3

หลังจากที่การแลกเปลี่ยนซึ่งมีพารามิเตอร์ markup เปลี่ยนสถานะเป็น COMPLETED แล้ว พารามิเตอร์ markup จะถูกใช้ในสูตรคำนวณมาร์จิ้นของพาร์ตเนอร์ดังนี้:

C_{affiliate} = (C_{platform} * \dfrac{C_{affiliate\ (\%)}}{100}) + (C_{platform} * \dfrac{K_{markup}}{100})
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” })

ตัวอย่างโค้ดสำหรับการเชื่อมต่อ

i
สำหรับเวอร์ชัน Python โปรดดู

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();

แชร์บทความนี้: