Tài nguyên đang được tải lên... tải...

DEX giao dịch định lượng thực hành ((1) -- dYdX v4 hướng dẫn sử dụng

Tác giả:Những nhà phát minh định lượng - những giấc mơ nhỏ, Tạo: 2024-12-24 17:09:32, Cập nhật: 2024-12-26 21:41:46

[TOC]

img

Lời mở đầu

Với sự nổi lên nhanh chóng của DEX trong lĩnh vực giao dịch tiền điện tử, các nhà giao dịch định lượng đã dần chuyển sang các nền tảng này để giao dịch tự động hiệu quả. DYdX là một trong những nền tảng giao dịch phân quyền phổ biến nhất, cung cấp các tính năng giao dịch mạnh mẽ, hỗ trợ giao dịch hợp đồng vĩnh cửu tương lai, phiên bản mới nhất của nó v4 cũng tối ưu hóa hiệu suất và trải nghiệm người dùng, trở thành lựa chọn hàng đầu của nhiều nhà giao dịch định lượng.

Bài viết này sẽ giới thiệu cách thực hành giao dịch định lượng trên dYdX v4, bao gồm cách sử dụng API của nó để giao dịch, thu thập dữ liệu thị trường và quản lý tài khoản.

  • Chuyển đổi môi trường thử nghiệm
  • Tìm kiếm thông tin thị trường
  • Thông tin đặt hàng, thông tin lưu trữ
  • Giao dịch
  • Quản lý tài khoản con
  • Yêu cầu phương thức nút

dYdX v4 DEX

  • dYdX Testing Web App trang

    img

  • dYdX v3Như vậy, giao dịch sẽ mang lại phần thưởng, phần thưởng.dYdXCác token.

    img

Kết nối ví, đăng nhập, thông tin cấu hình

Trước đó, giao dịch DEX theo giao thức dYdX v3 đã bị ngừng hoạt động, hiện tại địa chỉ ứng dụng dYdX v4 là:

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

Sau khi mở trang ứng dụng, ở góc trên bên phải có nút kết nối ví, mã quét kết nối ví.

Nếu bạn muốn làm quen với thử nghiệm môi trường testnet trước, bạn có thể sử dụng testnet:

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

Cũng như ở góc trên bên phải, nhấp vào nút kết nối ví, quét mã kết nối ví, xác nhận chữ ký. Sau khi kết nối ví thành công, ví sẽ tự động tạo ra một địa chỉ dydx v4, và góc trên bên phải của trang ứng dụng sẽ hiển thị địa chỉ này, sau khi nhấp vào, một menu sẽ xuất hiện. Nó có các hoạt động như nạp tiền, tiền báo giá, chuyển tiền.

  • Địa chỉ tài khoản dYdX v4 Địa chỉ tài khoản dYdX v4 được lấy từ địa chỉ ví, và địa chỉ tài khoản dYdX v4 trông giống như thế này:dydx1xxxxxxxxxxxxxxxxxxxxq2ge5jr4nzfeljxxxx, là địa chỉ bắt đầu của dydx1. Địa chỉ này có thể được truy vấn trong blockchain explorers.

  • Phụ đề Bạn có thể sử dụng nút "Export Password" ở góc trên cùng bên phải để xuất từ vựng của tài khoản địa chỉ dYdX hiện tại. Bạn cần cấu hình từ vựng này khi thêm sàn giao dịch trên nền tảng FMZ.

    Các từ vở có thể được cấu hình trực tiếp trên nền tảng FMZ, hoặc có thể được lưu trữ tại địa phương của người quản lý, khi sử dụng các đối tượng sàn giao dịch dydx v4, sẽ đọc nội dung tệp ghi từ vở, sẽ được trình bày trong phần thực hành của bài viết này.

Mạng chủ, Mạng thử khác nhau

Các môi trường web thử nghiệm có một số điểm khác biệt với môi trường web chính, sau đây là một danh sách ngắn gọn.

  • Các tài sản của tài khoản con đã được phân chia. Các tài khoản khác cũng có thể bị xóa.subAccountNumber >= 128Nếu tài khoản con của ID này không được lưu trữ, tài sản sẽ tự động được xóa sang tài khoản con SubAccountNumber là 0. Trong thử nghiệm, lưới thử nghiệm không có cơ chế này (hoặc các điều kiện kích hoạt khác nhau, không kích hoạt trong lưới thử nghiệm).
  • Một số tên mã thông báo. Dydx là một mã thông báo gốc có tên khác:DYDXMạng lưới thử nghiệmDv4TNT
  • Các cấu hình địa chỉ, ví dụ như mã số chuỗi, địa chỉ nút, địa chỉ chỉ mục, v.v.; Có rất nhiều nút và cấu hình, và đây là một trong số đó:
    • Trang chủ: Địa chỉ chỉ mục:https://indexer.dydx.tradeDòng ID:dydx-mainnet-1REST:https://dydx-dao-api.polkachu.com:443

    • Mạng thử nghiệm: Địa chỉ chỉ mục:https://indexer.v4testnet.dydx.exchangeDòng ID:dydx-testnet-4REST:https://dydx-testnet-api.polkachu.com

kiến trúc giao thức dYdX v4

DYdX v4 giao thức dựa trên phát triển sinh thái của cosmos, dYdX v4 DEX hệ thống giao dịch có 2 phần chính:

  • Chỉ mục chịu trách nhiệm tìm kiếm thông tin thị trường, thông tin tài khoản và nhiều thứ khác.
  • Dydx Blockchain: thông báo đặt hàng, thông báo rút tiền, thông báo chuyển tiền.

Chỉ mục

Dịch vụ chỉ mục cung cấp giao thức REST và giao thức Websocket.

  • REST protocol Giao diện giao thức REST hỗ trợ các truy vấn thông tin thị trường, thông tin tài khoản, thông tin nắm giữ, thông tin đặt hàng, và các giao diện API thống nhất trên nền tảng FMZ.

  • Giao thức WebSocket Trên nền tảng FMZ, bạn có thể sử dụng chức năng Dial để tạo kết nối Websocket, thông tin về thị trường đăng ký và nhiều thông tin khác.

Cần lưu ý một vấn đề mà chỉ mục của dydx v4 có cùng với tất cả các giao dịch tập trung, dữ liệu không được cập nhật kịp thời, ví dụ như đôi khi truy vấn ngay sau khi đặt hàng, có thể không truy vấn lệnh.Sleep(n)(Đợi vài giây và hỏi lại nhé.)

Dưới đây là một ví dụ về việc sử dụng hàm Dial để tạo kết nối API Websocket và đăng ký dữ liệu thô:

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

dYdX chuỗi nút tin tức phát sóng

Thông báo đặt hàng, thông báo rút tiền, thông báo chuyển tiền là những thông báo được sử dụng phổ biến nhất trong giao dịch.

  • Tóm tắt thông tin đặt hàng

    {
      "@type": "/dydxprotocol.clob.MsgPlaceOrder",
      "order": {
        "orderId": {
          "subaccountId": {
            "owner": "xxx"
          },
          "clientId": xxx,
          "orderFlags": 64,
          "clobPairId": 1
        },
        "side": "SIDE_BUY",
        "quantums": "2000000",
        "subticks": "3500000000",
        "goodTilBlockTime": 1742295981
      }
    }
    
    • Danh sách giới hạn: Chức năng đặt hàng dưới gói trên nền tảng FMZ, các OrderFlags được sử dụng để đặt hàng theo mức giá giới hạn là:ORDER_FLAGS_LONG_TERM = 64 # 长期订单Theo các hạn chế của giao thức dydx v4, thời hạn hợp lệ cho đơn đặt hàng dài nhất là 90 ngày được sử dụng (tất cả các loại đơn đặt hàng trên dydx v4 đều có thời hạn hợp lệ).

    • Danh sách giá: Chức năng đặt hàng dưới gói trên nền tảng FMZ, OrderFlags được sử dụng để đặt hàng theo giá thị trường là:ORDER_FLAGS_SHORT_TERM = 0 # 短期订单Theo đề xuất của Dydx v4 protocol:

      // Đề xuất đặt giá oracle - 5% hoặc thấp hơn cho SELL, giá oracle + 5% cho BUY

      Vì không phải là một danh sách giá thực sự, nên sử dụng giá máy báo trước, cộng với giá trượt giảm 5% như danh sách giá thị trường. Các lệnh ngắn hạn cũng được thiết lập với thời hạn hiệu lực khác với các lệnh dài hạn, các lệnh ngắn hạn được sử dụng với thời hạn hiệu lực cao của khối, theo đề xuất của dydx v4, được thiết lập là khối hiện tại + 10 khối cao và không hiệu lực.

    • Đơn đặt hàng: Vì các hoạt động đặt hàng được thực hiện trực tiếp trên chuỗi, không có ID đặt hàng được tạo ra bởi chỉ mục sau khi phát tin nhắn, không thể sử dụng lệnh chỉ mục làm giá trị trả lại của hàm đặt hàng trên nền tảng. Để đảm bảo tính độc đáo của ID đặt hàng và truy vấn chính xác, ID đặt hàng được trả lại được tạo thành bởi thông tin sau:

      • Giao dịch
      • Địa chỉ tài khoản hiện tại của dydx
      • Số tài khoản con (subaccount Number)
      • ClientId (được tạo ngẫu nhiên)
      • clobPairId (định dạng giao dịch)
      • orderTờ cờ
      • goodTilData ((ml giây)
  • Tóm lại tin tức

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

    Đơn đặt hàng cần phải được gửi vào giao diện đặt hàng của nền tảng FMZ.

  • Tin tức chuyển tiền

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

    Hiện tại, bạn có thể tạo nhiều tài khoản con dưới địa chỉ dydx v4, trong đó subAccountNumber là 0 là tài khoản con đầu tiên được tạo tự động, subAccountNumber cao hơn bằng 128 ID tài khoản con được sử dụng để giao dịch theo loại hàng, cần ít nhất 20 USD. Ví dụ, bạn có thể chuyển từ subAccountNumber 0 -> 128 hoặc từ subAccountNumber 128 -> 0. Việc chuyển đổi sẽ tiêu tốn phí Gas.

FMZ nền tảng dYdX v4 thực hành

Các nội dung trên chỉ ra một số chi tiết về bao bì, sau đó chúng ta cùng thực hành một số ứng dụng cụ thể, đây là một bản trình bày sử dụng mạng thử nghiệm dYdX v4, mạng thử nghiệm tương thích với mạng chủ, và có vòi nước tự động có thể lấy tài sản thử nghiệm, các hoạt động triển khai của người quản lý sẽ không còn nói thêm, tạo thử nghiệm thực tế trên FMZ.

1, cấu hình

Sau khi kết nối ứng dụng dYdX v4 thành công với ví tiền điện tử (tôi sử dụng ví imToken ở đây), nhận tài sản thử nghiệm, sau đó xuất các từ vựng hỗ trợ cho tài khoản dYdX v4 hiện tại (từ ví).

img

Thiết lập các từ vựng trong nền tảng FMZ, nơi chúng tôi sử dụng cấu hình theo cách tập tin cục bộ (cũng có thể điền trực tiếp, cấu hình lên nền tảng, từ vựng được cấu hình sau khi mã hóa, không phải là văn bản hiển thị).

  • 助记词文件:mnemonic.txt

    img

    Đặt trong thư mục thư mục ID ổ đĩa thực dưới thư mục quản trị viên, và tất nhiên cũng có thể đặt trong thư mục khác ((cần viết đường dẫn cụ thể khi cấu hình) ).

  • Thiết lập sàn giao dịch trên FMZ

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

    Trong hộp chỉnh sửa phụ ký, hãy điền:file:///mnemonic.txtNhững con đường thực tế là:托管者所在目录/logs/storage/594291

    img

2, chuyển sang mạng thử nghiệm 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()) 
}

