4
ध्यान केंद्रित करना
1271
समर्थक

FMZ परिमाणीकरण: क्रिप्टोकरेंसी बाजार में सामान्य मांग डिजाइन उदाहरणों का विश्लेषण (भाग 2)

में बनाया: 2023-12-24 22:24:58, को अपडेट: 2023-12-25 17:10:56
comments   1
hits   1511

FMZ परिमाणीकरण: क्रिप्टोकरेंसी बाजार में सामान्य मांग डिजाइन उदाहरणों का विश्लेषण (भाग 2)

पिछले लेख में पाठक की टिप्पणी के जवाब में, अनुबंध खाता हस्तांतरण की निगरानी के लिए एक कार्यक्रम उदाहरण की आवश्यकता है। इस अंक में, हम इस आवश्यकता को प्राप्त करने के लिए परीक्षण वस्तु के रूप में बिनेंस एक्सचेंज का उपयोग करेंगे और सीखेंगे कि इसे कैसे डिज़ाइन किया जाए।

क्रिप्टोकरेंसी एक्सचेंज हर दिन बड़ी संख्या में लेनदेन की प्रक्रिया करते हैं, जिसमें विभिन्न वॉलेट्स के बीच परिसंपत्तियों का स्थानांतरण भी शामिल है। व्यापारियों और डेवलपर्स के लिए इन स्थानांतरणों की वास्तविक समय में निगरानी करना महत्वपूर्ण है। यह आलेख एक क्रिप्टोकरेंसी एक्सचेंज पर हाल ही में हुए परिसंपत्ति हस्तांतरण की निगरानी करने के लिए डिज़ाइन किए गए जावास्क्रिप्ट कोड के एक भाग का पता लगाएगा और इसके प्रमुख घटकों पर चर्चा करेगा।

आवश्यकताओं का विश्लेषण करें

बिनेंस एक्सचेंज के दस्तावेज़ों से परामर्श करने के बाद, मैंने पाया कि एक स्थानांतरण इतिहास इंटरफ़ेस है जो सभी स्थानांतरण जानकारी को क्वेरी कर सकता है। चूंकि हम केवल संभावित स्थानांतरण रिकॉर्ड की निगरानी कर रहे हैं, इसलिए हमें सभी स्थानांतरण इतिहास प्राप्त करने की आवश्यकता नहीं है। हमें केवल एक निश्चित सीमा के भीतर एक निश्चित आवृत्ति पर हाल के स्थानांतरण रिकॉर्ड की जांच करने की आवश्यकता है। यदि कोई नया स्थानांतरण रिकॉर्ड पाया जाता है, तो उसे अद्यतन कर सूचित किया जाएगा।

इस इंटरफ़ेस का उपयोग करें:

// GET /sapi/v1/asset/transfer type, size : 100

तो फिर आप नये जोड़े गए स्थानांतरण रिकार्ड की जांच कैसे करेंगे? बिनेंस डॉक्यूमेंटेशन पढ़ने के बाद, मैंने पाया कि इस इंटरफ़ेस द्वारा लौटाए गए डेटा में टाइमस्टैम्प शामिल हैं। निर्णय लेने के लिए टाइमस्टैम्प का उपयोग करना बहुत सरल है। जब तक वर्तमान रिकॉर्ड से बड़ा टाइमस्टैम्प वाला रिकॉर्ड है, इसका मतलब है कि एक नया ट्रांसफर हो गई है। । बस इसे ट्रिगर करने के लिए इसका उपयोग करें।

/sapi/v1/asset/transferइंटरफ़ेस हर बार अधिकतम 100 डेटा टुकड़ों का अनुरोध करता है। यह पहचान कम आवृत्ति वाले ट्रांसफ़र के लिए समस्याएँ पैदा नहीं करेगी जब तक कि खाते में एक पहचान के अंत और अगली पहचान की शुरुआत के बीच 100 से ज़्यादा ट्रांसफ़र ऑपरेशन न हों। इस समय, कुछ नए ऑपरेशन रिकॉर्ड छूट सकते हैं, जो सामान्य मांग परिदृश्यों के लिए पर्याप्त है (आमतौर पर फंड को पागलपन से स्थानांतरित करने की कोई रणनीति नहीं होगी …)।

बेशक, वास्तविक डिज़ाइन में कई विवरण हैं। उदाहरण के लिए, दस्तावेज़ की जाँच करते समय, हम पाते हैं कि रोटेशन की कई दिशाएँ हैं, इसलिए हमें रोटेशन की प्रत्येक दिशा की निगरानी करने की आवश्यकता है। कोड परिभाषित करता हैvar dicType = {...}सभी स्थानांतरण निर्देशों का प्रबंधन करना।

