রিসোর্স লোড হচ্ছে... লোডিং...

ডিইএক্স এক্সচেঞ্জের পরিমাণগত অনুশীলন (1) -- ডিওয়াইডিএক্স ভি৪ ব্যবহারকারী গাইড

লেখক:এফএমজেড-লিডিয়া, তৈরিঃ ২০২৪-১২-২৬ 15:32:24, আপডেটঃ ২০২৪-১২-২৬ 17:36:31

প্রিফেস

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

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

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

dYdX v4 DEX

  • dYdX টেস্টনেট অ্যাপ পেজ

img

  • যেমনdYdX v3ইথেরিয়ামের সাথে, ট্রেডিং পুরস্কার উৎপন্ন করে, যা পুরস্কারdYdX tokens.

ওয়ালেট সংযোগ, লগইন এবং কনফিগারেশন তথ্য

পূর্ববর্তী dYdX v3 প্রোটোকল DEX এক্সচেঞ্জ অফলাইনে ছিল। বর্তমান dYdX v4 অ্যাপ্লিকেশন ঠিকানা হলঃ

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

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

আপনি যদি প্রথমে পরীক্ষার নেটওয়ার্ক পরিবেশের সাথে নিজেকে পরিচিত করতে চান এবং পরীক্ষা করতে চান তবে আপনি পরীক্ষার নেটওয়ার্কটি ব্যবহার করতে পারেনঃ

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

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

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

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

এমএনএমনিক্স সরাসরি এফএমজেড প্ল্যাটফর্মে কনফিগার করা যেতে পারে বা ডকারে স্থানীয়ভাবে সংরক্ষণ করা যেতে পারে। যখন dydx v4 এক্সচেঞ্জ অবজেক্ট ব্যবহার করা হয়, তখন এমএনএমনিক্স রেকর্ডিং ফাইলের সামগ্রী পড়া হবে, যা এই নিবন্ধের ব্যবহারিক অংশে প্রদর্শিত হবে।

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

টেস্ট নেট পরিবেশটি কিছু দিক থেকে মেইন নেট পরিবেশ থেকে আলাদা। এখানে কয়েকটি সহজ পার্থক্য রয়েছে।

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

ডিওয়াইডিএক্স ভি 4 প্রোটোকলটি মহাবিশ্বের বাস্তুতন্ত্রের উপর ভিত্তি করে তৈরি করা হয়েছে। ডিওয়াইডিএক্স ভি 4 ডিএক্স সিস্টেমের লেনদেন সম্পর্কিত সামগ্রীতে মূলত দুটি অংশ রয়েছেঃ

  • টিকার তথ্য, অ্যাকাউন্টের তথ্য ইত্যাদি অনুসন্ধানের জন্য দায়ী একটি সূচক।
  • dydx ব্লকচেইন অর্ডার বার্তা, অর্ডার বাতিল বার্তা, স্থানান্তর বার্তা ইত্যাদি

সূচক

সূচক পরিষেবা REST এবং ওয়েবসকেট প্রোটোকল সরবরাহ করে।

  • REST প্রোটোকল REST প্রোটোকল ইন্টারফেসটি বাজার তথ্য অনুসন্ধান, অ্যাকাউন্ট তথ্য, অবস্থান তথ্য, অর্ডার তথ্য এবং অন্যান্য অনুসন্ধানগুলিকে সমর্থন করে এবং এটি FMZ প্ল্যাটফর্মে একটি ইউনিফাইড API ইন্টারফেস হিসাবে ক্যাপসুল করা হয়েছে।

  • ওয়েবসকেট প্রোটোকল এফএমজেড প্ল্যাটফর্মে, আপনি ডায়াল ফাংশনটি ব্যবহার করে একটি ওয়েবসকেট সংযোগ তৈরি করতে এবং বাজার তথ্য সাবস্ক্রাইব করতে পারেন।

এটি লক্ষ করা উচিত যে 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ডাইডেক্স ভি৪ প্রোটোকলের সীমাবদ্ধতা অনুযায়ী, সবচেয়ে দীর্ঘ অর্ডার বৈধতার সময়কাল ব্যবহার করা হয়, যা ৯০ দিন (ডাইডেক্স ভি৪-এ সমস্ত ধরণের অর্ডারের বৈধতার সময়কাল রয়েছে) ।

  • মার্কেট অর্ডার: FMZ প্ল্যাটফর্মে অর্ডার ফাংশনে, মার্কেট অর্ডারের জন্য ব্যবহৃত অর্ডারফ্লেগ মান হলঃORDER_FLAGS_SHORT_TERM = 0 # Short-term order, dydx v4 প্রোটোকলের সুপারিশ অনুযায়ীঃ

