암호화폐 거래 분야에서 분산 거래소 (DEX) 의 급속한 증가로 인해 양적 거래자는 효율적인 자동 거래를 위해 점차 이러한 플랫폼으로 전환했습니다. 가장 인기있는 분산 거래 플랫폼 중 하나로서 dYdX는 강력한 거래 기능을 제공하고 미래 영구 계약 거래를 지원합니다. 최신 버전 v4는 성능과 사용자 경험을 최적화하여 많은 양적 거래자의 첫 번째 선택입니다.
이 문서에서는 dYdX v4에서 양적 거래를 수행하는 방법을 소개합니다. 거래, 시장 데이터를 획득 및 계정을 관리하는 데 API를 사용하는 방법을 포함합니다.
dYdX v3
이더리움의 경우, 거래는 보상을 만들어냅니다.dYdX
tokens.이전 dYdX v3 프로토콜 DEX 교환은 오프라인이었다. 현재 dYdX v4 앱 주소는:
앱 페이지를 열면 오른쪽 상단에 지갑에 연결하는 버튼이 있습니다. QR 코드를 스캔하여 지갑에 연결합니다.
먼저 테스트 네트워크 환경을 테스트하고 친숙하게 만들고 싶다면 테스트 네트워크를 사용할 수 있습니다.
또한, 오른쪽 상단에있는 연결 지갑 버튼을 클릭하고, 지갑을 연결하기 위해 코드를 스캔하고, 서명 확인합니다. 지갑이 성공적으로 연결된 후, dydx v4 주소가 자동으로 생성됩니다. 이 주소는 앱 페이지의 오른쪽 상단에 표시됩니다. 클릭하면 메뉴가 팝업됩니다. 재충전, 인출 및 전송과 같은 작업이 있습니다. dYdX 메인넷 (생산 환경) 과 테스트넷의 차이점 중 하나는 테스트넷에 재충전을 클릭하면 테스트용 탭을 사용하여 300 USDC 자산이 자동으로 충전된다는 것입니다. dYdX에서 실제 거래를 수행하려면 USDC 자산을 충전해야합니다. 재충전 또한 매우 편리하고 재충전하기 위해 여러 자산과 체인과 호환됩니다.
dYdX v4 계정 주소
dYdX v4 계정 주소는 지갑 주소에서 파생됩니다. dYdX v4 계정 주소는 다음과 같습니다:dydx1xxxxxxxxxxxxxxxxxxxxq2ge5jr4nzfeljxxxx
, dydx1으로 시작하는 주소입니다. 이 주소는 블록체인 탐색기에서 검색할 수 있습니다.
기억기술
현재 dYdX 주소 계정의 기억을 내보내기 위해 오른쪽 상단 메뉴의
엠네모닉은 FMZ 플랫폼에서 직접 구성하거나 도커에 로컬로 저장할 수 있습니다. dydx v4 교환 객체를 사용할 때, 엠네모닉을 기록하는 파일 콘텐츠가 읽히며, 이 문서의 실용적인 부분에서 입증 될 것입니다.
테스트 네트워크 환경은 메인 네트워크 환경과 몇 가지 측면에서 다릅니다. 몇 가지 간단한 차이점입니다.
subAccountNumber >= 128
, ID의 하위 계정에는 지점이 없다면, 자금은 하위 계정 0을 가진 하위 계정으로 자동으로 청소됩니다.
테스트 과정에서 테스트 네트워크에는 이러한 메커니즘이 없다는 것이 밝혀졌습니다 (또는 트리거 조건이 다르며 테스트 네트워크에서 트리거되지 않았습니다).DYDX
, 시험망Dv4TNT
메인넷:
인덱서 주소:https://indexer.dydx.trade
체인 ID:dydx-mainnet-1
REST 노드:https://dydx-dao-api.polkachu.com:443
테스트 네트워크:
인덱서 주소:https://indexer.v4testnet.dydx.exchange
체인 ID:dydx-testnet-4
REST 노드:https://dydx-testnet-api.polkachu.com
dYdX v4 프로토콜은 코스모스 생태계를 기반으로 개발되었습니다. dYdX v4 DEX 시스템 트랜잭션 관련 콘텐츠는 주로 두 부분으로 구성됩니다.
인덱서 서비스는 REST 및 웹소켓 프로토콜을 제공합니다.
REST 프로토콜 REST 프로토콜 인터페이스는 시장 정보 질의, 계정 정보, 위치 정보, 주문 정보 및 기타 질의를 지원하며 FMZ 플랫폼에서 통합 API 인터페이스로 캡슐화되었습니다.
웹소켓 프로토콜 FMZ 플랫폼에서는 다이얼 기능을 사용하여 웹소켓 연결을 만들고 시장 정보를 구독할 수 있습니다.
참고로 dydx v4의 인덱서는 중앙 집중식 거래소와 같은 문제를 가지고 있습니다. 즉, 데이터 업데이트는 너무 신속하지 않습니다. 예를 들어, 때로는 주문을 할 때 즉시 질의하면 주문을 찾을 수 없습니다. 주문 후 몇 초 동안 기다리는 것이 좋습니다.Sleep(n)
) 특정 작업은 문의 전에 수행됩니다.
여기에 웹소켓 API 연결을 만들고 주문록 데이터에 가입하기 위해 다이얼 함수를 사용하는 예가 있습니다:
function dYdXIndexerWSconnManager(streamingPoint) {
var self = {}
self.base = streamingPoint
self.wsThread = null
// subscription
self.CreateWsThread = function (msgSubscribe) {
self.wsThread = threading.Thread(function (streamingPoint, msgSubscribe) {
// Order book
var orderBook = null
// Update order book
var updateOrderbook = function(orderbook, update) {
// Update bids
if (update.bids) {
update.bids.forEach(([price, size]) => {
const priceFloat = parseFloat(price)
const sizeFloat = parseFloat(size)
if (sizeFloat === 0) {
// Delete the buy order with price
orderbook.bids = orderbook.bids.filter(bid => parseFloat(bid.price) !== priceFloat)
} else {
// Update or add a buy order
orderbook.bids = orderbook.bids.filter(bid => parseFloat(bid.price) !== priceFloat)
orderbook.bids.push({price: price, size: size})
// Sort by price descending
orderbook.bids.sort((a, b) => parseFloat(b.price) - parseFloat(a.price))
}
})
}
// Update asks
if (update.asks) {
update.asks.forEach(([price, size]) => {
const priceFloat = parseFloat(price)
const sizeFloat = parseFloat(size)
if (sizeFloat === 0) {
// Delete the sell order with price
orderbook.asks = orderbook.asks.filter(ask => parseFloat(ask.price) !== priceFloat)
} else {
// Update or add a sell order
orderbook.asks = orderbook.asks.filter(ask => parseFloat(ask.price) !== priceFloat)
orderbook.asks.push({price: price, size: size})
// Sort by price ascending
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)
}
// monitor
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) + "`")
}
}
거래에서 가장 일반적으로 사용되는 메시지는 주문 메시지, 주문 취소 메시지 및 전송 메시지입니다.
{
"@type": "/dydxprotocol.clob.MsgPlaceOrder",
"order": {
"orderId": {
"subaccountId": {
"owner": "xxx"
},
"clientId": xxx,
"orderFlags": 64,
"clobPairId": 1
},
"side": "SIDE_BUY",
"quantums": "2000000",
"subticks": "3500000000",
"goodTilBlockTime": 1742295981
}
}
제한 순서:
FMZ 플랫폼에 캡슐화된 명령 함수에서 제한 명령에 사용되는 orderFlags 값은:ORDER_FLAGS_LONG_TERM = 64 # Long-term order
dydx v4 프로토콜의 제한에 따라 가장 긴 주문 유효 기간은 90일입니다 ( dydx v4에서 모든 유형의 주문은 유효 기간이 있습니다).
시장 순서:
FMZ 플랫폼에 캡슐화된 오더 함수에서 시장 오더에 사용되는 orderFlags 값은:ORDER_FLAGS_SHORT_TERM = 0 # Short-term order
, dydx v4 프로토콜의 권고에 따라:
// 오라클 가격에 추천 설정 - 5% 또는 판매를 위해 낮은, 오라클 가격 + 5% 구매
실제 시장 오더가 아니기 때문에 오라클 가격, 더하기 또는 마이너스 5% 미끄러짐이 시장 오더로 사용됩니다. 단기 오더의 유효 기간은 장기 오더와도 다릅니다. 단기 오더는 블록 높이의 유효 기간을 사용합니다. 이는 dydx v4의 권고에 따라 현재 블록 + 10 블록 높이에 설정됩니다.
거래 쌍 dydx 현금 계좌 주소 하위 계정 번호 (하위 계정 번호) 클라이언트 아이디 (자유적으로 생성) clobPairId (거래 기호 ID) 순서 플래그 goodTilData (밀리초)
{
"@type": "/dydxprotocol.clob.MsgCancelOrder",
"orderId": {
"subaccountId": {
"owner": "xxx"
},
"clientId": 2585872024,
"orderFlags": 64,
"clobPairId": 1
},
"goodTilBlockTime": 1742295981
}
FMZ 플랫폼 주문 인터페이스에서 반환된 주문 ID를 입력해야 합니다.
{
"@type": "/dydxprotocol.sending.MsgCreateTransfer",
"transfer": {
"sender": {
"owner": "xxx"
},
"recipient": {
"owner": "xxx",
"number": 128
},
"amount": "10000000"
}
}
현재 dydx v4 주소를 통해 많은 하위 계정을 만들 수 있습니다. 하위 계정 번호 0을 가진 하위 계정은 자동으로 생성 된 첫 번째 하위 계정입니다. 하위 계정 번호 128보다 크거나 동등한 하위 계정 ID는 최소 20 USDC 자산을 필요로하는 고립된 위치 거래에 사용됩니다. 예를 들어, 당신은 하위 계정 번호 0 -> 128, 또는 하위 계정 번호 128 -> 0에서 이동할 수 있습니다. 전송은 가스 요금이 필요합니다. 가스 요금은 USDC 또는 dydx 토큰이 될 수 있습니다.
위의 내용은 일부 패키징 세부 사항을 간략하게 설명합니다. 다음으로, 구체적인 사용법을 연습해보겠습니다. 여기서 우리는 dYdX v4 테스트 네트워크를 시범용으로 사용합니다. 테스트 네트워크는 기본적으로 메인 네트워크와 동일하며 테스트 자산을 수신하는 자동 탭이 있습니다. 도커 배포 작업은 반복되지 않습니다. FMZ에서 라이브 트레이딩 테스트를 생성하십시오.
dYdX v4 앱에 암호화폐 지갑을 사용하여 성공적으로 연결한 후 (나는 여기 imToken 지갑을 사용합니다), 테스트 자산을 주장하고 현재 dYdX v4 계정 (지갑에서 파생) 에 대한 기억을 내보냅니다.
FMZ 플랫폼에서 메모닉을 구성합니다. 여기서 우리는 로컬 파일 방법을 사용하여 그것을 구성합니다. (당신은 또한 직접 채우고 플랫폼으로 구성할 수 있습니다. 메모닉은 단순한 텍스트가 아닌 암호화 후에 구성됩니다.)
도커 디렉토리 아래에 있는 라이브 트레이딩 ID 폴더 디렉토리에 배치합니다. 물론, 다른 디렉토리에도 배치할 수 있습니다 (특정 경로는 구성 중에 작성되어야 합니다).
기억 편집 상자를 채우세요:file:///mnemonic.txt
, 대응하는 실제 경로는:docker directory/logs/storage/594291
.
function main() {
// Switch the indexer address of the test chain
exchange.SetBase("https://indexer.v4testnet.dydx.exchange")
// Switch the ChainId of the test chain
exchange.IO("chainId", "dydx-testnet-4")
// Switch the REST node address of the test chain
exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")
// Read account information test
Log(exchange.GetAccount())
}
테스트 네트워크 계정 정보를 읽으십시오:
{
"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
}
테스트 네트워크로 전환하지 않았습니다. 주요 네트워크로 테스트했습니다.
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() {
// Switch the indexer address of the test chain
exchange.SetBase("https://indexer.v4testnet.dydx.exchange")
// Switch the ChainId of the test chain
exchange.IO("chainId", "dydx-testnet-4")
// Switch the REST node address of the test chain
exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")
// Limit order, pending order
var idSell = exchange.CreateOrder("ETH_USD.swap", "sell", 4000, 0.002)
var idBuy = exchange.CreateOrder("ETH_USD.swap", "buy", 3000, 0.003)
// Market order
var idMarket = exchange.CreateOrder("ETH_USD.swap", "buy", -1, 0.01)
Log("idSell:", idSell)
Log("idBuy:", idBuy)
Log("idMarket:", idMarket)
}
dYdX v4 앱 페이지:
테스트 네트워크는 두 개의 주문을 사전에 배치하고, 현재 미뤄진 주문을 테스트하고, 주문을 취소합니다.
function main() {
// Switch the indexer address of the test chain
exchange.SetBase("https://indexer.v4testnet.dydx.exchange")
// Switch the ChainId of the test chain
exchange.IO("chainId", "dydx-testnet-4")
// Switch the REST node address of the test chain
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() {
// Switch the indexer address of the test chain
exchange.SetBase("https://indexer.v4testnet.dydx.exchange")
// Switch the ChainId of the test chain
exchange.IO("chainId", "dydx-testnet-4")
// Switch the REST node address of the test chain
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() {
// Switch the indexer address of the test chain
exchange.SetBase("https://indexer.v4testnet.dydx.exchange")
// Switch the ChainId of the test chain
exchange.IO("chainId", "dydx-testnet-4")
// Switch the REST node address of the test chain
exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")
// subAccountNumber 0 -> 128 : 20 USDC, Gas Fee is adv4tnt, i.e. dydx token
// var ret = exchange.IO("transferUSDCToSubaccount", 0, 128, "adv4tnt", 20)
// Log("ret:", ret)
// Switch to subaccount subAccountNumber 128 and read account information to check
exchange.IO("subAccountNumber", 128)
var account = exchange.GetAccount()
Log("account:", account)
}
로그 정보:
하위 계정으로 전환하면 하위 계정 번호는 128이고, GetAccount가 반환하는 데이터는:
{
"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
}
부계산 128번과 부계산이 20달러를 송금한 것을 볼 수 있습니다.
명령에 따라, TxHash를 받아 REST 노드를 호출하는 IO 방법을 테스트
주문의 TxHash를 얻는 방법? 교환 객체 dydx는 TxHash를 캐시하여 주문 ID를 사용하여 쿼리를 할 수 있습니다. 그러나 전략이 중지되면 캐시 된 주문 tx 해시 맵이 삭제됩니다.
function main() {
// Switch the indexer address of the test chain
exchange.SetBase("https://indexer.v4testnet.dydx.exchange")
// Switch the ChainId of the test chain
exchange.IO("chainId", "dydx-testnet-4")
// Switch the REST node address of the test chain
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)
// To clear the mapping table, use: 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)
}
}
TxHash를 통해 검색된 메시지:
var ret =exchange.IO("api",
GET , /cosmos/tx/v1beta1/txs/ + txHash)
이 내용은 너무 길어서 몇 장을 보여드리겠습니다.
{
"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": []
},
...
위의 테스트는 최신 도커를 기반으로 합니다. dYdX v4 DEX를 지원하려면 최신 도커를 다운로드 해야 합니다.
지원해주셔서 감사합니다. 읽고 주셔서 감사합니다.