सामग्री को बेहतर ढंग से प्रदर्शित करने के लिए, हम रणनीति इंटरफ़ेस में अंतिम पांच स्थानांतरण जानकारी को आउटपुट करने के लिए एक स्टेटस बार तालिका का उपयोग करते हैं, इसलिए हम एक तालिका बनाते हैं जिसे कहा जाता है:monitorडेटा रिकॉर्ड करने के लिए प्रयुक्त वस्तु. बेशक आप अनिश्चित काल तक स्थानांतरण जानकारी रिकॉर्ड नहीं कर सकते, इसलिए हम प्रत्येक स्थानांतरण दिशा के लिए केवल 100 रिकॉर्ड बनाए रखते हैं। यदि 100 से अधिक रिकॉर्ड हैं, तो समय से पहले रिकॉर्ड हटा दिए जाएंगे।

कोड उदाहरण

function getRecentTransferHistory(TransType, typeDesc) {
	// GET /sapi/v1/asset/transfer type, size : 100
    
    var rows = null 
    var ret = exchange.IO("api", "GET", "/sapi/v1/asset/transfer", `type=${TransType}&size=100`)
    Log("/sapi/v1/asset/transfer" + `type=${TransType}&size=100`)
    if (ret && typeof(ret.rows) != "undefined" && Array.isArray(ret.rows)) {
        rows = ret.rows
    } else if (ret && typeof(ret.total) != "undefined" && ret.total == 0) {
        rows = []
    } else {
    	Log(TransType, typeDesc, "查询失败", ret)
    }
    
    return rows
}

var monitor = {}
function monitorTransfers() {
    var dicType = {
        "MAIN_UMFUTURE": "现货钱包 --> U本位合约钱包",
        "MAIN_CMFUTURE": "现货钱包 --> 币本位合约钱包",
        "UMFUTURE_MAIN": "U本位合约钱包 --> 现货钱包",
        "UMFUTURE_MARGIN": "U本位合约钱包 --> 杠杆全仓钱包",
        "CMFUTURE_MAIN": "币本位合约钱包 --> 现货钱包",
        "MARGIN_UMFUTURE": "杠杆全仓钱包 --> U本位合约钱包",
        "MARGIN_CMFUTURE": "杠杆全仓钱包 --> 币本位合约钱包",
        "CMFUTURE_MARGIN": "币本位合约钱包 --> 杠杆全仓钱包",
        "FUNDING_UMFUTURE": "资金钱包 --> U本位合约钱包",
        "UMFUTURE_FUNDING": "U本位合约钱包 --> 资金钱包",
        "FUNDING_CMFUTURE": "资金钱包 --> 币本位合约钱包",
        "CMFUTURE_FUNDING": "币本位合约钱包 --> 资金钱包",
        "UMFUTURE_OPTION": "U本位合约钱包 --> 期权钱包",
        "OPTION_UMFUTURE": "期权钱包 --> U本位合约钱包",
        // 统一账户
        "MAIN_PORTFOLIO_MARGIN": "现货钱包 --> 统一账户钱包",
        "PORTFOLIO_MARGIN_MAIN": "统一账户钱包 --> 现货钱包"
    }
    
    Log("开始检测")
    _.each(dicType, function(v, k) {
        var rows = getRecentTransferHistory(k, v)
        var maxTS = 0
        _.each(rows, function(row) {
            if (typeof(monitor[k]) == "undefined") {
            	monitor[k] = {"transType": k, "typeDesc": v, "recentRecords": [], "lastTS": 0}            	
            }

            if (row["timestamp"] > monitor[k]["lastTS"]) {
                monitor[k]["recentRecords"].push(row)
                
                if (monitor[k]["lastTS"] != 0) {
                	Log("检测到新增划转记录", k, v, row, "#FF0000")
                }                
            }
            maxTS = Math.max(maxTS, row["timestamp"])     
        })
        if (rows && rows.length == 0) {
            return 
        }
        monitor[k]["lastTS"] = maxTS

        var sortedArrayAscending = monitor[k]["recentRecords"].slice().sort((a, b) => a.timestamp - b.timestamp)
        monitor[k]["recentRecords"] = sortedArrayAscending

        if (monitor[k]["recentRecords"].length > 100) {
        	monitor[k]["recentRecords"].shift()
        }
        Sleep(1000)
    })
    Log("开始结束")
}


function main() {
    LogReset()
    while (true) {
        monitorTransfers()

        var tbls = []
        _.each(monitor, function(v, k) {
        	var tbl = {
        		"type": "table", 
        		"title": v["typeDesc"], 
        		"cols": ["asset", "amount", "status", "tranId", "time"], 
        		"rows": []
        	}

            var arr = v["recentRecords"].slice().sort((a, b) => b.timestamp - a.timestamp)
            for (var i = 0; i < arr.length; i++) {
            	if (i < 5) {
            		tbl["rows"].push([arr[i]["asset"], arr[i]["amount"], arr[i]["status"], arr[i]["tranId"], _D(arr[i]["timestamp"])])
            	}            	
            }
            tbls.push(tbl)
        })        

    	LogStatus(_D(), "\n", "`" + JSON.stringify(tbls) + "`")
    	Sleep(1000 * 30)
    }
}

कोड अवलोकन:

