avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Amalan Kuantitatif Pertukaran DEX (1) -- Panduan Pengguna dYdX v4

Dicipta dalam: 2024-12-24 17:09:32, dikemas kini pada: 2024-12-26 21:41:46
comments   0
hits   1049

[TOC]

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

Mukadimah

Dengan peningkatan pesat pertukaran terdesentralisasi (DEX) dalam bidang perdagangan mata wang kripto, pedagang kuantitatif secara beransur-ansur mula beralih kepada platform ini untuk perdagangan automatik yang cekap. Sebagai salah satu platform dagangan terdesentralisasi yang paling popular, dYdX menyediakan fungsi dagangan yang berkuasa dan menyokong dagangan kontrak kekal niaga hadapan Versi terbaharunya v4 mengoptimumkan prestasi dan pengalaman pengguna, menjadikannya pilihan pertama bagi ramai pedagang kuantitatif.

Artikel ini akan memperkenalkan cara mengamalkan dagangan kuantitatif pada dYdX v4, termasuk cara menggunakan APInya untuk berdagang, mendapatkan data pasaran dan mengurus akaun.

  • Uji penukaran persekitaran
  • Pertanyaan Maklumat Pasaran
  • Maklumat pesanan dan pertanyaan maklumat kedudukan
  • Buat pesanan
  • Pengurusan sub-akaun
  • Permintaan kaedah nod

dYdX v4 DEX

  • Halaman Apl dYdX Testnet

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

  • dandYdX v3Begitu juga, urus niaga menjana ganjaran, ganjarandYdXToken.

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

Maklumat sambungan dompet, log masuk dan konfigurasi

Pertukaran DEX protokol dYdX v3 sebelumnya telah di luar talian Alamat aplikasi dYdX v4 semasa ialah:

https://dydx.trade/trade/ETH-USD

Selepas membuka halaman Apl, terdapat butang untuk menyambung ke dompet di penjuru kanan sebelah atas Imbas kod QR untuk menyambung ke dompet.

Jika anda ingin menguji dan membiasakan diri dengan persekitaran rangkaian ujian terlebih dahulu, anda boleh menggunakan rangkaian ujian:

https://v4.testnet.dydx.exchange/trade/ETH-USD

Selain itu, klik butang sambung dompet di penjuru kanan sebelah atas, imbas kod QR untuk menyambung ke dompet dan sahkan tandatangan. Selepas dompet berjaya disambungkan, alamat dydx v4 akan dijana secara automatik Alamat ini akan dipaparkan di penjuru kanan sebelah atas halaman Apl akan muncul selepas mengkliknya. Ini termasuk operasi seperti cas semula, pengeluaran dan pemindahan. Salah satu perbezaan antara mainnet dYdX (persekitaran pengeluaran) dan testnet ialah apabila anda mengklik butang tambah nilai pada testnet, 300 USDC aset akan didepositkan secara automatik ke dalam faucet untuk ujian. Jika anda ingin melakukan transaksi sebenar di dYdX, anda perlu mendepositkan aset USDC Recharge juga sangat mudah dan serasi dengan berbilang aset dan rantai.

  • Alamat Akaun dYdX v4 Alamat akaun dYdX v4 diperoleh daripada alamat dompet Alamat akaun dYdX v4 kelihatan seperti ini:dydx1xxxxxxxxxxxxxxxxxxxxq2ge5jr4nzfeljxxxx, ialah alamat yang bermula dengan dydx1. Alamat ini boleh ditanya dalam peneroka blokchain.

  • Mnemonik Anda boleh mengeksport mnemonik akaun alamat dYdX semasa dengan mengklik butang “Eksport Kata Laluan” di menu penjuru kanan sebelah atas. Apabila menambah pertukaran pada platform FMZ, anda perlu mengkonfigurasi mnemonik ini.

Mnemonik boleh dikonfigurasikan terus pada platform FMZ atau disimpan secara tempatan pada penjaga Apabila menggunakan objek pertukaran dydx v4, kandungan fail yang merakam mnemonik akan dibaca, yang akan ditunjukkan dalam bahagian praktikal artikel ini.

Perbezaan antara Mainnet dan Testnet