// অর্ডারের দাম নির্ধারণ করুন - বিক্রয়ের জন্য 5% বা তার কম, ক্রয়ের জন্য অর্ডারের দাম + 5%

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

  • অর্ডার আইডিঃ যেহেতু অর্ডার অপারেশনটি সরাসরি চেইনে সম্পাদিত হয়, তাই বার্তাটি সম্প্রচারিত হওয়ার পরে সূচক দ্বারা উত্পন্ন কোনও অর্ডার আইডি থাকবে না এবং সূচক অর্ডারটি প্ল্যাটফর্ম অর্ডার ফাংশনের রিটার্ন মান হিসাবে ব্যবহার করা যাবে না। অর্ডার আইডির অনন্যতা এবং অর্ডার অনুসন্ধানের নির্ভুলতা নিশ্চিত করার জন্য, ফেরত অর্ডার আইডি নিম্নলিখিত তথ্য (কমা-বিভক্ত) নিয়ে গঠিতঃ

ট্রেডিং জুটি dydx বর্তমান অ্যাকাউন্টের ঠিকানা উপ-অ্যাকাউন্ট নম্বর (sub-accountNumber) ক্লায়েন্ট আইডি (এলোমেলোভাবে তৈরি) 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 ইউএসডিসি সম্পদ প্রয়োজন। উদাহরণস্বরূপ, আপনি সাবঅ্যাকাউন্ট নম্বর 0 -> 128 থেকে যেতে পারেন, অথবা সাবঅ্যাকাউন্ট নম্বর 128 -> 0 থেকে। স্থানান্তরগুলির জন্য গ্যাস ফি প্রয়োজন। গ্যাস ফি USDC বা dydx টোকেন হতে পারে।

FMZ প্ল্যাটফর্ম dYdX v4 অনুশীলন

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

১. কনফিগারেশন

একটি ক্রিপ্টোকারেন্সি ওয়ালেট ব্যবহার করে dYdX v4 অ্যাপে সফলভাবে সংযোগ করার পরে (আমি এখানে imToken ওয়ালেট ব্যবহার করি), আপনার পরীক্ষার সম্পদ দাবি করুন এবং তারপরে আপনার বর্তমান dYdX v4 অ্যাকাউন্টের জন্য (আপনার ওয়ালেট থেকে উদ্ভূত) মেনেমিক এক্সপোর্ট করুন।

img

এফএমজেড প্ল্যাটফর্মে ম্নেমোনিক কনফিগার করুন। এখানে আমরা এটি কনফিগার করতে স্থানীয় ফাইল পদ্ধতি ব্যবহার করি (আপনি এটি সরাসরি পূরণ করতে পারেন এবং এটি প্ল্যাটফর্মে কনফিগার করতে পারেন। ম্নেমোনিকটি এনক্রিপশনের পরে কনফিগার করা হয়, সরল পাঠ্যে নয়) ।

  • স্মরণীয় ফাইলঃ স্মরণীয়.txt

img

এটি ডকার ডিরেক্টরির অধীনে লাইভ ট্রেডিং আইডি ফোল্ডার ডিরেক্টরিতে রাখুন। অবশ্যই, এটি অন্যান্য ডিরেক্টরিতেও স্থাপন করা যেতে পারে (নির্দিষ্ট পথটি কনফিগারেশনের সময় লিখতে হবে) ।

  • FMZ এ এক্সচেঞ্জ কনফিগার করুন

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

স্মারক সম্পাদনা বাক্সটি পূরণ করুনঃfile:///mnemonic.txt, সংশ্লিষ্ট প্রকৃত পথ হলঃdocker directory/logs/storage/594291.

img

২. 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
}

৩. বাজার তথ্য অনুসন্ধান

টেস্ট নেটওয়ার্কে পরিবর্তন করা হয়নি, মূল নেটওয়ার্কের সাথে পরীক্ষা করা হয়েছে

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

৪. অর্ডার দিন

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

৫. অর্ডার তথ্য

টেস্ট নেটওয়ার্ক দুটি অর্ডার দেয়, বর্তমান অপেক্ষমান অর্ডারগুলি পরীক্ষা করে এবং অর্ডারগুলি বাতিল করে।

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

৬. পজিশন ইনফরমেশন অনুসন্ধান

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

৭. উপ-অ্যাকাউন্ট ব্যবস্থাপনা

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
}

আপনি দেখতে পাচ্ছেন যে, সাব-অ্যাকাউন্ট নম্বর ১২৮-এর সাব-অ্যাকাউন্ট থেকে ২০ ডলার ট্রান্সফার করা হয়েছে।

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

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

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

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


আরো