DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

作成日:: 2025-02-09 16:05:08, 更新日:: 2025-02-19 10:37:07
comments   0
hits   195

[TOC]

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

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 プラットフォームは、ユーザーに統合されたクロスマージン管理機能を提供します。スポット、永久契約、組み込み資金調達市場など、すべての資産とポジションを統合されたマージン アカウントに統合できます。 この設計により、ユーザーは次のことが可能になります。

マルチアカウント機能: 1 つのウォレットで複数のアカウントを管理し、資金をより効率的に配分します。 レバレッジスポットポジション: すべての資産を証拠金として使用して、より高い資本効率を実現します。 柔軟なリスク管理: 預金、ポジション、損益データを統一的に考慮し、リスクエクスポージャーを正確に制御します。

頂点を接続

「頂点プロトコル」ページへのログインアドレス:

https://app.vertexprotocol.com/

ウォレットを接続する

VertexはほとんどのDEXと同じです。dappにログインした後、承認のためにウォレットに接続する必要があります。Vertexのサブアカウントシステムは、ラベルに基づいて区別されます。ラベルはウォレットアドレスの計算に参加し、サブアカウントのウォレットアドレスを取得します。同時に、このアドレスは注文やその他の操作を行う権限を持ちます。

例えば、WalletConnect接続時のウォレットアドレスは次のとおりです:0x7a5ec2748e9065794491a8d29dcf3f9edb8d7c43デフォルトのラベルは「default」で、計算されるサブアカウントのアドレスは次のようになります。0x7a5ec2748e9065794491a8d29dcf3f9edb8d7c4364656661756c740000000000。デフォルトのタグは次のとおりです。64656661756c740000000000

Vertex は複数の資産のリチャージをサポートしています。通常は、USDC をマージンとしてリチャージし、接続されたウォレットを使用して直接トランザクションを転送することを選択します。なお、Vertex での出金、送金、トークンの送信、サブアカウントの移行などの操作には USDC が消費され、手数料も低くないため、これらの操作は慎重に行う必要があります。

別のチェーンに切り替える:

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

頂点では、異なるチェーンはノード、インデクサー、チェーンIDなどの異なる構成情報を持ちます。FMZカプセル化のデフォルトチェーンはArbitrum One使用できますLog(HttpQuery("https://gateway.prod.vertexprotocol.com/v1/query?type=contracts"))チェーンの ID、デプロイされたコントラクト情報などを照会します。

FMZで設定する

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 的子账号

FMZで練習する

交換構成情報を設定し、頂点インターフェースにアクセスできる管理プログラムを展開したら、実際の操作のためのコードの作成を開始できます。

テストにはメインのサブアカウント(タグ:defaultのサブアカウント)を使用し、Arbitrumネットワーク。

市場状況とチェーン情報

  1. 契約市場情報を入手する
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
}

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

Vertexの契約タイプはUSDCベースの契約であり、マージンはUSDCであり、契約の価値は対応する通貨を表していることがわかります。たとえば、BTC_USDC.swapつまり、BTC の USDC ベースの契約では、1 つの契約が BTC ポジションを表します。上記のコードは、契約市場情報を要求し、さまざまなコンテンツを出力する方法を示しています。

  1. 深度情報(注文書)を取得する
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) + "`")
}

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

  1. 市場取引の注文フロー情報
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) + "`")
}

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

  1. Kラインデータ
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()
    })
}

頂点チャート DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

FMZ戦略作戦図 DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

  1. 資金調達率
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) + "`")
}

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

資金調達レートサイクルは1時間です。

  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")
}
  • スケーリング係数はほとんどの場合 1e18 なので、300000000000000000000000 は 3000 USDC になります。
  • product_id=4 取引商品ID、4はEthereum契約、ETH_USDC.swap
  • 送信者は、ウォレット アドレスとサブアカウント タグから計算されたサブアカウント アドレスです。

最終リクエストによって返されるデータは次のとおりです。{"status":"success","data":{"max_order_size":"170536415320344899"},"request_type":"query_max_order_size"} イーサリアム永久契約の現在のアカウント利用可能資産は価格3000で、売り注文の最大注文数量は0.17 ETHであることがわかります。

  1. ウォレット認証のプロキシキー情報を照会する

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 呼び出しを通じて取り消したり追加したりできます。

貿易

以下がこの記事の焦点です。私たちは長い間、分散型取引所でシンプルかつ迅速に取引を行うことに取り組んできました。

  1. 注文する

より単純な取引をテストし、通常の指値注文を出します。

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) +  "`")
}

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

  1. 注文のキャンセル
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()
}

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

  1. クエリの位置
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) +  "`")
}

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

なお、Vertex API によって提供されるデータは、主に平均保有価格と保有損益の違いにより、Vertex フロントエンド ページに表示される内容と異なることがあります。これは Vertex チームにフィードバックされており、後でアップグレードおよび更新される可能性があります。

4、Trigger Order

頂点のトリガー順序はエンドポイントに依存しないため、exchange.IO関数に条件付き順序を設定する場合は、以下を指定する必要があります。Trigger: https://trigger.prod.vertexprotocol.comでは、実際の操作を続けましょう。

  • nonce: 次のトリガー オーダーに nonce パラメータを渡す必要があります。Vertex には計算要件があるため、使いやすさを考慮して、計算された nonce を取得するメソッドがカプセル化中に設計されています。
  • 有効期限: 有効期限パラメータにも同じ要件が適用され、計算された有効期限も取得する必要があります。
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))
}

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

トリガー エンドポイントの下には、次の項目もあります。

  • リストトリガー注文インターフェース
  • Cancel Trigger Orders
  • Cancel Product Trigger Orders

呼び出し方法は Place Trigger Order と似ているため、ここでは詳細には説明しません。

サブアカウント管理

  1. サブアカウントタグを切り替える

デフォルトのサブアカウントタグは次のとおりです。default、カスタムタグに切り替えます。subAcc02

function main() {
    exchange.IO("subAccountTag", "subAcc02")

    return exchange.GetAccount()
}

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

DEX Exchange 定量的実践 (3) - Vertex Protocol ユーザーガイド

サブアカウント アドレスに送金する場合、Vertex が実際にこのサブアカウントを作成します。

  1. Vertexサブアカウントに資金を送金する

アカウントの nonce を照会し、転送インターフェースのパラメータにパラメータとして渡す必要があります。

https://gateway.prod.vertexprotocol.com/v1/query?type=nonces&address=0x6B3f11d807809B0b1E5e3243df04a280d9F94bF4

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…はウォレットアドレスです。

流動性トークンの引き出し、発行/破棄など

  1. Vertexからウォレットにコインを引き出す
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の精度に注意してください。

  1. LPの鋳造
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交換プールは流動性を追加します。

  1. LPを破壊する
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 インターフェース

Websocket インターフェース エンドポイント:wss://gateway.prod.vertexprotocol.com/v1/ws

[🚧🚧🚧ing…]

END

上記のテストは最新のカストディアンに基づいています。Vertex DEX アグリゲーターをサポートするには、最新のカストディアンをダウンロードする必要があります。

ご支援、そしてご愛読ありがとうございました。