Persekitaran testnet berbeza daripada persekitaran mainnet dalam beberapa aspek. Berikut adalah beberapa perbezaan mudah.

  • Pemindahan aset subakaun. Rangkaian utama mempunyai mekanisme pembersihan sub-akaun.subAccountNumber >= 128Jika sub-akaun dengan ID ini tidak mempunyai kedudukan, aset akan dikosongkan secara automatik ke sub-akaun dengan subAccountNumber 0. Semasa ujian, didapati bahawa rangkaian ujian tidak mempunyai mekanisme sedemikian (atau keadaan pencetus adalah berbeza dan ia tidak dicetuskan pada rangkaian ujian).

  • Beberapa nama token. Token dydx asli dinamakan berbeza: MainnetDYDX, rangkaian ujianDv4TNT

  • Konfigurasi alamat, seperti ID rantai, alamat nod, alamat pengindeks, dsb. Terdapat banyak nod dan konfigurasi, berikut adalah salah satu daripadanya:

    • Mainnet: Alamat pengindeks:https://indexer.dydx.trade ID rantai:dydx-mainnet-1 Nod REST:https://dydx-dao-api.polkachu.com:443

    • Testnet: Alamat pengindeks:https://indexer.v4testnet.dydx.exchange ID rantai:dydx-testnet-4 Nod REST:https://dydx-testnet-api.polkachu.com

Senibina Protokol dYdX v4

Protokol dYdX v4 dibangunkan berdasarkan ekosistem kosmos Kandungan berkaitan transaksi sistem dYdX v4 DEX terutamanya terdiri daripada dua bahagian:

  • Pengindeks yang bertanggungjawab untuk menanyakan maklumat pasaran, maklumat akaun, dsb.
  • mesej pesanan blockchain dydx, mesej pembatalan pesanan, mesej pemindahan, dsb.

Pengindeks

Perkhidmatan pengindeks menyediakan protokol REST dan Websocket.

  • Protokol REST Antara muka protokol REST menyokong pertanyaan maklumat pasaran, maklumat akaun, maklumat kedudukan, maklumat pesanan, dsb., dan telah dirangkumkan sebagai antara muka API bersatu pada platform FMZ.

  • Protokol WebSocket Pada platform FMZ, anda boleh menggunakan fungsi Dail untuk mencipta sambungan Websocket dan melanggan maklumat pasaran.

Perlu diingatkan bahawa pengindeks dydx v4 mempunyai masalah yang sama seperti pertukaran terpusat, iaitu, kemas kini data tidak begitu tepat pada masanya. Adalah disyorkan bahawa selepas operasi tertentu (Sleep(n)) Tunggu beberapa saat sebelum bertanya lagi.

Berikut ialah contoh menggunakan fungsi Dail untuk mencipta sambungan API Websocket dan melanggan data buku pesanan:

