avatar of 发明者量化-小小梦 发明者量化-小小梦
پر توجہ دیں نجی پیغام
4
پر توجہ دیں
1271
پیروکار

FMZ کی مقدار کی بنیاد پر DEX-CEX ایکسچینج قیمت کے فرق کی نگرانی کا ڈیزائن اور نفاذ

میں تخلیق کیا: 2025-02-21 10:40:52, تازہ کاری: 2025-02-21 13:53:00
comments   0
hits   1232

FMZ کی مقدار کی بنیاد پر DEX-CEX ایکسچینج قیمت کے فرق کی نگرانی کا ڈیزائن اور نفاذ

کئی ڈی ای ایکس ایکسچینجز، بشمول dydx_v4، ہائپرلیکوڈ، ورٹیکس، اور ایوو، کو ایف ایم زیڈ پر منسلک اور منسلک کر دیا گیا ہے، چونکہ مرکزی ایکسچینجز میں قیمتوں کے ثالثی کے لیے مقابلہ تیزی سے شدید ہوتا جا رہا ہے، بہت سے مقداری تاجروں نے اپنی توجہ ڈی سنٹرلائزڈ ایکسچینجز پر مرکوز کر دی ہے، ہم اس مضمون میں C اور DEX کے ڈیزائن کے فرق پر بات کریں گے۔

ہیجنگ ثالثی حکمت عملی کا پہلا مرحلہ ہدف کے پورٹ فولیو کی قیمت کے فرق کا حساب لگانا اور مشاہدہ اور تجزیہ کرنا ہے کہ آیا کوئی تجارتی مواقع موجود ہیں۔ لہذا، قیمتوں میں فرق کی نگرانی کی حکمت عملی کو ڈیزائن اور لاگو کرنا پہلا بنیادی کام ہے:

  • پروگرامنگ زبان کا استعمال جاوا اسکرپٹ ہے۔
  • encapsulated REST انٹرفیس استعمال کریں۔
  • ڈی ای ایکس سلیکشن: ہائپر مائع، ورٹیکس۔
  • CEX انتخاب: بائننس، بائی بٹ۔
  • آرڈر بک ڈیٹا کی درخواست کرنے میں ملٹی تھریڈڈ کنکرنٹ درخواستیں استعمال ہوتی ہیں۔
  • ٹیسٹ پروڈکٹس کو مرکزی دھارے کی مصنوعات ہونی چاہئیں جس کا جتنا ممکن ہو تمام تبادلے کریں: ETH، BTC سپاٹ ٹریڈنگ جوڑے/ دائمی معاہدے
  • سادہ اور سمجھنے میں آسان کوڈ کا استعمال کرتے ہوئے ڈیزائن کو آسان بنانے اور بنیادی نفاذ فراہم کرنے کی کوشش کریں۔

کوڈ کا نفاذ

کوڈ 200 لائنوں سے کم ہے، اور اس کا ڈیزائن کردہ فنکشن صرف مختلف ایکسچینجز میں کسی خاص پروڈکٹ کی اصل وقتی قیمت کے فرق کا حساب لگانا ہے۔ جب حکمت عملی ابتدائی طور پر چلائی جائے گی، حکمت عملی کے لیے ترتیب دی گئی تمام ایکسچینج اشیاء کو DEX گروپ اور CEX گروپ میں درجہ بندی کیا جائے گا۔ ہر رائے شماری FMZ پلیٹ فارم کے ذریعے encapsulated ملٹی تھریڈڈ فنکشن تھریڈ کے ذریعے کی جاتی ہے، اور بیک وقت REST انٹرفیس کی درخواست کرتی ہے: آرڈر بک انٹرفیسGetDepthمطلوبہ اقسام کی خرید آرڈر لسٹ اور سیل آرڈر لسٹ کا ڈیٹا ریکارڈ کریں۔ پھر، DEX گروپ اور CEX گروپ کو ایک فرق کے امتزاج میں ملایا جاتا ہے (DEX-CEX مجموعہ، یعنی ثالثی جوڑا)، اور قیمت کے فرق کا حساب لگایا جاتا ہے۔

