संसाधन लोड हो रहा है... लोड करना...

डीईएक्स एक्सचेंजों का मात्रात्मक अभ्यास (1) -- dYdX v4 उपयोगकर्ता गाइड

लेखक:FMZ~Lydia, बनाया गयाः 2024-12-26 15:32:24, अद्यतनः 2024-12-26 17:36:31

प्रस्तावना

क्रिप्टोक्यूरेंसी ट्रेडिंग के क्षेत्र में विकेन्द्रीकृत एक्सचेंजों (डीईएक्स) के तेजी से उदय के साथ, मात्रात्मक व्यापारी कुशल स्वचालित ट्रेडिंग के लिए धीरे-धीरे इन प्लेटफार्मों की ओर रुख कर रहे हैं। सबसे लोकप्रिय विकेन्द्रीकृत ट्रेडिंग प्लेटफार्मों में से एक के रूप में, डीवाईडीएक्स शक्तिशाली ट्रेडिंग कार्य प्रदान करता है और वायदा स्थायी अनुबंध व्यापार का समर्थन करता है। इसका नवीनतम संस्करण वी 4 प्रदर्शन और उपयोगकर्ता अनुभव को अनुकूलित करता है, जिससे यह कई मात्रात्मक व्यापारियों के लिए पहली पसंद बन जाता है।

यह लेख dYdX v4 पर मात्रात्मक व्यापार का अभ्यास करने का परिचय देगा, जिसमें व्यापार करने, बाजार डेटा प्राप्त करने और खातों का प्रबंधन करने के लिए इसके एपीआई का उपयोग करना शामिल है।

  • परीक्षण वातावरण स्विच करना
  • बाज़ार की जानकारी पूछताछ
  • आदेश सूचना और स्थिति सूचना क्वेरी
  • आदेश दें
  • उप-खाता प्रबंधन
  • नोड विधि अनुरोध

dYdX v4 DEX

  • dYdX टेस्टनेट एप पेज

img

  • जैसा किdYdX v3एथेरियम के साथ, व्यापार पुरस्कार उत्पन्न करता है, जो पुरस्कार हैंdYdX tokens.

वॉलेट कनेक्शन, लॉगिन और कॉन्फ़िगरेशन जानकारी

पिछला dYdX v3 प्रोटोकॉल DEX एक्सचेंज ऑफ़लाइन था. वर्तमान dYdX v4 ऐप पता हैः

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

ऐप पेज खोलने के बाद, ऊपर दाएं कोने में वॉलेट से कनेक्ट करने के लिए एक बटन है। वॉलेट से कनेक्ट करने के लिए क्यूआर कोड स्कैन करें।

यदि आप परीक्षण करना चाहते हैं और पहले परीक्षण नेटवर्क वातावरण से परिचित होना चाहते हैं, तो आप परीक्षण नेटवर्क का उपयोग कर सकते हैंः

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

इसके अलावा, ऊपरी दाएं कोने में वॉलेट कनेक्ट बटन पर क्लिक करें, वॉलेट को कनेक्ट करने के लिए कोड को स्कैन करें, और हस्ताक्षर की पुष्टि करें। वॉलेट को सफलतापूर्वक कनेक्ट करने के बाद, एक dydx v4 पता स्वचालित रूप से उत्पन्न हो जाएगा। यह पता ऐप पेज के ऊपरी दाएं कोने में प्रदर्शित होगा। इसे क्लिक करें और एक मेनू पॉप अप होगा। रिचार्ज, निकासी और स्थानांतरण जैसे ऑपरेशन हैं। dYdX मेइननेट (उत्पादन वातावरण) और टेस्टनेट के बीच एक अंतर यह है कि जब आप टेस्टनेट पर रिचार्ज पर क्लिक करते हैं, तो परीक्षण के लिए नल का उपयोग करके 300 USDC संपत्ति स्वचालित रूप से चार्ज हो जाएगी। यदि आप dYdX पर वास्तविक लेनदेन करना चाहते हैं, तो आपको USDC संपत्ति चार्ज करने की आवश्यकता है। रिचार्ज भी बहुत सुविधाजनक है और रिचार्ज के लिए कई संपत्ति और श्रृंखलाओं के साथ संगत है।

  • dYdX v4 खाता पता dYdX v4 खाता पता वॉलेट पता से व्युत्पन्न होता है. dYdX v4 खाता पता इस तरह दिखता हैःdydx1xxxxxxxxxxxxxxxxxxxxq2ge5jr4nzfeljxxxx, जो कि dydx1 से शुरू होने वाला एक पता है। यह पता ब्लॉकचेन एक्सप्लोरर में क्वेरी किया जा सकता है।

  • स्मरणिकी आप वर्तमान dYdX पते खाते के mnemonics को निर्यात करने के लिए ऊपरी दाएं कोने मेनू में Export Password बटन का उपयोग कर सकते हैं। जब FMZ प्लेटफॉर्म पर एक एक्सचेंज जोड़ते हैं, तो आपको इस mnemonic को कॉन्फ़िगर करने की आवश्यकता होती है।