function dYdXIndexerWSconnManager(streamingPoint) {
    var self = {}
    self.base = streamingPoint
    self.wsThread = null

    // 订阅
    self.CreateWsThread = function (msgSubscribe) {
        self.wsThread = threading.Thread(function (streamingPoint, msgSubscribe) {
            // 订单薄
            var orderBook = null 

            // 更新订单薄
            var updateOrderbook = function(orderbook, update) {
                // 更新 bids
                if (update.bids) {
                    update.bids.forEach(([price, size]) => {
                        const priceFloat = parseFloat(price)
                        const sizeFloat = parseFloat(size)

                        if (sizeFloat === 0) {
                            // 删除价格为 price 的买单
                            orderbook.bids = orderbook.bids.filter(bid => parseFloat(bid.price) !== priceFloat)
                        } else {
                            // 更新或新增买单
                            orderbook.bids = orderbook.bids.filter(bid => parseFloat(bid.price) !== priceFloat)
                            orderbook.bids.push({price: price, size: size})
                            // 按价格降序排序
                            orderbook.bids.sort((a, b) => parseFloat(b.price) - parseFloat(a.price))
                        }
                    })
                }

                // 更新 asks
                if (update.asks) {
                    update.asks.forEach(([price, size]) => {
                        const priceFloat = parseFloat(price)
                        const sizeFloat = parseFloat(size)

                        if (sizeFloat === 0) {
                            // 删除价格为 price 的卖单
                            orderbook.asks = orderbook.asks.filter(ask => parseFloat(ask.price) !== priceFloat)
                        } else {
                            // 更新或新增卖单
                            orderbook.asks = orderbook.asks.filter(ask => parseFloat(ask.price) !== priceFloat)
                            orderbook.asks.push({price: price, size: size})
                            // 按价格升序排序
                            orderbook.asks.sort((a, b) => parseFloat(a.price) - parseFloat(b.price))
                        }
                    })
                }

                return orderbook
            }

            var conn = Dial(`${streamingPoint}|reconnect=true&payload=${JSON.stringify(msgSubscribe)}`)
            if (!conn) {
                Log("createWsThread failed.")
                return
            }
            while (true) {
                var data = conn.read()
                if (data) {
                    var msg = null                    
                    try {
                        msg = JSON.parse(data)
                        if (msg["type"] == "subscribed") {
                            orderBook = msg["contents"]
                            threading.currentThread().postMessage(orderBook)
                        } else if (msg["type"] == "channel_data") {
                            orderBook = updateOrderbook(orderBook, msg["contents"])
                            threading.currentThread().postMessage(orderBook)
                        }
                    } catch (e) {
                        Log("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
                    }
                }
            }
        }, streamingPoint, msgSubscribe)
    }

    // 监听
    self.Peek = function () {
        return self.wsThread.peekMessage()
    }

    return self
}

function main() {
    // real : wss://indexer.dydx.trade/v4/ws
    // simulate : wss://indexer.v4testnet.dydx.exchange/v4/ws

    var symbol = "ETH-USD"
    var manager = dYdXIndexerWSconnManager("wss://indexer.dydx.trade/v4/ws")
    manager.CreateWsThread({"type": "subscribe", "channel": "v4_orderbook", "id": symbol})

    var redCode = "#FF0000"
    var greenCode = "#006400"
    while (true) {
        var depthTbl = {type: "table", title: symbol + " / depth", cols: ["level", "price", "amount"], rows: []}
        var depth = manager.Peek()
        if (depth) {
            for (var i = 0; i < depth.asks.length; i++) {
                if (i > 9) {
                    break
                }
                var ask = depth.asks[i]
                depthTbl.rows.push(["asks " + (i + 1) + greenCode, ask.price + greenCode, ask.size + greenCode])
            }
            depthTbl.rows.reverse()

            for (var i = 0; i < depth.bids.length; i++) {
                if (i > 9) {
                    break
                }
                var bid = depth.bids[i]
                depthTbl.rows.push(["bids " + (i + 1) + redCode, bid.price + redCode, bid.size + redCode])
            }
        }
        LogStatus(_D(), "\n`" + JSON.stringify(depthTbl) + "`")
    }
}

siaran mesej nod rantai dYdX

Mesej yang paling biasa digunakan dalam urus niaga ialah mesej pesanan, mesej pembatalan pesanan dan mesej pemindahan.

  • Ringkasan mesej pesanan
  {
    "@type": "/dydxprotocol.clob.MsgPlaceOrder",
    "order": {
      "orderId": {
        "subaccountId": {
          "owner": "xxx"
        },
        "clientId": xxx,
        "orderFlags": 64,
        "clobPairId": 1
      },
      "side": "SIDE_BUY",
      "quantums": "2000000",
      "subticks": "3500000000",
      "goodTilBlockTime": 1742295981
    }
  }
  • Had Pesanan: Dalam fungsi pesanan yang terkandung pada platform FMZ, nilai orderFlags yang digunakan untuk pesanan had ialah:ORDER_FLAGS_LONG_TERM = 64 # 长期订单Mengikut batasan protokol DYDX v4, tempoh sah pesanan terpanjang digunakan, iaitu 90 hari (semua jenis pesanan pada DYDX v4 mempunyai tempoh sah).

  • Pesanan Pasaran: Dalam fungsi pesanan yang terkandung pada platform FMZ, nilai orderFlags yang digunakan oleh pesanan pasaran ialah:ORDER_FLAGS_SHORT_TERM = 0 # 短期订单, menurut cadangan protokol DYDX v4:

    // Recommend set to oracle price - 5% or lower for SELL, oracle price + 5% for BUY

    Oleh kerana ia bukan pesanan pasaran yang benar, harga oracle digunakan, tambah atau tolak 5% gelinciran sebagai pesanan pasaran. Tetapan tempoh sah bagi pesanan jangka pendek juga berbeza daripada pesanan jangka pendek menggunakan tempoh sah ketinggian blok Menurut pengesyoran dydx v4, ia ditetapkan kepada blok semasa + 10 ketinggian blok sebelum ia luput.

  • ID Pesanan: Memandangkan operasi pesanan dilakukan secara langsung pada rantai, tidak akan ada ID pesanan yang dijana oleh pengindeks selepas mesej disiarkan, dan pesanan pengindeks tidak boleh digunakan sebagai nilai pulangan fungsi pesanan platform untuk memastikan keunikan daripada ID pesanan dan ketepatan pertanyaan pesanan, pesanan pengindeks dikembalikan ID pesanan terdiri daripada maklumat berikut (dipisahkan koma):

    • Pasangan Dagangan
    • alamat akaun semasa dydx
    • Nombor subakaun (subakaunNombor)
    • clientId (dijana secara rawak)
    • clobPairId (ID simbol transaksi)
    • orderFlags
    • goodTilData (milisaat)
  • Ringkasan mesej pembatalan pesanan

  {
    "@type": "/dydxprotocol.clob.MsgCancelOrder",
    "orderId": {
      "subaccountId": {
        "owner": "xxx"
      },
      "clientId": 2585872024,
      "orderFlags": 64,
      "clobPairId": 1
    },
    "goodTilBlockTime": 1742295981
  }

ID pesanan yang dikembalikan oleh antara muka pesanan platform FMZ perlu dihantar masuk.

  • Pindahkan ringkasan mesej
  {
    "@type": "/dydxprotocol.sending.MsgCreateTransfer",
    "transfer": {
      "sender": {
        "owner": "xxx"
      },
      "recipient": {
        "owner": "xxx",
        "number": 128
      },
      "amount": "10000000"
    }
  }

Banyak sub-akaun boleh dibuat di bawah alamat dydx v4 semasa Sub-akaun dengan subAccountNumber 0 ialah sub-akaun yang pertama dibuat secara automatik ID subakaun dengan subAccountNumber lebih besar daripada atau sama dengan 128 digunakan untuk perdagangan kedudukan terpencil. yang memerlukan sekurang-kurangnya 20 aset USDC. Sebagai contoh, anda boleh pergi dari subAccountNumber 0 -> 128, atau dari subAccountNumber 128 -> 0. Pemindahan memerlukan penggunaan Yuran Gas. Yuran Gas boleh menggunakan token USDC dan dydx.

Amalan dYdX v4 platform FMZ

Kandungan di atas menerangkan secara ringkas beberapa butiran pembungkusan Seterusnya, mari kita praktikkan penggunaan khusus Di sini kita menggunakan rangkaian ujian dYdX v4 untuk demonstrasi pada asasnya sama dengan rangkaian utama, dan terdapat keran automatik untuk menerima aset ujian . Kustodian menggunakan Saya tidak akan pergi ke butiran tentang operasi, dan membuat ujian sebenar pada FMZ.

1. Tatarajah

Selepas berjaya menyambung ke Apl dYdX v4 menggunakan dompet mata wang kripto (saya menggunakan dompet imToken di sini), tuntut aset ujian anda dan kemudian eksport mnemonik untuk akaun dYdX v4 semasa anda (diperolehi daripada dompet anda).

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

Konfigurasikan mnemonik pada platform FMZ Di sini kami menggunakan kaedah fail tempatan untuk mengkonfigurasinya (anda juga boleh mengisi terus dan mengkonfigurasinya ke platform. Mnemonik dikonfigurasikan selepas penyulitan, bukan dalam teks biasa).

  • Fail mnemonic: mnemonic.txt

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

Letakkannya dalam direktori folder ID cakera sebenar di bawah direktori penjaga Sudah tentu, ia juga boleh diletakkan dalam direktori lain (laluan khusus perlu ditulis semasa konfigurasi).

  • Konfigurasikan pertukaran pada FMZ

https://www.fmz.com/m/platforms/add

Isikan kotak suntingan mnemonik:file:///mnemonic.txt, laluan sebenar yang sepadan ialah:托管者所在目录/logs/storage/594291

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

2. Tukar kepada rangkaian ujian dydx v4

function main() {
    // 切换测试链的索引器地址
    exchange.SetBase("https://indexer.v4testnet.dydx.exchange")

    // 切换测试链的ChainId 
    exchange.IO("chainId", "dydx-testnet-4")

    // 切换测试链的REST节点地址
    exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")

    // 读取账户信息测试
    Log(exchange.GetAccount()) 
}

Baca maklumat akaun rangkaian ujian:

{
	"Info": {
		"subaccounts": [{
			"address": "dydx1fzsndj35a26maujxff88q2ge5jr4nzfeljn2ez",
			"subaccountNumber": 0,
			"equity": "300.386228",
			"latestProcessedBlockHeight": "28193227",
			"freeCollateral": "300.386228",
			"openPerpetualPositions": {},
			"assetPositions": {
				"USDC": {
					"subaccountNumber": 0,
					"size": "300.386228",
					"symbol": "USDC",
					"side": "LONG",
					"assetId": "0"
				}
			},
			"marginEnabled": true,
			"updatedAtHeight": "28063818"
		}, {
			"address": "dydx1fzsndj35a26maujxff88q2ge5jr4nzfeljn2ez",
			"equity": "0",
			"freeCollateral": "0",
			"openPerpetualPositions": {},
			"marginEnabled": true,
			"subaccountNumber": 1,
			"assetPositions": {},
			"updatedAtHeight": "27770289",
			"latestProcessedBlockHeight": "28193227"
		}, {
			"equity": "0",
			"openPerpetualPositions": {},
			"marginEnabled": true,
			"updatedAtHeight": "28063818",
			"latestProcessedBlockHeight": "28193227",
			"subaccountNumber": 128,
			"freeCollateral": "0",
			"assetPositions": {},
			"address": "dydx1fzsndj35a26maujxff88q2ge5jr4nzfeljn2ez"
		}],
		"totalTradingRewards": "0.021744179376211564"
	},
	"Stocks": 0,
	"FrozenStocks": 0,
	"Balance": 300.386228,
	"FrozenBalance": 0,
	"Equity": 300.386228,
	"UPnL": 0
}

3. Siasatan maklumat pasaran

Tidak beralih ke rangkaian ujian, diuji dengan rangkaian utama

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"], 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])
    }
    LogStatus("`" + JSON.stringify(tbl) +  "`")
}

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

