avatar of 发明者量化-小小梦 发明者量化-小小梦
پر توجہ دیں نجی پیغام
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

تو آپ نئے شامل کردہ ٹرانسفر ریکارڈز کو کیسے چیک کرتے ہیں؟ Binance دستاویزات کو پڑھنے کے بعد، میں نے محسوس کیا کہ اس انٹرفیس کے ذریعے واپس کیے گئے ڈیٹا میں ٹائم اسٹیمپ کا استعمال کرنا بہت آسان ہے جب تک کہ موجودہ ریکارڈ سے بڑا ٹائم اسٹیمپ موجود ہو۔ ہوا ہے. بس اسے ٹرگر کرنے کے لیے استعمال کریں۔

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

کوڈ کا جائزہ:

فراہم کردہ JavaScript کوڈ میں کئی فنکشنز شامل ہیں جو مل کر حالیہ اثاثوں کی منتقلی کی نگرانی کے لیے ایک نظام بناتے ہیں۔ آئیے اہم اجزاء کو توڑتے ہیں:

  • getRecentTransferHistory فنکشن:

مقصد: متعین پیرامیٹرز کے مطابق ایکسچینج API سے اثاثہ کی منتقلی کی حالیہ تاریخ حاصل کریں۔ پیرامیٹرز: ٹرانس ٹائپ (ٹرانسفر ٹائپ)، ٹائپ ڈیسک (قسم کی تفصیل)۔ API کا اختتامی نقطہ: /sapi/v1/asset/transfer۔

  • مانیٹر ٹرانسفر فنکشن:

مقصد: پہلے سے طے شدہ منتقلی کی اقسام پر اعادہ کرتا ہے، حالیہ منتقلی کی تاریخ کو بازیافت کرتا ہے، اور کسی بھی نئی منتقلی کو ریکارڈ کرتا ہے۔ منتقلی کی اقسام کو انسانی پڑھنے کے قابل وضاحتوں پر نقشہ بنانے کے لیے ایک لغت (dicType) استعمال کریں۔ ہر قسم کی تازہ ترین منتقلی کو ٹریک کرنے کے لیے مانیٹر آبجیکٹ کو اپ ڈیٹ کریں۔

  • اہم تقریب:

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

اہم خصوصیات:

  • ڈائنامک ٹرانسفر ٹائپ میپنگ:

کوڈ ایک لغت (dicType) کا استعمال کرتا ہے تاکہ منتقلی کی اقسام کو وضاحتی ناموں سے نقشہ بنایا جا سکے، جو ہر منتقلی کی نوعیت کی واضح وضاحت فراہم کرتا ہے۔

  • اصل وقت کی نگرانی:

سسٹم مسلسل نئی منتقلیوں کی جانچ کرتا ہے، مانیٹر آبجیکٹ کو اپ ڈیٹ کرتا ہے اور کسی بھی تبدیلی کا پتہ لگاتا ہے۔

  • ڈیٹا پریزنٹیشن:

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

  • حالیہ منتقلی کی تاریخ کا انتظام:

ایک مختصر اور بروقت ڈسپلے کو یقینی بناتے ہوئے، ہر قسم کے لیے حالیہ منتقلیوں کی اسکرولنگ فہرست کو برقرار رکھیں۔

حقیقی امتحان

ایک منتقلی دستی طور پر کی گئی تھی اور پروگرام نے ٹرانسفر آپریشن کا پتہ لگایا۔

FMZ کوانٹیفیکیشن: کرپٹو کرنسی مارکیٹ میں کامن ڈیمانڈ ڈیزائن کی مثالوں کا تجزیہ (حصہ 2)

FMZ کوانٹیفیکیشن: کرپٹو کرنسی مارکیٹ میں کامن ڈیمانڈ ڈیزائن کی مثالوں کا تجزیہ (حصہ 2)

END:

فراہم کردہ JavaScript کوڈ cryptocurrency کے تبادلے پر حالیہ اثاثوں کی منتقلی کی نگرانی کے لیے ایک طاقتور حل فراہم کرتا ہے۔ اس کی متحرک اور حقیقی وقت کی نوعیت اسے مختلف بٹوے کے درمیان اثاثوں کی نقل و حرکت کو سمجھنے کی کوشش کرنے والے تاجروں اور ڈویلپرز کے لیے ایک قیمتی ٹول بناتی ہے۔ اس کوڈ میں ترمیم اور مخصوص ضروریات کے مطابق تخصیص کیا جا سکتا ہے، جو اپنی کریپٹو کرنسی ٹریڈنگ کی حکمت عملیوں کو بڑھانے یا نگرانی کی اضافی صلاحیتوں کو تیار کرنے کے خواہاں افراد کے لیے ایک مضبوط بنیاد فراہم کرتے ہیں۔

یہ مضمون ایک ڈیزائن آئیڈیا فراہم کرنے کے لیے صرف ایک نقطہ آغاز ہے مجھے امید ہے کہ آپ کا کریپٹو کرنسی کا کاروبار معلوماتی اور کامیاب ہوگا!