[TOC]
Ini adalah artikel ketiga tentang praktik kuantitatif bursa DEX. Kali ini kami akan memperkenalkan panduan penggunaan protokol Vertex.
Dalam kerangka bursa terdesentralisasi tradisional (DEX), pedagang kuantitatif sering kali perlu berkompromi: menerima slippage yang tinggi dan efisiensi eksekusi yang rendah dari model pembuat pasar otomatis (AMM), atau jatuh ke dalam dilema teknis fragmentasi likuiditas lintas rantai dan fungsi derivatif tunggal. Munculnya Protokol Vertex mendefinisikan ulang batasan on-chain dari strategi kuantitatif melalui eksperimen penggabungan “tingkat desentralisasi + tingkat institusional” - tidak ada dilema “pilih satu dari dua” di sini, hanya keseimbangan utama antara kecepatan, kedalaman, dan kebebasan.
Sebagai DEX pertama yang mengintegrasikan kumpulan likuiditas multi-rantai terpadu, buku pesanan hibrida (CLOB) dan pasar mata uang tertanam, Vertex mengambil “pengalaman terpusat, jiwa terdesentralisasi” sebagai intinya dan membuka jalur unik bagi para pedagang kuantitatif:
Definisi baru kecepatan dan fluiditas
Dengan evolusi teknologi blockchain yang berkelanjutan, batasan antara bursa tersentralisasi tradisional (CEX) dan bursa terdesentralisasi (DEX) secara bertahap menjadi kabur. Sebagai pusat platform Vertex, Vertex Edge tidak hanya mengubah kecepatan transaksi dan likuiditas, tetapi juga menggabungkan dengan sempurna teknologi pencocokan pesanan yang unggul dan keunggulan penyimpanan mandiri melalui integrasi lintas rantai, sehingga menghadirkan pengalaman DeFi baru bagi para pedagang global.
Menyatukan likuiditas lintas rantai: memecah fragmentasi likuiditas Di pasar tradisional, likuiditas antara rantai yang berbeda sering kali terfragmentasi, mengakibatkan pedagang tidak dapat menikmati harga dan kedalaman transaksi terbaik. Vertex Edge lahir dalam konteks ini, mewujudkan pembagian likuiditas permanen yang sinkron di berbagai rantai melalui jaringan buku pesanan terpadu. Saat ini, Vertex Edge telah mencakup likuiditas kontrak abadi pada 7 rantai utama termasuk Arbitrum, Base, Sei, Blast, Mantle, Sonic dan Abstract, sehingga para pedagang tidak perlu lagi khawatir tentang penyebaran likuiditas, dan dapat berdagang pada harga terbaik, benar-benar mencapai koneksi likuiditas global yang mulus.
Perdagangan buku pesanan hibrida: keseimbangan sempurna antara pencocokan sangat cepat dan penyelesaian on-chain Vertex Edge mengadopsi model perdagangan buku pesanan hybrid, dan teknologi intinya meliputi:
Pencocokan buku pesanan di luar rantai: Memanfaatkan mekanisme pencocokan di luar rantai berkecepatan sangat tinggi untuk mencapai pencocokan pesanan dengan latensi hanya 5-15 milidetik, sebanding dengan sebagian besar bursa tersentralisasi; Mesin risiko on-chain dan AMM: Sistem manajemen risiko dan pembuat pasar otomatis (AMM) diterapkan pada setiap rantai yang didukung untuk memastikan bahwa pesanan dapat diselesaikan dengan cara yang aman dan transparan setelah pencocokan. Arsitektur ini tidak hanya memastikan respons transaksi yang sangat cepat, tetapi juga memberi pengguna keamanan yang terdesentralisasi melalui penyelesaian on-chain, yang memungkinkan pedagang menikmati kinerja setingkat CEX sambil menjaga independensi penjagaan aset sendiri.
Fungsi multi-akun: mengelola beberapa akun dalam satu dompet dan mengalokasikan dana secara lebih efisien; Posisi spot dengan leverage: Gunakan semua aset sebagai margin untuk mencapai efisiensi modal yang lebih tinggi; Manajemen risiko yang fleksibel: Data simpanan, posisi, dan laba rugi dipertimbangkan secara terpadu untuk mengendalikan paparan risiko secara akurat.
Alamat halaman login “protokol vertex”:
Vertex sama seperti kebanyakan DEX. Setelah masuk ke dapp, Anda perlu terhubung ke dompet untuk otorisasi. Sistem sub-akun Vertex dibedakan berdasarkan label. Label berpartisipasi dalam kalkulasi alamat dompet untuk mendapatkan alamat dompet sub-akun. Pada saat yang sama, alamat ini diotorisasi untuk melakukan pemesanan dan operasi lainnya.
Misalnya, gunakanWalletConnectAlamat dompet saat terhubung adalah:0x7a5ec2748e9065794491a8d29dcf3f9edb8d7c43
, label default adalah “default”, dan alamat sub-akun yang dihitung adalah:0x7a5ec2748e9065794491a8d29dcf3f9edb8d7c4364656661756c740000000000
. Tag defaultnya adalah:64656661756c740000000000
。
Vertex mendukung pengisian ulang beberapa aset. Umumnya, Anda memilih untuk mengisi ulang USDC sebagai margin dan langsung menggunakan dompet yang terhubung untuk mentransfer transaksi. Perlu dicatat bahwa operasi seperti penarikan, transfer, pengiriman token, dan transfer sub-akun di Vertex akan menggunakan USDC, dan biayanya tidak rendah, jadi operasi ini perlu dilakukan dengan hati-hati.
Beralih ke rantai yang berbeda:
Pada vertex, rantai yang berbeda memiliki informasi konfigurasi yang berbeda seperti node, pengindeks, dan ID rantai. Rantai default untuk enkapsulasi FMZ adalahArbitrum One
, dapat digunakanLog(HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=contracts"))
Menanyakan ID rantai, informasi kontrak yang diterapkan, dll.
Setelah masuk ke FMZ.COM, pada halaman konfigurasi bursa, pilih “Mata Uang Kripto”, pilih Vertex Exchange, Anda dapat langsung mengonfigurasi kunci proksi dompet pada dapp. Tentu saja, Anda juga dapat mengonfigurasi kunci privat dompet. Di Vertex, Anda dapat menggunakan antarmuka untuk mengelola otorisasi/deotorisasi kunci proksi dan operasi lainnya, yang juga lebih mudah.
Kunci Proksi:
Misalnya, pada halaman front-end pertukaran DEX vertex: Browser Chrome (aktifkan debugging) -> Aplikasi -> Penyimpanan Lokal -> https://app.vertex -> vertex userSettings
Konfigurasikan Pertukaran Vertex
Dua hal perlu dikonfigurasikan pada FMZ. Yang pertama adalah alamat dompet (bukan alamat kunci proksi yang digunakan untuk penandatanganan, melainkan alamat dompet yang terhubung ke dapp). Yang kedua adalah kunci rahasia yang digunakan untuk penandatanganan (bisa berupa kunci pribadi dompet atau kunci proksi). Karena kunci proksi dapat digunakan, alamat dompet dan kunci yang dikonfigurasi belum tentu berpasangan.
Sistem sub-akun Vertex diidentifikasi dengan tag. Tag default yang digunakan pada FMZ adalahdefault
Akun utama tag, jika Anda perlu beralih, Anda dapat menggunakannya dalam kode:
exchange.IO("subAccountTag", "default") // 切换到主子账号
exchange.IO("subAccountTag", "test01") // 切换到标签名为 test01 的子账号
Setelah mengonfigurasi informasi konfigurasi pertukaran dan menyebarkan program kustodian yang dapat mengakses antarmuka vertex, kita dapat mulai menulis beberapa kode untuk operasi praktis.
Kami menggunakan sub-akun utama untuk pengujian (sub-akun dengan tag: default), dan kami menggunakanArbitrumjaringan.
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
}
Dapat dilihat bahwa jenis kontrak di Vertex adalah kontrak berbasis USDC, marginnya adalah USDC, dan nilai kontrak mewakili mata uang yang sesuai, misalnyaBTC_USDC.swap
Artinya, kontrak BTC berbasis USDC, satu kontrak mewakili posisi BTC. Kode di atas menunjukkan cara meminta informasi pasar kontrak dan menampilkan berbagai konten.
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()
})
}
Bagan titik puncak
Gambar operasi strategi 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) + "`")
}
Siklus laju pendanaan adalah 1 jam.
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")
}
Data yang dikembalikan oleh permintaan akhir adalah:{"status":"success","data":{"max_order_size":"170536415320344899"},"request_type":"query_max_order_size"}
Dapat dilihat bahwa aset akun saat ini tersedia untuk kontrak abadi Ethereum dengan harga 3000, jumlah pesanan maksimum untuk pesanan jual adalah: 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")
}
Informasi otorisasi ditemukan:
{“status”:“success”,“data”:{“linked_signer”:“0x79119…”},“request_type”:“query_linked_signer”} Alamat “0x79119…” adalah alamat proksi untuk mengotorisasi transaksi pesanan saat menghubungkan ke dompet di halaman depan Vertex. Otorisasi ini dapat dicabut atau ditambahkan (melalui panggilan API).
Berikut ini adalah fokus artikel ini. Kami telah lama sibuk hanya untuk melakukan transaksi secara sederhana dan cepat di bursa terdesentralisasi.
Uji perdagangan yang lebih sederhana dan tempatkan pesanan batas normal.
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) + "`")
}
Perlu dicatat bahwa data yang disediakan oleh API Vertex berbeda dari konten yang ditampilkan di halaman depan Vertex, terutama karena perbedaan harga rata-rata dan laba rugi kepemilikan. Hal ini telah disampaikan kembali kepada tim Vertex dan dapat ditingkatkan dan diperbarui nanti.
4、Trigger Order
Karena Urutan Pemicu verteks tidak bergantung pada titik akhir, saat menggunakanexchange.IO
Saat menempatkan perintah bersyarat untuk suatu fungsi, Anda perlu menentukanTrigger: https://trigger.prod.vertexprotocol.com
, mari kita lanjutkan dengan operasi praktisnya.
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))
}
Di bawah titik akhir pemicu, ada juga:
Metode pemanggilannya serupa dengan Place Trigger Order, jadi saya tidak akan membahas detailnya di sini.
Tag sub-akun default adalah:default
, kita beralih ke tag khusus:subAcc02
。
function main() {
exchange.IO("subAccountTag", "subAcc02")
return exchange.GetAccount()
}
Saat mentransfer uang ke alamat sub-akun, Vertex akan benar-benar membuat sub-akun ini.
Nonce akun perlu ditanyakan dan dimasukkan ke dalam parameter antarmuka transfer sebagai parameter.
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))
}
Misalnya: 0xabc… sesuai dengan alamat sub-akun dengan tag default. 0xdef… sesuai dengan alamat sub-akun dengan tag subAcc02. 0x123… adalah alamat dompet.
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))
}
Perhatikan ketepatan 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))
}
Token Mint LP untuk pasangan perdaganganUSDT_USDC
Kolam pertukaran menambah likuiditas.
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))
}
Titik akhir antarmuka Websocket:wss://gateway.prod.vertexprotocol.com/v1/ws
。
[🚧🚧🚧ing…]
Pengujian di atas didasarkan pada kustodian terbaru. Anda perlu mengunduh kustodian terbaru untuk mendukung agregator Vertex DEX.
Terima kasih atas dukungan Anda dan terima kasih telah membaca.