4. Buat pesanan

function main() {
    // 切换测试链的索引器地址
    exchange.SetBase("https://indexer.v4testnet.dydx.exchange")

    // 切换测试链的ChainId 
    exchange.IO("chainId", "dydx-testnet-4")

    // 切换测试链的REST节点地址
    exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")

    // 限价单,挂单
    var idSell = exchange.CreateOrder("ETH_USD.swap", "sell", 4000, 0.002)
    var idBuy = exchange.CreateOrder("ETH_USD.swap", "buy", 3000, 0.003)

    // 市价单
    var idMarket = exchange.CreateOrder("ETH_USD.swap", "buy", -1, 0.01)

    Log("idSell:", idSell)
    Log("idBuy:", idBuy)
    Log("idMarket:", idMarket)
}

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

Halaman Apl dYdX v4:

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

5. Maklumat pesanan

Rangkaian ujian membuat dua pesanan lebih awal, menguji mendapatkan pesanan belum selesai semasa dan membatalkan pesanan.

function main() {    
    // 切换测试链的索引器地址
    exchange.SetBase("https://indexer.v4testnet.dydx.exchange")

    // 切换测试链的ChainId 
    exchange.IO("chainId", "dydx-testnet-4")

    // 切换测试链的REST节点地址
    exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")

    var orders = exchange.GetOrders()
    Log("orders:", orders)
    for (var order of orders) {
        exchange.CancelOrder(order.Id, order)
        Sleep(2000)
    }

    var tbl = {type: "table", title: "test GetOrders", cols: ["Id", "Price", "Amount", "DealAmount", "AvgPrice", "Status", "Type", "Offset", "ContractType"], rows: []}
    for (var order of orders) {
        tbl.rows.push([order.Id, order.Price, order.Amount, order.DealAmount, order.AvgPrice, order.Status, order.Type, order.Offset, order.ContractType])
    }
    LogStatus("`" + JSON.stringify(tbl) +  "`")
}

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