प्रदान किए गए जावास्क्रिप्ट कोड में कई फ़ंक्शन शामिल हैं जो मिलकर हाल के परिसंपत्ति हस्तांतरण की निगरानी के लिए एक प्रणाली का निर्माण करते हैं। आइये मुख्य घटकों का विश्लेषण करें:

  • getRecentTransferHistory फ़ंक्शन:

उद्देश्य: निर्दिष्ट मापदंडों के अनुसार एक्सचेंज एपीआई से हालिया परिसंपत्ति हस्तांतरण इतिहास प्राप्त करें। पैरामीटर: ट्रांसटाइप (स्थानांतरण प्रकार), टाइपडिस्क (प्रकार विवरण)। API समापन बिंदु: /sapi/v1/asset/transfer.

  • मॉनिटरट्रांसफर फ़ंक्शन:

उद्देश्य: पूर्वनिर्धारित स्थानांतरण प्रकारों पर पुनरावृत्ति करना, नवीनतम स्थानांतरण इतिहास को पुनः प्राप्त करना, तथा किसी भी नए स्थानांतरण को रिकॉर्ड करना। स्थानांतरण प्रकारों को मानव-पठनीय विवरणों से मैप करने के लिए शब्दकोश (dicType) का उपयोग करें। प्रत्येक प्रकार के नवीनतम स्थानांतरण को ट्रैक करने के लिए मॉनिटर ऑब्जेक्ट को अपडेट करें।

  • मुख्य समारोह:

उद्देश्य: एक अनंत लूप चलाना जो लगातार स्थानांतरणों की निगरानी करता है और नवीनतम डेटा प्रदर्शित करता है। समय-समय पर मॉनिटरट्रांसफर फ़ंक्शन का उपयोग करें। प्रत्येक स्थानांतरण प्रकार के लिए एक तालिका बनाएं, जिसमें परिसंपत्ति, राशि, स्थिति, लेनदेन आईडी और टाइमस्टैम्प जैसे कॉलम शामिल हों।

प्रमुख विशेषताऐं:

  • गतिशील स्थानांतरण प्रकार मैपिंग:

कोड स्थानांतरण प्रकारों को वर्णनात्मक नामों से मैप करने के लिए एक शब्दकोष (dicType) का उपयोग करता है, जो प्रत्येक स्थानांतरण की प्रकृति का स्पष्ट विवरण प्रदान करता है।

  • वास्तविक समय में निगरानी:

सिस्टम लगातार नए स्थानांतरणों की जांच करता है, मॉनिटर ऑब्जेक्ट को अद्यतन करता है तथा किसी भी पाए गए परिवर्तन को लॉग करता है।

  • डेटा की प्रस्तुति:

प्रत्येक प्रकार के स्थानांतरण डेटा को प्रस्तुत करने के लिए एक तालिका का उपयोग करें, जिसमें परिसंपत्ति, राशि, स्थिति, लेनदेन आईडी और टाइमस्टैम्प जैसे प्रासंगिक विवरण शामिल हों।

  • हालिया स्थानांतरण इतिहास प्रबंधन:

प्रत्येक प्रकार के नवीनतम स्थानांतरणों की एक स्क्रॉलिंग सूची बनाए रखें, जिससे संक्षिप्त और समयबद्ध प्रदर्शन सुनिश्चित हो सके।

वास्तविक परीक्षण

स्थानांतरण मैन्युअल रूप से किया गया और प्रोग्राम ने स्थानांतरण ऑपरेशन का पता लगा लिया।

FMZ परिमाणीकरण: क्रिप्टोकरेंसी बाजार में सामान्य मांग डिजाइन उदाहरणों का विश्लेषण (भाग 2)

FMZ परिमाणीकरण: क्रिप्टोकरेंसी बाजार में सामान्य मांग डिजाइन उदाहरणों का विश्लेषण (भाग 2)

END:

प्रदान किया गया जावास्क्रिप्ट कोड क्रिप्टोकरेंसी एक्सचेंजों पर हाल के परिसंपत्ति हस्तांतरण की निगरानी के लिए एक शक्तिशाली समाधान प्रदान करता है। इसकी गतिशील और वास्तविक समय प्रकृति इसे विभिन्न वॉलेट्स के बीच परिसंपत्तियों की आवाजाही को समझने के इच्छुक व्यापारियों और डेवलपर्स के लिए एक मूल्यवान उपकरण बनाती है। इस कोड को विशिष्ट आवश्यकताओं के अनुसार संशोधित और अनुकूलित किया जा सकता है, जो उन लोगों के लिए एक ठोस आधार प्रदान करता है जो अपनी क्रिप्टोकरेंसी ट्रेडिंग रणनीतियों को बढ़ाना चाहते हैं या अतिरिक्त निगरानी क्षमताओं को विकसित करना चाहते हैं।

यह लेख केवल एक डिज़ाइन विचार प्रदान करने के लिए एक प्रारंभिक बिंदु है। मुझे उम्मीद है कि आपका क्रिप्टोक्यूरेंसी व्यवसाय जानकारीपूर्ण और सफल दोनों होगा!