4
ফোকাস
1271
অনুসারী

DEX এক্সচেঞ্জ পরিমাণগত অনুশীলন (1)--dYdX v4 ব্যবহারকারীর নির্দেশিকা

তৈরি: 2024-12-24 17:09:32, আপডেট করা হয়েছে: 2024-12-26 21:41:46
comments   0
hits   1051

[TOC]

DEX এক্সচেঞ্জ পরিমাণগত অনুশীলন (1)–dYdX v4 ব্যবহারকারীর নির্দেশিকা

ভূমিকা

ক্রিপ্টোকারেন্সি ট্রেডিংয়ের ক্ষেত্রে বিকেন্দ্রীভূত এক্সচেঞ্জের (DEX) দ্রুত উত্থানের সাথে, পরিমাণগত ব্যবসায়ীরা ধীরে ধীরে দক্ষ স্বয়ংক্রিয় ব্যবসায়ের জন্য এই প্ল্যাটফর্মগুলিতে ফিরে আসতে শুরু করেছে। সবচেয়ে জনপ্রিয় বিকেন্দ্রীভূত ট্রেডিং প্ল্যাটফর্মগুলির মধ্যে একটি হিসাবে, dYdX শক্তিশালী ট্রেডিং ফাংশন প্রদান করে এবং ফিউচার পারপেচুয়াল কন্ট্রাক্ট ট্রেডিংকে সমর্থন করে এর সর্বশেষ সংস্করণ v4-এ কর্মক্ষমতা এবং ব্যবহারকারীর অভিজ্ঞতা অপ্টিমাইজ করা হয়েছে, এটি অনেক পরিমাণগত ব্যবসায়ীদের জন্য প্রথম পছন্দ।

এই নিবন্ধটি কীভাবে dYdX v4-এ পরিমাণগত ট্রেডিং অনুশীলন করতে হয়, তার এপিআই কীভাবে ট্রেড করতে, বাজারের ডেটা প্রাপ্ত করতে এবং অ্যাকাউন্ট পরিচালনা করতে হয় তা সহ পরিচয় করিয়ে দেবে।

  • পরীক্ষা পরিবেশ সুইচ
  • বাজার তথ্য অনুসন্ধান
  • অর্ডার তথ্য, অবস্থান তথ্য প্রশ্ন
  • একটি অর্ডার রাখুন
  • সাব-অ্যাকাউন্ট ব্যবস্থাপনা
  • নোড পদ্ধতি অনুরোধ

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

অ্যাপ পৃষ্ঠা খোলার পরে, মানিব্যাগের সাথে সংযোগ করার জন্য উপরের ডানদিকের কোণায় ওয়ালেটের সাথে সংযোগ করার জন্য একটি বোতাম রয়েছে।

আপনি যদি প্রথমে টেস্টনেট পরিবেশের সাথে পরিচিত হতে চান তবে আপনি টেস্টনেট ব্যবহার করতে পারেন:

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

এছাড়াও উপরের ডানদিকের কোণায় কানেক্ট ওয়ালেট বোতামে ক্লিক করুন, ওয়ালেটের সাথে সংযোগ করতে QR কোড স্ক্যান করুন এবং স্বাক্ষর যাচাই করুন। ওয়ালেটটি সফলভাবে সংযুক্ত হওয়ার পরে, একটি dydx v4 ঠিকানা স্বয়ংক্রিয়ভাবে তৈরি হবে এই ঠিকানাটি অ্যাপ পৃষ্ঠার উপরের ডানদিকে প্রদর্শিত হবে এবং এটিতে ক্লিক করার পরে একটি মেনু পপ আপ হবে৷ রিচার্জিং, কয়েন উত্তোলন এবং তহবিল স্থানান্তরের মতো ক্রিয়াকলাপ রয়েছে। dYdX মেইননেট (উৎপাদন পরিবেশ) এবং টেস্টনেটের মধ্যে পার্থক্যগুলির মধ্যে একটি হল: আপনি যখন টেস্টনেটে রিচার্জে ক্লিক করেন, তখন পরীক্ষার জন্য কল ব্যবহার করে 300টি USDC সম্পদ স্বয়ংক্রিয়ভাবে ঢেলে দেওয়া হবে। আপনি যদি dYdX-এ প্রকৃত লেনদেন করতে চান, তাহলে আপনাকে USDC সম্পদে বিনিয়োগ করতে হবে এবং রিচার্জ করার জন্য একাধিক সম্পদ এবং চেইনের সাথে সামঞ্জস্যপূর্ণ।

  • dYdX v4 অ্যাকাউন্টের ঠিকানা dYdX v4 অ্যাকাউন্টের ঠিকানাটি ওয়ালেট ঠিকানা থেকে নেওয়া হয়েছে dYdX v4 অ্যাকাউন্টের ঠিকানাটি এইরকম দেখাচ্ছে:dydx1xxxxxxxxxxxxxxxxxxxxq2ge5jr4nzfeljxxxx, হল dydx1 দিয়ে শুরু হওয়া ঠিকানা। এই ঠিকানাটি ব্লকচেইন এক্সপ্লোরারে জিজ্ঞাসা করা যেতে পারে।

  • স্মৃতিসংক্রান্ত বাক্যাংশ আপনি বর্তমান dYdX ঠিকানা অ্যাকাউন্টের স্মৃতিক শব্দ রপ্তানি করতে উপরের ডানদিকের কোণায় মেনুতে “পাসওয়ার্ড রপ্তানি করুন” বোতামে ক্লিক করতে পারেন৷ FMZ প্ল্যাটফর্মে একটি বিনিময় যোগ করার সময়, আপনাকে এই স্মৃতিচিহ্নটি কনফিগার করতে হবে।