6. Pertanyaan maklumat kedudukan

function main() {
    // 切换测试链的索引器地址
    exchange.SetBase("https://indexer.v4testnet.dydx.exchange")

    // 切换测试链的ChainId 
    exchange.IO("chainId", "dydx-testnet-4")

    // 切换测试链的REST节点地址
    exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")

    var p1 = exchange.GetPositions("USD.swap")
    var p2 = exchange.GetPositions("ETH_USD.swap")
    var p3 = exchange.GetPositions()
    var p4 = exchange.GetPositions("SOL_USD.swap")

    var tbls = []
    for (var positions of [p1, p2, p3, p4]) {
        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])
        } 
        tbls.push(tbl)
    }

    LogStatus("`" + JSON.stringify(tbls) +  "`")
}

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

7. Pengurusan sub-akaun

function main() {
    // 切换测试链的索引器地址
    exchange.SetBase("https://indexer.v4testnet.dydx.exchange")

    // 切换测试链的ChainId 
    exchange.IO("chainId", "dydx-testnet-4")

    // 切换测试链的REST节点地址
    exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")

    // subAccountNumber 0 -> 128 : 20 USDC , Gas Fee 为 adv4tnt 即 dydx token
    var ret = exchange.IO("transferUSDCToSubaccount", 0, 128, "adv4tnt", 20)  
    Log("ret:", ret)

    // 切换到子账号subAccountNumber 128 ,读取账户信息检查
    exchange.IO("subAccountNumber", 128)

    var account = exchange.GetAccount()
    Log("account:", account)
}

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