تبادلے کی قسم کا تعین: ابتدا کے دوران، اضافی ایکسچینج آبجیکٹ کا تعین کرنے کے لیے فیصلہ کیا جائے گا کہ آیا یہ سپاٹ ہے یا فیوچر۔

مختلف ایکسچینجز میں کسی خاص بنیادی اثاثے کے مختلف نام ہو سکتے ہیں، اس لیے پروڈکٹ کے نام کو ایڈجسٹ کرنے کی ضرورت ہے: پروگرام کو مختلف تبادلوں کی علامتوں کے ناموں کے قواعد کے مطابق ایڈجسٹ کرنے کی ضرورت ہے۔ مثال کے طور پر، ورٹیکس معاہدوں کے تجارتی جوڑوں کا نام درج ذیل ہے:XXX_USDجو کہ دراصل USDC پر مبنی ایک مستقل معاہدہ ہے۔ ورٹیکس کی جگہ میں ای ٹی ایچ کا نام WETH ہے۔

درستگی حاصل کریں: شروع کرنے کے دوران، پوری مارکیٹ کی معلومات درخواست کردہ مخصوص علامت کے مطابق حاصل کی جاتی ہے، متعلقہ درستگی کو بعد میں ڈیٹا کی درستگی کی کارروائیوں کے لیے استفسار کیا جا سکتا ہے۔

ڈیٹا کی درخواست تمام گہرائی کا ڈیٹا حاصل کرنے سے پہلے، پروگرام انتظار کرے گا اور جانچتا رہے گا کہ آیا ایسے ایکسچینج ہیں جن کا ڈیٹا اپ ڈیٹ نہیں ہوا ہے۔ اگر ڈیٹا حاصل نہیں کیا گیا ہے، تو پروگرام 100 ملی سیکنڈ تک سوئے گا۔ درخواست کردہ آرڈر بک ڈیٹا کو threading.Dict() کے ذریعے تخلیق کردہ ایک آبجیکٹ میں ریکارڈ کیا جاتا ہے (جو کنکرنٹ تھریڈز کے ساتھ تعامل کے لیے استعمال کیا جاتا ہے)، اور ڈیٹا کو ہر پول کے اختتام پر دوبارہ ترتیب دیا جاتا ہے۔

خلاصہ کریں۔ اس حکمت عملی کا نفاذ ظاہر کرتا ہے کہ کس طرح ایک سے زیادہ ایکسچینجز میں قیمت کے فرق کو حقیقی وقت میں مانیٹر کیا جائے اور ممکنہ ثالثی کے مواقع کا حساب لگایا جائے۔ مناسب علامت کی اصلاح، گہرے ڈیٹا کیپچر، درستگی پر قابو پانے اور ملٹی تھریڈڈ آپریشن کے ذریعے، نظام حقیقی وقت کی قیمت کے فرق کو مؤثر طریقے سے مانیٹر کر سکتا ہے۔ حکمت عملی سیکھنے والوں کے لیے، اس کوڈ کے نفاذ کے خیالات کو سمجھنے سے وہ ٹرانزیکشن ڈیٹا حاصل کرنے کے لیے API کا استعمال کرنے، متعدد ایکسچینجز سے ڈیٹا پر کارروائی کرنے کا طریقہ، ٹرانزیکشن اسپریڈز کا حساب لگانے اور آؤٹ پٹ کرنے کا طریقہ، اور اصل لین دین میں ان ٹیکنالوجیز کو کس طرح لاگو کرنا ہے۔

let symbolList = []

