ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) -- dYdX v4 ব্যবহার নির্দেশিকা

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

[TOC]

ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) – dYdX v4 ব্যবহার নির্দেশিকা

ভূমিকা

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

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

  • টেস্ট এনভায়রনমেন্ট সুইচিং
  • মার্কেট ইনফরমেশন কুয়েরি
  • অর্ডার ইনফরমেশন, পজিশন ইনফরমেশন কুয়েরি
  • অর্ডার প্লেসিং
  • সাব-অ্যাকাউন্ট ম্যানেজমেন্ট
  • নোড মেথড রিকোয়েস্ট

dYdX v4 DEX

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

ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) – dYdX v4 ব্যবহার নির্দেশিকা

  • dYdX v3-এর মতো, ট্রেডিং এর মাধ্যমে dYdX টোকেন রিওয়ার্ড জেনারেট হয়।

ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) – 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 অটোমেটিক জমা হবে টেস্টিং এর জন্য। রিয়েল ট্রেডিং এর জন্য USDC ডিপোজিট প্রয়োজন, যা মাল্টি-চেইন এবং মাল্টি-অ্যাসেট সাপোর্টের মাধ্যমে সহজেই করা যায়।

  • dYdX v4 অ্যাকাউন্ট অ্যাড্রেস dYdX v4 অ্যাকাউন্ট অ্যাড্রেস ওয়ালেট অ্যাড্রেস থেকে ডেরিভ করা হয়, উদাহরণ: dydx1xxxxxxxxxxxxxxxxxxxxq2ge5jr4nzfeljxxxx (dydx1 প্রিফিক্স সহ)। এই অ্যাড্রেস ব্লকচেইন এক্সপ্লোরারে কুয়েরি করা যায়।

  • মেমোনিক সিড উপরের ডানদিকের মেনুতে “এক্সপোর্ট পাসফ্রেজ” বাটন ক্লিক করে বর্তমান dYdX অ্যাড্রেসের মেমোনিক সিড এক্সপোর্ট করা যায়। FMZ প্ল্যাটফর্মে এক্সচেঞ্জ অ্যাড করার সময় এই মেমোনিক কনফিগার করতে হবে।

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

মেইননেট ও টেস্টনেট পার্থক্য

টেস্টনেট এবং মেইননেট এনভায়রনমেন্টে কিছু পার্থক্য রয়েছে, কয়েকটি নিম্নরূপ:

  • সাব-অ্যাকাউন্ট অ্যাসেট ট্রান্সফার মেইননেটে সাব-অ্যাকাউন্ট ক্লিনআপ মেকানিজম রয়েছে। যখন subAccountNumber >= 128 হয় এবং 해당 ID-এর সাব-অ্যাকাউন্টে কোনো পজিশন না থাকে, অ্যাসেট স্বয়ংক্রিয়ভাবে subAccountNumber 0-এ ট্রান্সফার হয়। টেস্টনেটে এই মেকানিজম নেই (বা ভিন্ন ট্রিগার কন্ডিশন)।

  • কিছু টোকেন নাম নেটিভ টোকেন dydx-এর নাম ভিন্ন: মেইননেটে DYDX, টেস্টনেটে Dv4TNT

  • অ্যাড্রেস কনফিগারেশন, যেমন চেইন ID, নোড অ্যাড্রেস, ইনডেক্সার অ্যাড্রেস ইত্যাদি। নোড এবং কনফিগারেশনের উদাহরণ:

    • মেইননেট: ইনডেক্সার অ্যাড্রেস: https://indexer.dydx.trade চেইন ID: dydx-mainnet-1 REST নোড: https://dydx-dao-api.polkachu.com:443

    • টেস্টনেট: ইনডেক্সার অ্যাড্রেস: https://indexer.v4testnet.dydx.exchange চেইন ID: dydx-testnet-4 REST নোড: https://dydx-testnet-api.polkachu.com

dYdX v4 প্রোটোকল আর্কিটেকচার