Beralih kepada subakaun yang subAccountNumbernya ialah 128 dan data yang dikembalikan oleh GetAccount ialah:

{
	"Info": {
		"subaccounts": [{
			"subaccountNumber": 0,
			"assetPositions": {
				"USDC": {
					"size": "245.696892",
					"symbol": "USDC",
					"side": "LONG",
					"assetId": "0",
					"subaccountNumber": 0
				}
			},
			"updatedAtHeight": "28194977",
			"latestProcessedBlockHeight": "28195008",
			"address": "dydx1fzsndj35a26maujxff88q2ge5jr4nzfeljn2ez",
			"freeCollateral": "279.5022142346",
			"openPerpetualPositions": {
				"ETH-USD": {
					"closedAt": null,
					"size": "0.01",
					"maxSize": "0.01",
					"exitPrice": null,
					"unrealizedPnl": "-0.17677323",
					"subaccountNumber": 0,
					"status": "OPEN",
					"createdAt": "2024-12-26T03:36:09.264Z",
					"createdAtHeight": "28194494",
					"sumClose": "0",
					"netFunding": "0",
					"market": "ETH-USD",
					"side": "LONG",
					"entryPrice": "3467.2",
					"realizedPnl": "0",
					"sumOpen": "0.01"
				}
			},
			"marginEnabled": true,
			"equity": "280.19211877"
		}, {
			"openPerpetualPositions": {},
			"assetPositions": {},
			"marginEnabled": true,
			"latestProcessedBlockHeight": "28195008",
			"address": "dydx1fzsndj35a26maujxff88q2ge5jr4nzfeljn2ez",
			"subaccountNumber": 1,
			"equity": "0",
			"freeCollateral": "0",
			"updatedAtHeight": "27770289"
		}, {
			"openPerpetualPositions": {},
			"updatedAtHeight": "28194977",
			"latestProcessedBlockHeight": "28195008",
			"address": "dydx1fzsndj35a26maujxff88q2ge5jr4nzfeljn2ez",
			"subaccountNumber": 128,
			"assetPositions": {
				"USDC": {
					"assetId": "0",
					"subaccountNumber": 128,
					"size": "20",
					"symbol": "USDC",
					"side": "LONG"
				}
			},
			"marginEnabled": true,
			"equity": "20",
			"freeCollateral": "20"
		}],
		"totalTradingRewards": "0.021886899964446858"
	},
	"Stocks": 0,
	"FrozenStocks": 0,
	"Balance": 20,
	"FrozenBalance": 0,
	"Equity": 20,
	"UPnL": 0
}

