4
ध्यान केंद्रित करना
1271
समर्थक

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) -- dYdX v4 उपयोगकर्ता गाइड

में बनाया: 2024-12-24 17:09:32, को अपडेट: 2024-12-26 21:41:46
comments   0
hits   1049

[TOC]

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

प्रस्तावना

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

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

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

dYdX v4 DEX

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

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

  • औरdYdX v3इसी तरह, लेन-देन पुरस्कार, पुरस्कार उत्पन्न करते हैंdYdXटोकन.

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

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

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

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

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

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

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

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

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

  • स्मृती-विज्ञान आप ऊपरी दाएं कोने के मेनू में “पासवर्ड निर्यात करें” बटन पर क्लिक करके वर्तमान dYdX पता खाते का निमोनिक निर्यात कर सकते हैं। FMZ प्लेटफॉर्म पर एक्सचेंज जोड़ते समय, आपको इस निमोनिक को कॉन्फ़िगर करना होगा।

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

मेननेट और टेस्टनेट के बीच अंतर

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

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

  • कुछ सांकेतिक नाम. मूल टोकन dydx को अलग नाम दिया गया है: MainnetDYDX, परीक्षण नेटवर्कDv4TNT

  • पता कॉन्फ़िगरेशन, जैसे चेन आईडी, नोड पता, इंडेक्सर पता, आदि। इसमें कई नोड और कॉन्फ़िगरेशन हैं, उनमें से एक यहाँ है:

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

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

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

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

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

इंडेक्सर

इंडेक्सर सेवा REST और वेबसॉकेट प्रोटोकॉल प्रदान करती है।

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

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

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

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

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 चेन नोड संदेश प्रसारण

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

  • आदेश संदेश सारांश
  {
    "@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 प्लेटफॉर्म पर समाहित ऑर्डर फ़ंक्शन में, सीमा ऑर्डर के लिए उपयोग किया जाने वाला ऑर्डरफ़्लैग्स मान है:ORDER_FLAGS_LONG_TERM = 64 # 长期订单DYDX v4 प्रोटोकॉल की सीमाओं के अनुसार, सबसे लंबी ऑर्डर वैधता अवधि का उपयोग किया जाता है, जो 90 दिन है (DYDX v4 पर सभी प्रकार के ऑर्डर की वैधता अवधि होती है)।

  • बाजार आदेश: FMZ प्लेटफॉर्म पर समाहित ऑर्डर फ़ंक्शन में, मार्केट ऑर्डर द्वारा प्रयुक्त ऑर्डरफ़्लैग्स मान है:ORDER_FLAGS_SHORT_TERM = 0 # 短期订单DYDX v4 प्रोटोकॉल अनुशंसाओं के अनुसार:

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

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

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

    • ट्रेडिंग जोड़े
    • dydx चालू खाता पता
    • उप-खाता संख्या (subaccountNumber)
    • clientId (यादृच्छिक रूप से जनित)
    • clobPairId (लेनदेन प्रतीक आईडी)
    • orderFlags
    • goodTilData (मिलीसेकंड)
  • ऑर्डर रद्दीकरण संदेश सारांश

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

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

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

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

FMZ प्लेटफॉर्म dYdX v4 अभ्यास

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

1. कॉन्फ़िगरेशन

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

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

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

  • स्मृति सहायक फ़ाइल: mnemonic.txt

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

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

  • FMZ पर एक्सचेंज कॉन्फ़िगर करें

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

स्मृति सहायक संपादन बॉक्स भरें:file:///mnemonic.txt, संगत वास्तविक पथ है:托管者所在目录/logs/storage/594291

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

2. 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()) 
}

परीक्षण नेटवर्क खाता जानकारी पढ़ें:

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

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

4. ऑर्डर दें

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

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

dYdX v4 ऐप पृष्ठ:

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

5. ऑर्डर की जानकारी

परीक्षण नेटवर्क दो ऑर्डर पहले ही दे देता है, वर्तमान लंबित ऑर्डर प्राप्त करने का परीक्षण करता है, तथा ऑर्डर को रद्द कर देता है।

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

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

6. स्थिति जानकारी क्वेरी

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

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

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

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

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

उस उप-खाते पर स्विच करें जिसका subAccountNumber 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 USDC स्थानांतरित किए हैं।

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

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

किसी ऑर्डर का TxHash कैसे प्राप्त करें? एक्सचेंज ऑब्जेक्ट dydx TxHash को कैश करेगा, जिसे ऑर्डर आईडी का उपयोग करके क्वेरी किया जा सकता है। हालाँकि, रणनीति बंद होने के बाद, कैश्ड ऑर्डर tx हैश मैप साफ़ हो जाएगा।

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

DEX एक्सचेंज क्वांटिटेटिव प्रैक्टिस (1) – dYdX v4 उपयोगकर्ता गाइड

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

THE END

उपरोक्त परीक्षण नवीनतम कस्टोडियन पर आधारित हैं। dYdX v4 DEX का समर्थन करने के लिए आपको नवीनतम कस्टोडियन डाउनलोड करना होगा

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