dYdX v4 প্রোটোকল Cosmos ইকোসিস্টেমের উপর ডেভেলপ করা। dYdX v4 DEX সিস্টেমের প্রধান দুটি কম্পোনেন্ট:

  • মার্কেট ডেটা, অ্যাকাউন্ট ইনফরমেশন কুয়েরির জন্য ইনডেক্সার
  • dYdX ব্লকচেইনে অর্ডার মেসেজ, ক্যানসেল মেসেজ, ট্রান্সফার মেসেজ ইত্যাদি

ইনডেক্সার

ইনডেক্সার সার্ভিস REST এবং WebSocket প্রোটোকল সাপোর্ট করে।

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

  • WebSocket প্রোটোকল FMZ প্ল্যাটফর্মে Dial ফাংশন ব্যবহার করে WebSocket কানেকশন তৈরি করে মার্কেট ডেটা সাবস্ক্রাইব করা যায়।

লক্ষ্য রাখতে হবে dYdX v4 ইনডেক্সার সেন্ট্রালাইজড এক্সচেঞ্জের মতো রিয়েল-টাইম ডেটা আপডেট নাও দিতে পারে। উদাহরণস্বরূপ, অর্ডার প্লেস করার পর ইনস্ট্যান্ট কুয়েরিতে অর্ডার না মিলতে পারে। কিছু অপারেশনের পর Sleep(n) ব্যবহার করে কয়েক সেকেন্ড অপেক্ষা করার পরামর্শ দেওয়া হয়।