Dapat dilihat bahawa sub-akaun dengan subAccountNumber 128 telah memindahkan 20 USDC.

8. Dapatkan TxHash dan hubungi antara muka nod REST

Mengikut perintah itu, dapatkan TxHash dan uji kaedah IO memanggil nod REST

Bagaimana untuk mendapatkan TxHash pesanan? Objek pertukaran dydx akan cache TxHash, yang boleh ditanya menggunakan ID pesanan. Walau bagaimanapun, selepas strategi berhenti, peta cincang tx pesanan cache akan dikosongkan.

function main() {
    // 切换测试链的索引器地址
    exchange.SetBase("https://indexer.v4testnet.dydx.exchange")

    // 切换测试链的ChainId 
    exchange.IO("chainId", "dydx-testnet-4")

    // 切换测试链的REST节点地址
    exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")

    var id1 = exchange.CreateOrder("ETH_USD.swap", "buy", 3000, 0.002)
    var hash1 = exchange.IO("getTxHash", id1)
    Log("id1:", id1, "hash1:", hash1)

    var id2 = exchange.CreateOrder("ETH_USD.swap", "buy", 2900, 0.003)
    var hash2 = exchange.IO("getTxHash", id2)
    Log("id2:", id2, "hash2:", hash2)
    
    // 清空映射表可以使用:exchange.IO("getTxHash", "")
    var arr = [hash1, hash2]
    
    Sleep(10000)
    for (var txHash of arr) {
        // GET https://docs.cosmos.network   /cosmos/tx/v1beta1/txs/{hash}
        var ret = exchange.IO("api", "GET", "/cosmos/tx/v1beta1/txs/" + txHash)
        Log("ret:", ret)
    }
}

Amalan Kuantitatif Pertukaran DEX (1) – Panduan Pengguna dYdX v4

Mesej yang ditanya melalui TxHash:

var ret = exchange.IO(“api”, “GET”, “/cosmos/tx/v1beta1/txs/” + txHash)

Kandungannya terlalu panjang, jadi berikut adalah beberapa petikan untuk demonstrasi:

{
	"tx_response": {
		"codespace": "",
		"code": 0,
		"logs": [],
		"info": "",
		"height": "28195603",
		"data": "xxx",
		"raw_log": "",
		"gas_wanted": "-1",
		"gas_used": "0",
		"tx": {
			"@type": "/cosmos.tx.v1beta1.Tx",
			"body": {
				"messages": [{
					"@type": "/dydxprotocol.clob.MsgPlaceOrder",
					"order": {
						"good_til_block_time": 1742961542,
						"condition_type": "CONDITION_TYPE_UNSPECIFIED",
						"order_id": {
							"clob_pair_id": 1,
							"subaccount_id": {
								"owner": "xxx",
								"number": 0
							},
							"client_id": 2999181974,
							"order_flags": 64
						},
						"side": "SIDE_BUY",
						"quantums": "3000000",
						"client_metadata": 0,
						"conditional_order_trigger_subticks": "0",
						"subticks": "2900000000",
						"time_in_force": "TIME_IN_FORCE_UNSPECIFIED",
						"reduce_only": false
					}
				}],
				"memo": "FMZ",
				"timeout_height": "0",
				"extension_options": [],
				"non_critical_extension_options": []
			},
      ...

THE END

Ujian di atas adalah berdasarkan kustodian terkini Anda perlu memuat turun kustodian terkini untuk menyokong dYdX v4 DEX

Terima kasih atas sokongan anda dan terima kasih kerana membaca.