স্মৃতির বাক্যাংশটি সরাসরি FMZ প্ল্যাটফর্মে কনফিগার করা যেতে পারে, অথবা dydx v4 বিনিময় অবজেক্ট ব্যবহার করার সময়, স্মৃতির শব্দবন্ধটি রেকর্ড করা ফাইলের বিষয়বস্তু পড়া হবে, যা ব্যবহারিক অংশে প্রদর্শিত হবে। এই নিবন্ধের.

মেইননেট এবং টেস্টনেটের মধ্যে পার্থক্য

টেস্টনেট পরিবেশ কিছু দিক থেকে মেইননেট পরিবেশ থেকে আলাদা।

  • উপ-অ্যাকাউন্ট সম্পদ স্থানান্তর। প্রধান নেটওয়ার্কে একটি সাব-অ্যাকাউন্ট পরিষ্কারের ব্যবস্থা রয়েছে।subAccountNumber >= 128এই সময়ে, যদি এই আইডি সহ সাব-অ্যাকাউন্টের কোনো অবস্থান না থাকে, তাহলে সম্পদগুলি স্বয়ংক্রিয়ভাবে subAccountNumber 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)) আবার জিজ্ঞাসা করার আগে কয়েক সেকেন্ড অপেক্ষা করুন।

একটি Websocket 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

    যেহেতু এটি একটি প্রকৃত বাজার অর্ডার নয়, তাই ওরাকল মূল্য ব্যবহার করা হয়, প্লাস বা মাইনাস ৫% স্লিপেজকে বাজার অর্ডার হিসেবে ব্যবহার করা হয়। স্বল্পমেয়াদী অর্ডারের বৈধতা সময়কাল নির্ধারণ দীর্ঘমেয়াদী অর্ডারের চেয়ে আলাদা। স্বল্পমেয়াদী অর্ডারগুলি ব্লক উচ্চতার বৈধতা সময়কাল ব্যবহার করে। dydx v4 এর সুপারিশ অনুসারে, এটি বর্তমান ব্লক + 10 ব্লক উচ্চতায় সেট করা হয়। মেয়াদ শেষ হওয়ার আগে।

  • অর্ডার আইডি: যেহেতু অর্ডার অপারেশনটি সরাসরি চেইনে সম্পাদিত হয়, তাই বার্তা সম্প্রচারের পরে ইনডেক্সার দ্বারা কোনও অর্ডার আইডি তৈরি হবে না এবং প্ল্যাটফর্ম অর্ডার ফাংশনের রিটার্ন মান হিসাবে ইনডেক্সার অর্ডার ব্যবহার করা যাবে না। স্বতন্ত্রতা নিশ্চিত করার জন্য অর্ডার আইডি এবং অর্ডার কোয়েরির নির্ভুলতা যাচাই করে, ইনডেক্সার অর্ডারটি ফেরত দেওয়া হয়। অর্ডার আইডিতে নিম্নলিখিত তথ্য থাকে (কমা দ্বারা পৃথক):

    • ট্রেডিং জোড়া
    • dydx বর্তমান অ্যাকাউন্ট ঠিকানা
    • সাবঅ্যাকাউন্ট সিরিয়াল নম্বর (সাবঅ্যাকাউন্ট নম্বর)
    • ক্লায়েন্টআইডি (এলোমেলোভাবে তৈরি)
    • 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 হল প্রথম স্বয়ংক্রিয়ভাবে তৈরি করা সাব-অ্যাকাউন্ট আইডি যার 128 এর চেয়ে বেশি বা এর সমান, বিচ্ছিন্ন জাতগুলির লেনদেনের জন্য ব্যবহার করা হয়। কমপক্ষে 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 ব্যবহারকারীর নির্দেশিকা

৬. অবস্থান তথ্য অনুসন্ধান

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
}

দেখা যাচ্ছে যে subAccountNumber 128 সহ সাব-অ্যাকাউন্টটি 20 USDC স্থানান্তর করেছে।

8. TxHash পান এবং REST নোড ইন্টারফেস কল করুন

আদেশ অনুসারে, TxHash প্রাপ্ত করুন এবং IO কলিং REST নোডের পদ্ধতি পরীক্ষা করুন

অর্ডারের 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 সমর্থন করার জন্য আপনাকে সর্বশেষ অভিভাবক ডাউনলোড করতে হবে।

আপনার সমর্থনের জন্য ধন্যবাদ এবং পড়ার জন্য ধন্যবাদ।