নিচে Dial ফাংশন ব্যবহার করে 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) {
                // বিডস আপডেট
                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) {
                            // নির্দিষ্ট দামের আস্ক ডিলিট করুন
                            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() {
    // রিয়েল : wss://indexer.dydx.trade/v4/ws
    // সিমুলেট : 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 চেইন নোড মেসেজ ব্রডকাস্ট  
ট্রেডিং-এ সর্বাধিক ব্যবহৃত হয় অর্ডার মেসেজ, অর্ডার বাতিল মেসেজ, ট্রান্সফার মেসেজ।  

- **অর্ডার মেসেজ সারাংশ**  
  ```JSON
  {
    "@type": "/dydxprotocol.clob.MsgPlaceOrder",
    "order": {
      "orderId": {
        "subaccountId": {
          "owner": "xxx"
        },
        "clientId": xxx,
        "orderFlags": 64,
        "clobPairId": 1
      },
      "side": "SIDE_BUY",
      "quantums": "2000000",
      "subticks": "3500000000",
      "goodTilBlockTime": 1742295981
    }
  }
  • লিমিট অর্ডার:
    FMZ প্ল্যাটফর্মে এনক্যাপসুলেটেড অর্ডার ফাংশনে, লিমিট অর্ডারের জন্য orderFlags মান ব্যবহার করা হয়:
    ORDER_FLAGS_LONG_TERM = 64 # দীর্ঘমেয়াদী অর্ডার
    dYdX v4 প্রোটোকলের সীমাবদ্ধতা অনুযায়ী, সর্বোচ্চ অর্ডার এক্সপায়ারি সময় (৯০ দিন) সেট করা হয়।

  • মার্কেট অর্ডার:
    FMZ প্ল্যাটফর্মে এনক্যাপসুলেটেড অর্ডার ফাংশনে, মার্কেট অর্ডারের জন্য orderFlags মান ব্যবহার করা হয়:
    ORDER_FLAGS_SHORT_TERM = 0 # স্বল্পমেয়াদী অর্ডার
    dYdX v4 প্রোটোকলের সুপারিশ অনুযায়ী:

    // বিক্রয়ের জন্য ওরাকল প্রাইস - ৫% বা কম, ক্রয়ের জন্য ওরাকল প্রাইস + ৫% সেট করার পরামর্শ

    প্রকৃত মার্কেট অর্ডার না হওয়ায়, ওরাকল প্রাইসের উপর ৫% স্লিপেজ যুক্ত/বিয়োগ করে মার্কেট অর্ডার তৈরি করা হয়। স্বল্পমেয়াদী অর্ডারের এক্সপায়ারি ব্লক হাইট বর্তমান ব্লক + ১০ ব্লক হিসাবে সেট করা হয়।

  • অর্ডার আইডি:
    ব্লকচেইনে সরাসরি অর্ডার স্থাপনের কারণে, মেসেজ ব্রডকাস্টের পর ইনডেক্সার জেনারেটেড অর্ডার আইডি পাওয়া যায় না। ইউনিক অর্ডার আইডি নিশ্চিত করতে নিম্নলিখিত উপাদানগুলি কমা দ্বারা যুক্ত করা হয়:

    • ট্রেডিং পেয়ার
    • 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 ০ হল প্রথম অটো-ক্রিয়েটেড সাব-অ্যাকাউন্ট। আইসোলেটেড মার্জিন ট্রেডিংয়ের জন্য subAccountNumber ≥ ১২৮ ব্যবহার করা হয় (ন্যূনতম ২০ USDC রিকোয়ার্ড)।
উদাহরণ: subAccountNumber ০ → ১২৮ অথবা ১২৮ → ০ ট্রান্সফার। গ্যাস ফি USDC বা dYdX টোকেন দ্বারা পরিশোধ করা যায়।

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

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

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

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

ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) – dYdX v4 ব্যবহার নির্দেশিকা

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

  • মেমোনিক ফাইল: mnemonic.txt

ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) – dYdX v4 ব্যবহার নির্দেশিকা

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

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

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

মেমোনিক এডিট বক্সে লিখুন: file:///mnemonic.txt, সংশ্লিষ্ট অ্যাকচুয়াল পাথ: হোস্টিং প্রোভাইডার ডিরেক্টরি/logs/storage/594291.

ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) – dYdX v4 ব্যবহার নির্দেশিকা

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

৩. মার্কেট ইনফো কোয়েরি

টেস্টনেটে সুইচ না করে, মেইননেট দিয়ে টেস্ট করুন

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])
    }
```js
function main() {
    // টেস্টনেটের ইনডেক্সার অ্যাড্রেস সেট করুন
    exchange.SetBase("https://indexer.v4testnet.dydx.exchange")

    // টেস্টনেটের চেইন আইডি সেট করুন
    exchange.IO("chainId", "dydx-testnet-4")

    // টেস্টনেটের REST নোড অ্যাড্রেস সেট করুন
    exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")

    // সাব-অ্যাকাউন্ট তৈরি করুন (Parent → Sub)
    var subAccount = exchange.IO("api", "POST", "/v4/addresses", null, null, "subaccount")
    Log("subAccount:", subAccount)

    // সাব-অ্যাকাউন্ট তালিকা
    var subAccounts = exchange.IO("api", "GET", "/v4/addresses")
    Log("subAccounts:", subAccounts)

    // সাব-অ্যাকাউন্ট সুইচ করুন
    exchange.IO("api", "POST", "/v4/addresses/" + subAccount.account.address)
}

ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) – dYdX v4 ব্যবহার নির্দেশিকা

৭. সাব-অ্যাকাউন্ট ম্যানেজমেন্ট

function main() {
    // টেস্টনেটের ইনডেক্সার অ্যাড্রেস সেট করুন
    exchange.SetBase("https://indexer.v4testnet.dydx.exchange")

    // টেস্টনেটের চেইন আইডি সেট করুন
    exchange.IO("chainId", "dydx-testnet-4")

    // টেস্টনেটের REST নোড অ্যাড্রেস সেট করুন
    exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")

    // সাব-অ্যাকাউন্ট তৈরি (প্রধান → সাব)
    var subAccount = exchange.IO("api", "POST", "/v4/addresses", null, null, "subaccount")
    লগ("subAccount:", subAccount)

    // সাব-অ্যাকাউন্ট তালিকা অনুসন্ধান
    var subAccounts = exchange.IO("api", "GET", "/v4/addresses")
    লগ("subAccounts:", subAccounts)

    // সাব-অ্যাকাউন্টে সুইচ করুন
    exchange.IO("api", "POST", "/v4/addresses/" + subAccount.account.address)
}

ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) – dYdX v4 ব্যবহার নির্দেশিকা

