[TOC]
DEX取引所の定量的実践に関する第3回です。今回はVertexプロトコルの利用ガイドを紹介します。
従来の分散型取引所(DEX)の枠組みでは、定量取引を行うトレーダーは、自動マーケットメーカー(AMM)モデルの高いスリッページと低い執行効率を受け入れるか、クロスチェーン流動性の断片化と単一のデリバティブ機能という技術的なジレンマに陥るかのいずれかの妥協を迫られることがよくあります。 Vertex Protocol の出現は、「分散型 + 機関レベル」の融合実験を通じて、オンチェーンの定量戦略の境界を再定義しています。ここでは「2 つのうち 1 つを選択する」というジレンマはなく、速度、深さ、自由度の究極のバランスだけが求められます。
統合されたマルチチェーン流動性プール、ハイブリッドオーダーブック (CLOB)、組み込み通貨市場を統合した最初の DEX として、Vertex は「集中化された体験、分散化された魂」を中核とし、定量トレーダーに独自の道を開きます。
スピードと流動性の新たな定義
ブロックチェーン技術の継続的な進化により、従来の集中型取引所(CEX)と分散型取引所(DEX)の境界は徐々に曖昧になっています。 Vertex プラットフォームのハブとして、Vertex Edge は取引速度と流動性を再構築するだけでなく、クロスチェーン統合を通じて優れた注文マッチング技術と自己管理の利点を完璧に組み合わせ、世界中のトレーダーに新しい DeFi 体験をもたらします。
クロスチェーン流動性の統一:流動性の断片化を打破 従来の市場では、異なるチェーン間の流動性が断片化されていることが多く、その結果、トレーダーは最良の取引価格と深さを享受することができません。 Vertex Edge はこのような状況の中で誕生し、統一されたオーダーブック ネットワークを通じて複数のチェーン間で永続的な流動性を同期的に共有することを実現しました。 現在、Vertex Edgeは、Arbitrum、Base、Sei、Blast、Mantle、Sonic、Abstractを含む7つの主流チェーンで永久契約の流動性をカバーしているため、トレーダーは流動性の分散を心配する必要がなくなり、最良の価格で取引することができ、真にグローバル流動性のシームレスな接続を実現しています。
ハイブリッドオーダーブック取引:超高速マッチングとオンチェーン決済の完璧なバランス Vertex Edge はハイブリッド オーダーブック取引モデルを採用しており、そのコア テクノロジーには以下が含まれます。
オフチェーン オーダーブック マッチャー: 超高速のオフチェーン マッチング メカニズムを利用して、ほとんどの中央集権型取引所と同等のわずか 5 ~ 15 ミリ秒のレイテンシでオーダー マッチングを実現します。 オンチェーン リスク エンジンと AMM: リスク管理システムと自動マーケット メーカー (AMM) がサポートされている各チェーンに導入され、マッチング後に注文が安全かつ透明な方法で決済されることが保証されます。 このアーキテクチャは、非常に高速なトランザクション応答を保証するだけでなく、オンチェーン決済を通じてユーザーに分散型セキュリティを提供し、トレーダーが資産の自己管理の独立性を維持しながら CEX レベルのパフォーマンスを享受できるようにします。
マルチアカウント機能: 1 つのウォレットで複数のアカウントを管理し、資金をより効率的に配分します。 レバレッジスポットポジション: すべての資産を証拠金として使用して、より高い資本効率を実現します。 柔軟なリスク管理: 預金、ポジション、損益データを統一的に考慮し、リスクエクスポージャーを正確に制御します。
「頂点プロトコル」ページへのログインアドレス:
VertexはほとんどのDEXと同じです。dappにログインした後、承認のためにウォレットに接続する必要があります。Vertexのサブアカウントシステムは、ラベルに基づいて区別されます。ラベルはウォレットアドレスの計算に参加し、サブアカウントのウォレットアドレスを取得します。同時に、このアドレスは注文やその他の操作を行う権限を持ちます。
例えば、WalletConnect接続時のウォレットアドレスは次のとおりです:0x7a5ec2748e9065794491a8d29dcf3f9edb8d7c43
デフォルトのラベルは「default」で、計算されるサブアカウントのアドレスは次のようになります。0x7a5ec2748e9065794491a8d29dcf3f9edb8d7c4364656661756c740000000000
。デフォルトのタグは次のとおりです。64656661756c740000000000
。
Vertex は複数の資産のリチャージをサポートしています。通常は、USDC をマージンとしてリチャージし、接続されたウォレットを使用して直接トランザクションを転送することを選択します。なお、Vertex での出金、送金、トークンの送信、サブアカウントの移行などの操作には USDC が消費され、手数料も低くないため、これらの操作は慎重に行う必要があります。
別のチェーンに切り替える:
頂点では、異なるチェーンはノード、インデクサー、チェーンIDなどの異なる構成情報を持ちます。FMZカプセル化のデフォルトチェーンはArbitrum One
使用できますLog(HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=contracts"))
チェーンの ID、デプロイされたコントラクト情報などを照会します。
FMZ.COMにログイン後、取引所の設定ページで「暗号通貨」を選択し、Vertex Exchangeを選択すると、dappでウォレットプロキシキーを直接設定できます。もちろん、ウォレットの秘密鍵も設定できます。Vertexでは、インターフェースを使用してプロキシキーの認証/認証解除などの操作を管理できるため、さらに便利です。
プロキシキー:
たとえば、vertex DEX取引所のフロントエンドページでは、Chromeブラウザ(デバッグをオンにする)->アプリケーション->ローカルストレージ-> https://app.vertex-> vertex userSettings
Vertex Exchange を構成する
FMZ では 2 つの設定が必要です。1 つ目はウォレット アドレスです (署名に使用されるプロキシ キーのアドレスではなく、dapp に接続されたウォレット アドレスである必要があります)。 2 番目は署名に使用される秘密キーです (ウォレットの秘密キーまたはプロキシ キーを使用できます)。プロキシキーを使用できるため、設定されたウォレットアドレスとキーは必ずしもペアである必要はありません。
Vertexのサブアカウントシステムはタグで識別されます。FMZで使用されるデフォルトのタグはdefault
タグのメインアカウントを切り替える必要がある場合は、コード内で使用できます。
exchange.IO("subAccountTag", "default") // 切换到主子账号
exchange.IO("subAccountTag", "test01") // 切换到标签名为 test01 的子账号
交換構成情報を設定し、頂点インターフェースにアクセスできる管理プログラムを展開したら、実際の操作のためのコードの作成を開始できます。
テストにはメインのサブアカウント(タグ:defaultのサブアカウント)を使用し、Arbitrumネットワーク。
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
}
Vertexの契約タイプはUSDCベースの契約であり、マージンはUSDCであり、契約の価値は対応する通貨を表していることがわかります。たとえば、BTC_USDC.swap
つまり、BTC の USDC ベースの契約では、1 つの契約が BTC ポジションを表します。上記のコードは、契約市場情報を要求し、さまざまなコンテンツを出力する方法を示しています。
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()
})
}
頂点チャート
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) + "`")
}
資金調達レートサイクルは1時間です。
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")
}
最終リクエストによって返されるデータは次のとおりです。{"status":"success","data":{"max_order_size":"170536415320344899"},"request_type":"query_max_order_size"}
イーサリアム永久契約の現在のアカウント利用可能資産は価格3000で、売り注文の最大注文数量は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")
}
承認情報が見つかりました:
{“status”:“success”,“data”:{“linked_signer”:“0x79119…”},“request_type”:“query_linked_signer”} アドレス「0x79119…」は、Vertex フロントエンド ページのウォレットに接続するときに注文トランザクションを承認するためのプロキシ アドレスです。この承認は、API 呼び出しを通じて取り消したり追加したりできます。
以下がこの記事の焦点です。私たちは長い間、分散型取引所でシンプルかつ迅速に取引を行うことに取り組んできました。
より単純な取引をテストし、通常の指値注文を出します。
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) + "`")
}
なお、Vertex API によって提供されるデータは、主に平均保有価格と保有損益の違いにより、Vertex フロントエンド ページに表示される内容と異なることがあります。これは Vertex チームにフィードバックされており、後でアップグレードおよび更新される可能性があります。
4、Trigger Order
頂点のトリガー順序はエンドポイントに依存しないため、exchange.IO
関数に条件付き順序を設定する場合は、以下を指定する必要があります。Trigger: https://trigger.prod.vertexprotocol.com
では、実際の操作を続けましょう。
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))
}
トリガー エンドポイントの下には、次の項目もあります。
呼び出し方法は Place Trigger Order と似ているため、ここでは詳細には説明しません。
デフォルトのサブアカウントタグは次のとおりです。default
、カスタムタグに切り替えます。subAcc02
。
function main() {
exchange.IO("subAccountTag", "subAcc02")
return exchange.GetAccount()
}
サブアカウント アドレスに送金する場合、Vertex が実際にこのサブアカウントを作成します。
アカウントの nonce を照会し、転送インターフェースのパラメータにパラメータとして渡す必要があります。
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))
}
たとえば、0xabc… は、タグがデフォルトのサブアカウント アドレスに対応します。 0xdef… は、タグ subAcc02 を持つサブアカウント アドレスに対応します。 0x123…はウォレットアドレスです。
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))
}
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))
}
取引ペア用のLPトークンを発行するUSDT_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 = {
"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))
}
Websocket インターフェース エンドポイント:wss://gateway.prod.vertexprotocol.com/v1/ws
。
[🚧🚧🚧ing…]
上記のテストは最新のカストディアンに基づいています。Vertex DEX アグリゲーターをサポートするには、最新のカストディアンをダウンロードする必要があります。
ご支援、そしてご愛読ありがとうございました。