एमनेमोनिक्स को सीधे एफएमजेड प्लेटफॉर्म पर कॉन्फ़िगर किया जा सकता है या डॉकर पर स्थानीय रूप से सहेजा जा सकता है। जब dydx v4 एक्सचेंज ऑब्जेक्ट का उपयोग किया जाता है, तो एमनेमोनिक्स को रिकॉर्ड करने वाली फ़ाइल सामग्री पढ़ी जाएगी, जिसे इस लेख के व्यावहारिक भाग में प्रदर्शित किया जाएगा।

मुख्य नेटवर्क और परीक्षण नेटवर्क के बीच अंतर

टेस्टनेट वातावरण कुछ पहलुओं में मेननेट वातावरण से भिन्न होता है। यहाँ कुछ सरल अंतर हैं।

  • उप-खाता परिसंपत्ति हस्तांतरण। मुख्य नेटवर्क में एक उप-खाता सफाई तंत्र है।subAccountNumber >= 128, यदि आईडी के उप-खाते में कोई स्थिति नहीं है, तो संपत्ति स्वचालित रूप से उस उप-खाते में साफ की जाएगी जिसका उप-खाते संख्या 0 है। परीक्षण के दौरान, यह पाया गया कि परीक्षण नेटवर्क में यह तंत्र नहीं है (या ट्रिगरिंग स्थितियां भिन्न हैं और यह परीक्षण नेटवर्क में ट्रिगर नहीं किया गया है) ।
  • कुछ प्रतीकात्मक नाम। मूल टोकन dydx के अलग-अलग नाम हैंः mainnetDYDX, परीक्षण जालDv4TNT
  • पता विन्यास, जैसे चेन आईडी, नोड पता, इंडेक्सर पता आदि। वहाँ कई नोड्स और विन्यास हैं, यहाँ उनमें से एक हैः

मुख्य नेटवर्कः अनुक्रमणिका पताःhttps://indexer.dydx.tradeचेन आईडीःdydx-mainnet-1REST नोडःhttps://dydx-dao-api.polkachu.com:443

परीक्षण जालः अनुक्रमणिका पताःhttps://indexer.v4testnet.dydx.exchangeचेन आईडीःdydx-testnet-4REST नोडःhttps://dydx-testnet-api.polkachu.com

dYdX v4 प्रोटोकॉल आर्किटेक्चर

dYdX v4 प्रोटोकॉल को cosmos पारिस्थितिकी तंत्र के आधार पर विकसित किया गया है। dYdX v4 DEX प्रणाली लेनदेन से संबंधित सामग्री में मुख्य रूप से दो भाग होते हैंः

  • एक सूचकांककर्ता जो टिकर जानकारी, खाता जानकारी आदि की क्वेरी करने के लिए जिम्मेदार होता है।
  • dydx ब्लॉकचेन आदेश संदेश, आदेश रद्द संदेश, स्थानांतरण संदेश, आदि

अनुक्रमणिका

सूचकांक सेवा REST और Websocket प्रोटोकॉल प्रदान करती है.

  • REST प्रोटोकॉल REST प्रोटोकॉल इंटरफेस बाजार जानकारी क्वेरी, खाता जानकारी, स्थिति जानकारी, आदेश जानकारी और अन्य क्वेरी का समर्थन करता है, और FMZ प्लेटफॉर्म पर एक एकीकृत एपीआई इंटरफ़ेस के रूप में कैप्सूलित किया गया है।

  • वेबसॉकेट प्रोटोकॉल एफएमजेड प्लेटफॉर्म पर, आप डायल फ़ंक्शन का उपयोग वेबसॉकेट कनेक्शन बनाने और बाजार की जानकारी की सदस्यता लेने के लिए कर सकते हैं।

यह ध्यान दिया जाना चाहिए कि dydx v4 के सूचकांक में केंद्रीकृत एक्सचेंजों के समान समस्या है, अर्थात डेटा अपडेट इतने समय पर नहीं होते हैं। उदाहरण के लिए, कभी-कभी आप ऑर्डर देने के तुरंत बाद इसे क्वेरी करने में सक्षम नहीं हो सकते हैं। ऑर्डर देने के बाद कुछ सेकंड तक इंतजार करने की सिफारिश की जाती है (Sleep(n)) पूछताछ से पहले कुछ कार्य।