dYdX v4 অ্যাপ্লিকেশন ইন্টারফেস:

ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) – dYdX v4 ব্যবহার নির্দেশিকা

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

function main() {    
    // টেস্টনেটের ইনডেক্সার অ্যাড্রেস সেট করুন
    exchange.SetBase("https://indexer.v4testnet.dydx.exchange")

    // টেস্টনেটের চেইন আইডি সেট করুন
    exchange.IO("chainId", "dydx-testnet-4")

    // টেস্টনেটের REST নোড অ্যাড্রেস সেট করুন
    exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")

    var orders = exchange.GetOrders()
    লগ("orders:", orders)
    for (var order of orders) {
        exchange.CancelOrder(order.Id, order)
        Sleep(2000)
    }

    var tbl = {type: "table", title: "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) +  "`")
}

ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) – dYdX v4 ব্যবহার নির্দেশিকা

৬. পজিশন তথ্য অনুসন্ধান

function main() {
    // টেস্টনেটের ইনডেক্সার অ্যাড্রেস সেট করুন
    exchange.SetBase("https://indexer.v4testnet.dydx.exchange")

    // টেস্টনেটের চেইন আইডি সেট করুন
    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: "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) +  "`")
}

ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) – dYdX v4 ব্যবহার নির্দেশিকা

exchange.IO("restApiBase", "https://dydx-testnet-api.polkachu.com")

    // সাব-অ্যাকাউন্ট নম্বর ০ -> ১২৮ : ২০ USDC, Gas Fee adv4tnt অর্থাৎ dydx টোকেন
    var ret = exchange.IO("transferUSDCToSubaccount", 0, 128, "adv4tnt", 20)  
    Log("ret:", ret)

    // সাব-অ্যাকাউন্ট নম্বর ১২৮-এ স্যুইচ করুন, অ্যাকাউন্ট ইনফো চেক করুন
    exchange.IO("subAccountNumber", 128)

    var account = exchange.GetAccount()
    Log("account:", account)
}

ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) – dYdX v4 ব্যবহার নির্দেশিকা

সাব-অ্যাকাউন্ট নম্বর ১২৮-এ স্যুইচ করার পর, 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
}

দেখা যাচ্ছে যে সাব-অ্যাকাউন্ট নম্বর ১২৮-এ ২০ USDC ট্রান্সফার করা হয়েছে।

৮、TxHash প্রাপ্তি এবং REST নোড ইন্টারফেস কল করা

অর্ডার অনুযায়ী TxHash প্রাপ্তি, REST নোড কল করার পদ্ধতি পরীক্ষা

অর্ডারের TxHash পাওয়ার জন্য, dydx এক্সচেঞ্জ অবজেক্ট TxHash ক্যাশে করে। অর্ডার ID ব্যবহার করে কোয়েরি করা যেতে পারে। তবে স্ট্র্যাটিজি বন্ধ হলে ক্যাশে করা TxHash ম্যাপিং রিসেট হয়ে যাবে।

function main() {
    // টেস্টনেটের ইনডেক্সার অ্যাড্রেস সেট করুন
    exchange.SetBase("https://indexer.v4testnet.dydx.exchange")

    // টেস্টনেটের চেইন আইডি সেট করুন
    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)
}

}


![ডিইএক্স এক্সচেঞ্জের কোয়ান্টিটেটিভ প্র্যাকটিস (১) -- dYdX v4 ব্যবহার নির্দেশিকা](/upload/asset/17019d5543abe62051a8.png)

TxHash ব্যবহার করে অনুসন্ধান করা বার্তা:

> var ret = exchange.IO("api", "GET", "/cosmos/tx/v1beta1/txs/" + txHash)

বিষয়বস্তু খুব দীর্ঘ, অংশবিশেষ প্রদর্শন:

```JSON
{
	"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 সাপোর্ট করতে সর্বশেষ হোস্টার ডাউনলোড করতে হবে

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