[TOC]

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

dYdX v3একইভাবে, লেনদেন পুরষ্কার, পুরষ্কার তৈরি করেdYdXটোকেন।
পূর্ববর্তী dYdX v3 প্রোটোকল DEX এক্সচেঞ্জ অফলাইন হয়েছে বর্তমান dYdX v4 অ্যাপ ঠিকানা:
অ্যাপ পৃষ্ঠা খোলার পরে, মানিব্যাগের সাথে সংযোগ করার জন্য উপরের ডানদিকের কোণায় ওয়ালেটের সাথে সংযোগ করার জন্য একটি বোতাম রয়েছে।
আপনি যদি প্রথমে টেস্টনেট পরিবেশের সাথে পরিচিত হতে চান তবে আপনি টেস্টনেট ব্যবহার করতে পারেন:
এছাড়াও উপরের ডানদিকের কোণায় কানেক্ট ওয়ালেট বোতামে ক্লিক করুন, ওয়ালেটের সাথে সংযোগ করতে 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 DEX সিস্টেমের লেনদেন সংক্রান্ত বিষয়বস্তু প্রধানত দুটি অংশ নিয়ে গঠিত:
ইনডেক্সার পরিষেবা 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) + "`")
}
}
লেনদেনে সর্বাধিক ব্যবহৃত বার্তাগুলি হল অর্ডার বার্তা, অর্ডার বাতিলকরণ বার্তা এবং স্থানান্তর বার্তা৷
{
"@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 ব্লক উচ্চতায় সেট করা হয়। মেয়াদ শেষ হওয়ার আগে।
অর্ডার আইডি: যেহেতু অর্ডার অপারেশনটি সরাসরি চেইনে সম্পাদিত হয়, তাই বার্তা সম্প্রচারের পরে ইনডেক্সার দ্বারা কোনও অর্ডার আইডি তৈরি হবে না এবং প্ল্যাটফর্ম অর্ডার ফাংশনের রিটার্ন মান হিসাবে ইনডেক্সার অর্ডার ব্যবহার করা যাবে না। স্বতন্ত্রতা নিশ্চিত করার জন্য অর্ডার আইডি এবং অর্ডার কোয়েরির নির্ভুলতা যাচাই করে, ইনডেক্সার অর্ডারটি ফেরত দেওয়া হয়। অর্ডার আইডিতে নিম্নলিখিত তথ্য থাকে (কমা দ্বারা পৃথক):
বাতিলকরণ বার্তার সারাংশ
{
"@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 টোকেন ব্যবহার করতে পারে।
উপরের বিষয়বস্তু সংক্ষেপে কিছু প্যাকেজিং বিশদ ব্যাখ্যা করে, এখানে dYdX v4 এর পরীক্ষামূলক নেটওয়ার্কটি মূলত প্রধান নেটওয়ার্কের মতোই ব্যবহার করা হয় এবং একটি স্বয়ংক্রিয় কল রয়েছে পরীক্ষার সম্পদ, এবং অভিভাবক এটিকে বিশদভাবে বর্ণনা করে না।
একটি ক্রিপ্টোকারেন্সি ওয়ালেট (আমি এখানে যে imToken ওয়ালেটটি ব্যবহার করছি) ব্যবহার করে সফলভাবে dYdX v4 অ্যাপের সাথে সংযোগ করার পরে, পরীক্ষার সম্পদগুলি গ্রহণ করুন এবং তারপরে বর্তমান dYdX v4 অ্যাকাউন্টের (ওয়ালেট থেকে প্রাপ্ত) স্মৃতির বাক্যাংশটি রপ্তানি করুন৷

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

এটিকে কাস্টোডিয়ান ডিরেক্টরির অধীনে রিয়েল ডিস্ক আইডি ফোল্ডার ডিরেক্টরিতে রাখুন অবশ্যই, এটি অন্যান্য ডিরেক্টরিতেও স্থাপন করা যেতে পারে (কনফিগারেশনের সময় নির্দিষ্ট পথটি লিখতে হবে)।
স্মৃতি সংক্রান্ত সম্পাদনা বাক্সটি পূরণ করুন:file:///mnemonic.txt, সংশ্লিষ্ট প্রকৃত পথ হল:托管者所在目录/logs/storage/594291。

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])
}
LogStatus("`" + JSON.stringify(tbl) + "`")
}

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

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

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

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

সাব-অ্যাকাউন্টে স্যুইচ করুন যার 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 স্থানান্তর করেছে।
আদেশ অনুসারে, 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)
}
}

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