वेबसॉकेट एपीआई कनेक्शन बनाने और ऑर्डर बुक डेटा की सदस्यता लेने के लिए डायल फ़ंक्शन का उपयोग करने का एक उदाहरण यहां दिया गया हैः

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

dYdX चेन नोड संदेश प्रसारण

लेन-देन में सबसे अधिक इस्तेमाल किए जाने वाले संदेश ऑर्डर संदेश, ऑर्डर रद्दीकरण संदेश और स्थानांतरण संदेश हैं।

  • आदेश संदेश सारांश
{
  "@type": "/dydxprotocol.clob.MsgPlaceOrder",
  "order": {
    "orderId": {
      "subaccountId": {
        "owner": "xxx"
      },
      "clientId": xxx,
      "orderFlags": 64,
      "clobPairId": 1
    },
    "side": "SIDE_BUY",
    "quantums": "2000000",
    "subticks": "3500000000",
    "goodTilBlockTime": 1742295981
  }
}
  • सीमा क्रम: एफएमजेड प्लेटफॉर्म पर समाहित ऑर्डर फ़ंक्शन में, सीमा आदेशों के लिए उपयोग किए जाने वाले ऑर्डरफ़्लैग का मान हैःORDER_FLAGS_LONG_TERM = 64 # Long-term order• dydx v4 प्रोटोकॉल की सीमाओं के अनुसार, सबसे लंबी ऑर्डर वैधता अवधि का उपयोग किया जाता है, जो 90 दिन है ( dydx v4 पर सभी प्रकार के ऑर्डर की वैधता अवधि होती है) ।

  • बाज़ार का क्रम: एफएमजेड प्लेटफॉर्म पर समाहित ऑर्डर फ़ंक्शन में, मार्केट ऑर्डर के लिए उपयोग किया जाने वाला ऑर्डरफ़्लैग मान हैःORDER_FLAGS_SHORT_TERM = 0 # Short-term order, dydx v4 प्रोटोकॉल की सिफारिशों के अनुसारः

// ओरेकल मूल्य पर सेट की सिफारिश - 5% या कम के लिए बेचने के लिए, ओरेकल मूल्य + 5% के लिए खरीदें

चूंकि यह एक वास्तविक बाजार आदेश नहीं है, इसलिए बाजार आदेश के रूप में ओरेकल मूल्य का उपयोग किया जाता है, प्लस या माइनस 5% स्लिप। अल्पकालिक आदेशों की वैधता अवधि भी दीर्घकालिक आदेशों से अलग होती है। अल्पकालिक आदेश ब्लॉक ऊंचाई वैधता अवधि का उपयोग करते हैं, जो dydx v4 की सिफारिश के अनुसार वर्तमान ब्लॉक + 10 ब्लॉक ऊंचाई पर सेट है।

  • आदेश आईडीः चूंकि ऑर्डर ऑपरेशन सीधे चेन पर किया जाता है, इसलिए संदेश प्रसारित होने के बाद इंडेक्सर द्वारा उत्पन्न कोई ऑर्डर आईडी नहीं होगी, और इंडेक्सर ऑर्डर का उपयोग प्लेटफॉर्म ऑर्डर फ़ंक्शन के रिटर्न मान के रूप में नहीं किया जा सकता है। ऑर्डर आईडी की विशिष्टता और ऑर्डर क्वेरी की सटीकता सुनिश्चित करने के लिए, लौटाए गए ऑर्डर आईडी में निम्नलिखित जानकारी (अंश-विभाजित) शामिल हैः

व्यापारिक जोड़े dydx चालू खाता पता उप-खाता संख्या (उप-खाता संख्या) क्लाइंटआईडी (जैविक रूप से उत्पन्न) clobPairId (लेनदेन प्रतीक आईडी) आदेशध्वज goodTilData (मिलीसेकंड)

  • आदेश रद्द करने के संदेश का सारांश
{
  "@type": "/dydxprotocol.clob.MsgCancelOrder",
  "orderId": {
    "subaccountId": {
      "owner": "xxx"
    },
    "clientId": 2585872024,
    "orderFlags": 64,
    "clobPairId": 1
  },
  "goodTilBlockTime": 1742295981
}

एफएमजेड प्लेटफॉर्म के आदेश इंटरफ़ेस द्वारा लौटाई गई ऑर्डर आईडी को पास किया जाना चाहिए।

  • स्थानांतरण संदेश सारांश
{
  "@type": "/dydxprotocol.sending.MsgCreateTransfer",
  "transfer": {
    "sender": {
      "owner": "xxx"
    },
    "recipient": {
      "owner": "xxx",
      "number": 128
    },
    "amount": "10000000"
  }
}