Bạn có thể truy cập thông tin tài khoản của Testnet:

{
	"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. Tìm kiếm thông tin thị trường

Không chuyển sang mạng thử nghiệm, thử nghiệm trên mạng chủ

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

img

4 và dưới đây

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)
}

img

DYdX v4 App

img

5, Thông tin đặt hàng

Các mạng lưới thử nghiệm đã đăng hai đơn đặt hàng trước, kiểm tra lấy đơn đặt hàng hiện tại và hủy đơn đặt hàng.

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

img

6. Tìm kiếm thông tin lưu trữ

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

img

7. Quản lý tài khoản con

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)
}

img

Chuyển sang subAccountNumber là 128 và GetAccount trả về dữ liệu:

{
	"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
}

Bạn có thể thấy subAccountNumber là tài khoản con của 128 và được chuyển sang 20 USD.

8, truy cập TxHash, gọi giao diện REST

Theo yêu cầu, truy cập TxHash, thử nghiệm phương pháp IO gọi các nút REST

Dydx sẽ lưu trữ TxHash, có thể truy vấn bằng ID lệnh. Tuy nhiên, khi chính sách dừng lại, lệnh được lưu trữ sẽ được xóa.

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)
    }
}

img

Tin nhắn được truy vấn qua TxHash:

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

Những bài viết quá dài, một phần đã được cắt giảm:

{
	"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": []
			},
      ...

Sự kết thúc

Các bài kiểm tra trên, dựa trên trình quản lý mới nhất, cần tải xuống trình quản lý mới nhất để hỗ trợ dYdX v4 DEX

Xin cảm ơn vì đã ủng hộ, cảm ơn vì đã đọc.


Thêm nữa