[TOC]
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.
dYdX Testing Web App trang
vàdYdX v3
Như vậy, giao dịch sẽ mang lại phần thưởng, phần thưởng.dYdX
Các token.
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à:
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:
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.
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.
subAccountNumber >= 128
Nế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).DYDX
Mạng lưới thử nghiệmDv4TNT
Trang chủ:
Địa chỉ chỉ mục:https://indexer.dydx.trade
Dòng ID:dydx-mainnet-1
REST:https://dydx-dao-api.polkachu.com:443
Mạng thử nghiệm:
Địa chỉ chỉ mục:https://indexer.v4testnet.dydx.exchange
Dòng ID:dydx-testnet-4
REST:https://dydx-testnet-api.polkachu.com
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:
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) + "`")
}
}
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:
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.
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.
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í).
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
Đặ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
Trong hộp chỉnh sửa phụ ký, hãy điền:file:///mnemonic.txt
Những con đường thực tế là:托管者所在目录/logs/storage/594291
。
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
}
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) + "`")
}
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)
}
DYdX v4 App
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) + "`")
}
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) + "`")
}
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)
}
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.
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)
}
}
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": []
},
...
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.