[TOC]
Đây là bài viết thứ ba về thực hành định lượng của các sàn giao dịch DEX. Lần này chúng tôi sẽ giới thiệu hướng dẫn sử dụng giao thức Vertex.
Trong khuôn khổ các sàn giao dịch phi tập trung (DEX) truyền thống, các nhà giao dịch định lượng thường phải thỏa hiệp: hoặc chấp nhận mức trượt giá cao và hiệu quả thực hiện thấp của mô hình tạo lập thị trường tự động (AMM), hoặc rơi vào tình thế tiến thoái lưỡng nan về mặt kỹ thuật là phân mảnh thanh khoản chuỗi chéo và các hàm phái sinh đơn lẻ. Sự xuất hiện của Vertex Protocol đang định nghĩa lại ranh giới trên chuỗi của các chiến lược định lượng thông qua một thử nghiệm kết hợp “phi tập trung + cấp độ tổ chức” - không có tình huống tiến thoái lưỡng nan “chọn một trong hai” ở đây, chỉ có sự cân bằng cuối cùng giữa tốc độ, chiều sâu và sự tự do.
Là DEX đầu tiên tích hợp nhóm thanh khoản đa chuỗi thống nhất, sổ lệnh lai (CLOB) và thị trường tiền tệ nhúng, Vertex lấy “trải nghiệm tập trung, tâm hồn phi tập trung” làm cốt lõi và mở ra một hướng đi độc đáo cho các nhà giao dịch định lượng:
Một định nghĩa mới về tốc độ và tính lưu động
Với sự phát triển liên tục của công nghệ blockchain, ranh giới giữa các sàn giao dịch tập trung truyền thống (CEX) và các sàn giao dịch phi tập trung (DEX) đang dần mờ nhạt. Là trung tâm của nền tảng Vertex, Vertex Edge không chỉ định hình lại tốc độ giao dịch và tính thanh khoản mà còn kết hợp hoàn hảo công nghệ khớp lệnh tuyệt vời và lợi thế tự lưu ký thông qua tích hợp chuỗi chéo, mang đến trải nghiệm DeFi mới cho các nhà giao dịch toàn cầu.
Thống nhất thanh khoản chuỗi chéo: phá vỡ sự phân mảnh thanh khoản Ở các thị trường truyền thống, tính thanh khoản giữa các chuỗi khác nhau thường bị phân mảnh, dẫn đến việc các nhà giao dịch không thể tận hưởng được mức giá và độ sâu giao dịch tốt nhất. Vertex Edge ra đời trong bối cảnh này, hiện thực hóa việc chia sẻ đồng bộ tính thanh khoản vĩnh viễn trên nhiều chuỗi thông qua mạng lưới sổ lệnh thống nhất. Hiện tại, Vertex Edge đã bao phủ thanh khoản hợp đồng vĩnh viễn trên 7 chuỗi chính thống bao gồm Arbitrum, Base, Sei, Blast, Mantle, Sonic và Abstract, để các nhà giao dịch không còn phải lo lắng về sự phân tán thanh khoản và có thể giao dịch với mức giá tốt nhất, thực sự đạt được kết nối liền mạch của thanh khoản toàn cầu.
Giao dịch sổ lệnh kết hợp: sự cân bằng hoàn hảo giữa khớp lệnh siêu nhanh và thanh toán trên chuỗi Vertex Edge áp dụng mô hình giao dịch sổ lệnh kết hợp và các công nghệ cốt lõi của nó bao gồm:
Công cụ khớp lệnh ngoài chuỗi: Sử dụng cơ chế khớp lệnh ngoài chuỗi tốc độ cực cao để đạt được khả năng khớp lệnh với độ trễ chỉ 5-15 mili giây, tương đương với hầu hết các sàn giao dịch tập trung; Công cụ quản lý rủi ro trên chuỗi và AMM: Hệ thống quản lý rủi ro và nhà tạo lập thị trường tự động (AMM) được triển khai trên mỗi chuỗi được hỗ trợ để đảm bảo các lệnh có thể được thanh toán một cách an toàn và minh bạch sau khi khớp lệnh. Kiến trúc này không chỉ đảm bảo phản hồi giao dịch cực nhanh mà còn cung cấp cho người dùng tính bảo mật phi tập trung thông qua thanh toán trên chuỗi, cho phép các nhà giao dịch tận hưởng hiệu suất cấp CEX trong khi vẫn duy trì tính độc lập của việc tự lưu ký tài sản.
Chức năng đa tài khoản: quản lý nhiều tài khoản trong một ví và phân bổ tiền hiệu quả hơn; Vị thế giao ngay có đòn bẩy: Sử dụng toàn bộ tài sản làm ký quỹ để đạt hiệu quả vốn cao hơn; Quản lý rủi ro linh hoạt: Tiền gửi, vị thế và dữ liệu lãi lỗ được xem xét theo cách thống nhất để kiểm soát chính xác mức độ rủi ro.
Đăng nhập địa chỉ trang “vertex protocol”:
Vertex giống như hầu hết các DEX. Sau khi đăng nhập vào dapp, bạn cần kết nối với ví để được ủy quyền. Hệ thống tài khoản phụ của Vertex được phân biệt dựa trên nhãn. Nhãn tham gia vào tính toán địa chỉ ví để có được địa chỉ ví tài khoản phụ. Đồng thời, địa chỉ này được ủy quyền để đặt lệnh và các hoạt động khác.
Ví dụ, sử dụngWalletConnectĐịa chỉ ví khi được kết nối là:0x7a5ec2748e9065794491a8d29dcf3f9edb8d7c43
, nhãn mặc định là “mặc định” và địa chỉ tài khoản phụ được tính toán là:0x7a5ec2748e9065794491a8d29dcf3f9edb8d7c4364656661756c740000000000
. Các thẻ mặc định là:64656661756c740000000000
。
Vertex hỗ trợ nạp tiền nhiều tài sản. Nói chung, bạn chọn nạp tiền USDC dưới dạng ký quỹ và trực tiếp sử dụng ví được kết nối để chuyển giao dịch. Cần lưu ý rằng các hoạt động như rút, chuyển, gửi token và chuyển tài khoản phụ trên Vertex sẽ tiêu tốn USDC và phí không hề thấp, do đó cần phải thận trọng khi thực hiện các hoạt động này.
Chuyển sang chuỗi khác:
Trên đỉnh, các chuỗi khác nhau có thông tin cấu hình khác nhau như nút, chỉ mục và ID chuỗi. Chuỗi mặc định cho đóng gói FMZ làArbitrum One
có thể sử dụngLog(HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=contracts"))
Truy vấn ID của chuỗi, thông tin hợp đồng đã triển khai, v.v.
Sau khi đăng nhập vào FMZ.COM, trên trang cấu hình sàn giao dịch, chọn “Tiền điện tử”, chọn Vertex Exchange, bạn có thể trực tiếp cấu hình khóa proxy ví trên dapp. Tất nhiên, bạn cũng có thể cấu hình khóa riêng ví. Trên Vertex, bạn có thể sử dụng giao diện để quản lý ủy quyền/hủy ủy quyền khóa proxy và các hoạt động khác, cũng thuận tiện hơn.
Khóa Proxy:
Ví dụ, trên trang giao diện của sàn giao dịch DEX đỉnh: Trình duyệt Chrome (bật gỡ lỗi) -> Ứng dụng -> Lưu trữ cục bộ -> https://app.vertex -> vertex userSettings
Cấu hình Vertex Exchange
Có hai thứ cần được cấu hình trên FMZ. Thứ nhất là địa chỉ ví (không phải địa chỉ của khóa proxy được sử dụng để ký, mà phải là địa chỉ ví được kết nối với dapp). Thứ hai là khóa bí mật được sử dụng để ký (có thể là khóa riêng của ví hoặc khóa proxy). Vì có thể sử dụng khóa proxy nên địa chỉ ví và khóa được cấu hình không nhất thiết phải là một cặp.
Hệ thống tài khoản phụ của Vertex được xác định bằng thẻ. Thẻ mặc định được sử dụng trên FMZ làdefault
Tài khoản chính của thẻ, nếu bạn cần chuyển đổi, bạn có thể sử dụng nó trong mã:
exchange.IO("subAccountTag", "default") // 切换到主子账号
exchange.IO("subAccountTag", "test01") // 切换到标签名为 test01 的子账号
Sau khi cấu hình thông tin cấu hình trao đổi và triển khai chương trình giám sát có thể truy cập giao diện đỉnh, chúng ta có thể bắt đầu viết một số mã cho các hoạt động thực tế.
Chúng tôi sử dụng tài khoản phụ chính để thử nghiệm (tài khoản phụ có thẻ: mặc định) và chúng tôi sử dụngArbitrummạng.
function main() {
var markets = exchange.GetMarkets()
if (!markets) {
throw "get markets error"
}
var tbl = {
type: "table",
title: "test markets",
cols: [
"key", "Symbol", "BaseAsset", "QuoteAsset", "TickSize", "AmountSize", "PricePrecision", "AmountPrecision", "MinQty",
"MaxQty", "MinNotional", "MaxNotional", "CtVal", "CtValCcy"
],
rows: []
}
for (var symbol in markets) {
var market = markets[symbol]
tbl.rows.push([
symbol, market.Symbol, market.BaseAsset, market.QuoteAsset, market.TickSize, market.AmountSize,
market.PricePrecision, market.AmountPrecision, market.MinQty, market.MaxQty, market.MinNotional, market.MaxNotional, market.CtVal, market.CtValCcy
])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return markets
}
Có thể thấy rằng loại hợp đồng trên Vertex là hợp đồng dựa trên USDC, biên độ là USDC và giá trị của hợp đồng đại diện cho một loại tiền tệ tương ứng, ví dụBTC_USDC.swap
Nghĩa là, hợp đồng BTC dựa trên USDC, mỗi hợp đồng đại diện cho một vị thế BTC. Đoạn mã trên cho thấy cách yêu cầu thông tin thị trường hợp đồng và xuất ra nhiều nội dung khác nhau.
function main() {
var depths = [{"symbol": "ETH_USDC"}, {"symbol": "SOL_USDC"}, {"symbol": "BTC_USDC"}]
for (var ele of depths) {
ele["depth"] = exchange.GetDepth(ele["symbol"] + ".swap")
}
var tbls = []
for (var ele of depths) {
var tbl = {"type": "table", "title": ele["symbol"], "cols": ["level", "price", "amount"], "rows": []}
var depth = ele["depth"]
for (var i = 0 ; i < 3 ; i++) {
tbl["rows"].push(["卖" + (i + 1), depth.Asks[i].Price, depth.Asks[i].Amount])
}
tbl["rows"].reverse()
for (var i = 0 ; i < 3 ; i++) {
tbl["rows"].push(["买" + (i + 1), depth.Bids[i].Price, depth.Bids[i].Amount])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
function main() {
var arrTrades = [{"symbol": "ETH_USDC"}, {"symbol": "SOL_USDC"}, {"symbol": "BTC_USDC"}]
for (var ele of arrTrades) {
ele["trades"] = exchange.GetTrades(ele["symbol"] + ".swap")
}
var tbls = []
for (var ele of arrTrades) {
var tbl = {"type": "table", "title": ele["symbol"], "cols": ["Time", "Price", "Amount", "side"], "rows": []}
var trades = ele["trades"]
for (var trade of trades) {
tbl["rows"].push([_D(trade.Time), trade.Price, trade.Amount, trade.Type == 0 ? "买入" : "卖出"])
}
tbls.push(tbl)
}
LogStatus("`" + JSON.stringify(tbls) + "`")
}
function main() {
let c = KLineChart({
overlay: true
})
let bars = exchange.GetRecords("SOL_USDC.swap")
if (!bars) {
return
}
bars.forEach(function(bar, index) {
c.begin(bar)
Log(index, bar)
c.close()
})
}
Biểu đồ đỉnh
Bản vẽ hoạt động chiến lược FMZ
function main() {
var fundings = exchange.GetFundings()
var tbl = {
"type": "table",
"title": "GetFundings",
"cols": ["Symbol", "Interval", "Time", "Rate"],
"rows": [],
}
for (var f of fundings) {
tbl["rows"].push([f.Symbol, f.Interval / 3600000, _D(f.Time), f.Rate * 100 + " %"])
}
LogStatus(_D(), "\n`" + JSON.stringify(tbl) + "`")
}
Chu kỳ tỷ lệ tài trợ là 1 giờ.
Max Order Size Gets the max order size possible of a given product for a given subaccount.
function main() {
// GET [GATEWAY_REST_ENDPOINT]/query?type=max_order_size&product_id={product_id}&sender={sender}&price_x18={price_x18}&direction={direction}
// price_x18=3000000000000000000000 : 3000 USDC
// product_id=4 : ETH_USDC.swap
// sender=0x123 : e.g. 0x123
return HttpQuery("https://gateway.prod.vertexprotocol.com/query?type=max_order_size&product_id=4&sender=0x123&price_x18=3000000000000000000000&direction=short")
}
Dữ liệu trả về từ yêu cầu cuối cùng là:{"status":"success","data":{"max_order_size":"170536415320344899"},"request_type":"query_max_order_size"}
Có thể thấy rằng tài khoản hiện tại có sẵn tài sản cho hợp đồng vĩnh viễn Ethereum với giá 3000, số lượng đặt hàng tối đa cho một lệnh bán là: 0,17 ETH
Linked Signer Retrieves current linked signer of a provided subaccount
function main() {
return HttpQuery("https://gateway.prod.vertexprotocol.com/query?type=linked_signer&subaccount=0x123")
}
Thông tin ủy quyền được tìm thấy:
{“status”:“success”,“data”:{“linked_signer”:“0x79119…”},“request_type”:“query_linked_signer”} Địa chỉ “0x79119…” là địa chỉ proxy để ủy quyền giao dịch lệnh khi kết nối với ví trên trang chủ Vertex. Quyền này có thể được thu hồi hoặc thêm vào (thông qua lệnh gọi API).
Sau đây là trọng tâm của bài viết này. Chúng tôi đã bận rộn trong một thời gian dài chỉ để thực hiện các giao dịch đơn giản và nhanh chóng trên các sàn giao dịch phi tập trung.
Kiểm tra giao dịch đơn giản hơn và đặt lệnh giới hạn bình thường.
function main() {
var id1 = exchange.CreateOrder("ETH_USDC.swap", "buy", 2000, 0.1)
var id2 = exchange.CreateOrder("SOL_USDC.swap", "buy", 60, 2)
Log("ETH_USDC.swap id1:", id1)
Log("SOL_USDC.swap id2:", id2)
var orders = exchange.GetOrders("USDC.swap")
var tbl = {type: "table", title: "test GetOrders", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}
function main() {
var orders = exchange.GetOrders("USDC.swap")
var tbl = {type: "table", title: "test GetOrders", cols: ["Symbol", "Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
for (var order of orders) {
tbl.rows.push([order.Symbol, order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
exchange.CancelOrder(order.Id)
}
LogStatus("`" + JSON.stringify(tbl) + "`")
return exchange.GetOrders()
}
function main() {
// 使用市价单下单持仓
exchange.SetCurrency("ETH_USDC")
exchange.SetContractType("swap")
exchange.Buy(-1, 0.01)
var positions = exchange.GetPositions()
var tbl = {type: "table", title: "test GetPosition/GetPositions", cols: ["Symbol", "Amount", "Price", "FrozenAmount", "Type", "Profit", "Margin", "ContractType", "MarginLevel"], rows: []}
for (var p of positions) {
tbl.rows.push([p.Symbol, p.Amount, p.Price, p.FrozenAmount, p.Type, p.Profit, p.Margin, p.ContractType, p.MarginLevel])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}
Cần lưu ý rằng dữ liệu do Vertex API cung cấp khác với nội dung hiển thị trên trang đầu của Vertex, chủ yếu là do sự khác biệt về giá nắm giữ trung bình và lợi nhuận và thua lỗ của các khoản nắm giữ. Dữ liệu này đã được phản hồi lại cho nhóm Vertex và có thể được nâng cấp và cập nhật sau.
4、Trigger Order
Vì Thứ tự kích hoạt của đỉnh không phụ thuộc vào endPoint, khi sử dụngexchange.IO
Khi đặt lệnh có điều kiện cho một hàm, bạn cần chỉ địnhTrigger: https://trigger.prod.vertexprotocol.com
, chúng ta hãy tiếp tục với hoạt động thực tế.
function main() {
// isTrigger : true
var nonce = exchange.IO("nonce", true) // 如果是 Trigger Order 订单用到的 nonce 需要指定 isTrigger : true
// flag , reduceOnly
var expiration = exchange.IO("expiration", "GTC", false) // 设置订单为GTC类型,非只减仓
// params
var params = {
"place_order": {
"product_id": 4,
"order": {
"sender": "0x123...",
"priceX18": "4100000000000000000000",
"amount": "-100000000000000000",
"expiration": expiration,
"nonce": nonce
},
"trigger": {
"price_above": "4000000000000000000000"
}
}
}
return exchange.IO("api", "POST", "https://trigger.prod.vertexprotocol.com/v1/execute", "", JSON.stringify(params))
}
Bên dưới điểm cuối kích hoạt, cũng có:
Phương thức gọi này tương tự như Place Trigger Order, vì vậy tôi sẽ không đi sâu vào chi tiết ở đây.
Thẻ tài khoản phụ mặc định là:default
, chúng tôi chuyển sang thẻ tùy chỉnh:subAcc02
。
function main() {
exchange.IO("subAccountTag", "subAcc02")
return exchange.GetAccount()
}
Khi chuyển tiền đến địa chỉ tài khoản phụ, Vertex sẽ thực sự tạo tài khoản phụ này.
Số nonce của tài khoản cần được truy vấn và truyền vào các tham số của giao diện chuyển tiền dưới dạng tham số.
function main() {
var ret = HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=nonces&address=0x123...")
var obj = JSON.parse(ret)
var nonce = obj["data"]["tx_nonce"]
Log("nonce:", nonce)
var params = {
"transfer_quote": {
"tx": {
// default -> subAcc02
"sender": "0xabc...", // default
"recipient": "0xdef...", // subAcc02
"amount": "7000000000000000000",
"nonce": nonce
}
}
}
return exchange.IO("api", "POST", "https://gateway.prod.vertexprotocol.com/v1/execute", "", JSON.stringify(params))
}
Ví dụ: 0xabc… tương ứng với địa chỉ tài khoản phụ có thẻ mặc định. 0xdef… tương ứng với địa chỉ tài khoản phụ có thẻ subAcc02. 0x123… là địa chỉ ví.
function main() {
var ret = HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=nonces&address=0x123...")
var obj = JSON.parse(ret)
var nonce = obj["data"]["tx_nonce"]
Log("nonce:", nonce)
var params = {
"withdraw_collateral": {
"tx": {
"sender": "0xabc...", // default
"productId": 0, // USDC : 0 , precision : 6
"amount": "10000000", // 10 USDC
"nonce": nonce
}
}
}
return exchange.IO("api", "POST", "https://gateway.prod.vertexprotocol.com/v1/execute", "", JSON.stringify(params))
}
Hãy chú ý đến độ chính xác của USDC.
function main() {
var ret = HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=nonces&address=0x123...")
var obj = JSON.parse(ret)
var nonce = obj["data"]["tx_nonce"]
Log("nonce:", nonce)
var params = {
"mint_lp": {
"tx": {
"sender": "0xabc...", // default
"productId": 31, // USDT_USDC
"amountBase": "10000000000000000000",
"quoteAmountLow": "9999900000000000000",
"quoteAmountHigh": "10100000000000000000",
"nonce": nonce,
}
}
}
return exchange.IO("api", "POST", "https://gateway.prod.vertexprotocol.com/v1/execute", "", JSON.stringify(params))
}
Mint LP token cho các cặp giao dịchUSDT_USDC
Quỹ trao đổi bổ sung tính thanh khoản.
function main() {
var ret = HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=nonces&address=0x123...")
var obj = JSON.parse(ret)
var nonce = obj["data"]["tx_nonce"]
Log("nonce:", nonce)
var params = {
"burn_lp": {
"tx": {
"sender": "0xabc...", // default
"productId": 31, // USDT_USDC
"amount": "7500000000000000000",
"nonce": nonce,
}
}
}
return exchange.IO("api", "POST", "https://gateway.prod.vertexprotocol.com/v1/execute", "", JSON.stringify(params))
}
Điểm cuối giao diện Websocket:wss://gateway.prod.vertexprotocol.com/v1/ws
。
[🚧🚧🚧ing…]
Các bài kiểm tra trên dựa trên người giám hộ mới nhất. Bạn cần tải xuống người giám hộ mới nhất để hỗ trợ trình tổng hợp Vertex DEX.
Cảm ơn các bạn đã ủng hộ và đọc bài viết.