function createEx(idx, exs) {
    let self = {}
    
    let cexEidList = ["Binance", "Bybit", "Futures_Binance", "Futures_Bybit"]
    let dexEidList = ["Vertex", "Hyperliquid", "Futures_Hyperliquid", "Futures_Vertex"]

    self.name = exs[idx].GetName()
    self.idx = idx
    self.e = exs[idx]
    self.depths = threading.Dict()
    self.markets = self.e.GetMarkets()

    if (!self.markets) {
        throw "GetMarkets error"
    }

    if (dexEidList.includes(self.name)) {
        self.type = "DEX"
    } else if (cexEidList.includes(self.name)) {
        self.type = "CEX"
    } else {
        throw "not support " + self.name
    }

    if (self.name.startsWith("Futures_")) {
        self.isFutures = true
    } else {
        self.isFutures = false
    }

    self.correctSymbol = function(symbol) {        
        if (self.name == "Vertex") {
            let correctList = {"BTC_USDC": "WBTC_USDC", "ETH_USDC": "WETH_USDC"}
            if (typeof(correctList[symbol]) != "undefined") {
                return correctList[symbol]
            }
        } else if (self.name == "Hyperliquid") {
            let correctList = {"BTC_USDC": "UBTC_USDC"}
            if (typeof(correctList[symbol]) != "undefined") {
                return correctList[symbol]
            }
        } else if (self.name == "Futures_Hyperliquid") {
            return symbol.replace("_USDC", "_USD")
        }
        
        return symbol
    }

    self.reqDepth = function(symbol) {
        symbol = self.correctSymbol(symbol)
        threading.Thread(function(idx, symbol, threadingDict) {
            let depth = exchanges[idx].GetDepth(symbol)
            if (depth) {
                threadingDict.set(symbol, depth)
            } else {
                threadingDict.set(symbol, null)
            }
        }, self.idx, symbol, self.depths)
    }
    
    self.getPrecision = function(symbol) {
        symbol = self.correctSymbol(symbol)
        let marketInfo = self.markets[symbol]
        if (marketInfo) {
            return [marketInfo.PricePrecision, marketInfo.AmountPrecision]
        } else {
            return [8, 8]
        }
    }

    self.init = function() {
        self.depths = threading.Dict()
    }

    self.getDepth = function(symbol) {
        symbol = self.correctSymbol(symbol)
        return self.depths.get(symbol)
    }

    return self
}

function createManager(symbolList, exs) {
    let self = {}

    self.symbolList = symbolList
    self.exchanges = []
    self.hedgePair = []

    self.initHedgePair = function () {
        for (let i in exs) {
            let ex = createEx(i, exs)
            self.exchanges.push(ex)
        }

        let arrDEX = self.exchanges.filter(item => item.type == "DEX")
        let arrCEX = self.exchanges.filter(item => item.type == "CEX")

        for (let dex of arrDEX) {
            for (let cex of arrCEX) {
                self.hedgePair.push({"dex": dex, "cex": cex})
            }
        }
    }

    self.calcHedgeData = function () {
        let beginTimestamp = new Date().getTime()
        for (let e of self.exchanges) {
            for (let symbol of self.symbolList) {
                e.reqDepth(symbol)
            }
        }

        while (true) {
            let isWait = false
            for (let e of self.exchanges) {
                for (let symbol of self.symbolList) {
                    let depth = e.getDepth(symbol)
                    if (depth == null || typeof(depth) == "undefined") {
                        isWait = true
                    }
                }
            }
            if (isWait) {
                Sleep(100)
            } else {
                break
            }
        }

        let tbls = []
        for (let symbol of self.symbolList) {
            let tbl = {"type": "table", "title": symbol + "差价", "cols": ["pair", "bid-ask", "ask-bid", "dex ask", "dex bid", "cex ask", "cex bid"], "rows": []}
            for (let p of self.hedgePair) {
                let dex = p["dex"]
                let cex = p["cex"]

                let pricePrecision = Math.max(dex.getPrecision(symbol)[0], cex.getPrecision(symbol)[0])

                let dexDepth = dex.getDepth(symbol)
                let cexDepth = cex.getDepth(symbol)
                if (dexDepth && cexDepth) {
                    p["bid-ask"] = _N(dexDepth.Bids[0].Price - cexDepth.Asks[0].Price, pricePrecision)
                    p["ask-bid"] = _N(dexDepth.Asks[0].Price - cexDepth.Bids[0].Price, pricePrecision)

                    // 输出信息、观察测试
                    Log(dex.name, cex.name, symbol, "bid-ask:", p["bid-ask"], ", ask-bid", p["ask-bid"])

                    p[dex.name + "-ask"] = dexDepth.Asks[0].Price + "/" + dexDepth.Asks[0].Amount
                    p[dex.name + "-bid"] = dexDepth.Bids[0].Price + "/" + dexDepth.Bids[0].Amount
                    p[cex.name + "-ask"] = cexDepth.Asks[0].Price + "/" + cexDepth.Asks[0].Amount
                    p[cex.name + "-bid"] = cexDepth.Bids[0].Price + "/" + cexDepth.Bids[0].Amount
                } else {
                    p["bid-ask"] = "--"
                    p["ask-bid"] = "--"
                    p[dex.name + "-ask"] = "--"
                    p[dex.name + "-bid"] = "--"
                    p[cex.name + "-ask"] = "--"
                    p[cex.name + "-bid"] = "--"
                }

                let pairName = dex.name + "-" + cex.name
                tbl["rows"].push([pairName, p["bid-ask"], p["ask-bid"], p[dex.name + "-ask"], p[dex.name + "-bid"], p[cex.name + "-ask"], p[cex.name + "-bid"]])
            }
            tbls.push(tbl)
        }
                
        for (let e of self.exchanges) {
            e.init()
        }

        let endTimestamp = new Date().getTime()
        return [tbls, (endTimestamp - beginTimestamp) + "毫秒"]
    }

    self.initHedgePair()
    return self
}