वर्तमान dydx v4 पते के तहत कई उप-खाता बनाए जा सकते हैं। उप-खाता संख्या 0 के साथ उप-खाता स्वचालित रूप से बनाया गया पहला उप-खाता है। उप-खाता आईडी के साथ उप-खाता संख्या 128 से अधिक या बराबर है जो अलग-अलग स्थिति व्यापार के लिए उपयोग किया जाता है, जिसके लिए कम से कम 20 USDC संपत्ति की आवश्यकता होती है। उदाहरण के लिए, आप उपखाते संख्या 0 -> 128 से जा सकते हैं, या उपखाते संख्या 128 -> 0 से। स्थानांतरण के लिए गैस शुल्क की आवश्यकता होती है। गैस शुल्क USDC या dydx टोकन हो सकते हैं।

एफएमजेड प्लेटफार्म dYdX v4 अभ्यास

उपरोक्त सामग्री संक्षेप में कुछ पैकेजिंग विवरणों की व्याख्या करती है। अगला, आइए विशिष्ट उपयोग का अभ्यास करें। यहां हम प्रदर्शन के लिए dYdX v4 परीक्षण नेटवर्क का उपयोग करते हैं। परीक्षण नेटवर्क मूल रूप से मुख्य नेटवर्क के समान है, और परीक्षण संपत्ति प्राप्त करने के लिए एक स्वचालित नल है। डॉकर तैनाती ऑपरेशन दोहराया नहीं जाएगा। एफएमजेड पर एक लाइव ट्रेडिंग परीक्षण बनाएं।

1. संरचना

dYdX v4 एप्लिकेशन से सफलतापूर्वक कनेक्ट करने के बाद क्रिप्टोक्यूरेंसी वॉलेट का उपयोग करके (मैं यहां imToken वॉलेट का उपयोग करता हूं), अपनी परीक्षण संपत्ति का दावा करें और फिर अपने वर्तमान dYdX v4 खाते के लिए mnemonic निर्यात करें (आपके वॉलेट से व्युत्पन्न) ।

img

एफएमजेड प्लेटफॉर्म पर mnemonic को कॉन्फ़िगर करें. यहाँ हम इसे कॉन्फ़िगर करने के लिए स्थानीय फ़ाइल विधि का उपयोग करते हैं (आप इसे सीधे भर सकते हैं और इसे प्लेटफॉर्म पर कॉन्फ़िगर कर सकते हैं. mnemonic को एन्क्रिप्शन के बाद कॉन्फ़िगर किया जाता है, सादे पाठ में नहीं) ।

  • याददाश्त फ़ाइलः याददाश्त.txt

img

इसे डॉकर निर्देशिका के नीचे लाइव ट्रेडिंग आईडी फ़ोल्डर निर्देशिका में रखें। बेशक, इसे अन्य निर्देशिकाओं में भी रखा जा सकता है (निर्दिष्ट पथ को कॉन्फ़िगरेशन के दौरान लिखने की आवश्यकता है) ।

  • एफएमजेड पर विनिमय विन्यास करें

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

सम्पादकीय सम्पादन बॉक्स भरें:file:///mnemonic.txt, संबंधित वास्तविक पथ हैःdocker directory/logs/storage/594291.

img

2. 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")

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

3. बाजार सूचना जांच

परीक्षण नेटवर्क पर स्विच नहीं किया, मुख्य नेटवर्क के साथ परीक्षण किया

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. कोई ऑर्डर दें

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

img

dYdX v4 एप्लिकेशन पृष्ठः

img

5. आदेश की जानकारी

परीक्षण नेटवर्क अग्रिम में दो आदेश देता है, वर्तमान लंबित आदेश प्राप्त करने के लिए परीक्षण करता है, और आदेशों को रद्द करता है।

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

img

6. पद सूचना क्वेरी

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

img

7. उप-खाता प्रबंधन

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

लॉग जानकारीः

img

उस उप-खाते पर स्विच करें जिसका उप-खाते संख्या 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 अमरीकी डालर ट्रांसफर किए गए हैं।

8. TxHash प्राप्त करें और REST नोड इंटरफेस को कॉल करें

आदेश के अनुसार, TxHash प्राप्त करें और आरईएसटी नोड को कॉल करने वाले IO की विधि का परीक्षण करें

आदेश का TxHash कैसे प्राप्त करें? एक्सचेंज ऑब्जेक्ट dydx TxHash को कैश करेगा, जिसे आदेश आईडी का उपयोग करके क्वेरी किया जा सकता है। हालाँकि, रणनीति को रोकने के बाद, कैश किए गए आदेश 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)
    }
}

img

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 का समर्थन करने के लिए नवीनतम डॉकर डाउनलोड करने की आवश्यकता है

आपके समर्थन के लिए धन्यवाद और पढ़ने के लिए धन्यवाद।


अधिक