function main() {
    LogReset(1)
    let loopCount = 0

    symbolList = strSymbolList.split(",")
    let m = createManager(symbolList, exchanges)
    while (true) {
        let ret = m.calcHedgeData()
        loopCount++
        LogStatus(_D(), "耗时:", ret[1], ", 轮询次数:", loopCount, "\n", "`" + JSON.stringify(ret[0]) + "`")
        Sleep(1000)
    }
}

پیرامیٹر ڈیزائن:

FMZ کی مقدار کی بنیاد پر DEX-CEX ایکسچینج قیمت کے فرق کی نگرانی کا ڈیزائن اور نفاذ

سپاٹ مارکیٹ

اسپاٹ پروڈکٹ کی نگرانی کریں:

  • BTC_USDC بٹ کوائن سے USDC جگہ

FMZ کی مقدار کی بنیاد پر DEX-CEX ایکسچینج قیمت کے فرق کی نگرانی کا ڈیزائن اور نفاذ

کنٹریکٹ مارکیٹ

دو اقسام کی نگرانی کریں:

  • ETH_USDC.swap Ethereum Perpetual Contract
  • BTC_USDC.swap بٹ کوائن دائمی معاہدہ

FMZ کی مقدار کی بنیاد پر DEX-CEX ایکسچینج قیمت کے فرق کی نگرانی کا ڈیزائن اور نفاذ

END

توسیع کی سمت:

  • لین دین کی منطق کی حد کی نگرانی اور انکیپسولیشن۔
  • فیسوں اور اخراجات کا حساب لگائیں، اور ہیجنگ اسپریڈ کی معقول حد کا حساب لگائیں۔
  • مارکیٹ ڈیٹا حاصل کرنے کے لیے ویب ساکٹ انٹرفیس کا استعمال کریں۔

FMZ پلیٹ فارم وکندریقرت ایکسچینجز (DEX) اور وکندریقرت مالیات (DeFi) کے لیے اپنی تکنیکی مدد کو بڑھانا جاری رکھے گا، اور افعال اور مصنوعات کو مسلسل اعادہ اور اپ ڈیٹ کرتا رہے گا۔

پڑھنے کے لیے آپ کا شکریہ۔