ایف ایم زیڈ کی بنیاد پر آرڈر سنک مینجمنٹ سسٹم ڈیزائن (1)

مصنف:چھوٹا سا خواب, تخلیق: 2022-02-14 19:46:30, تازہ کاری: 2023-09-15 20:44:11

img

ایف ایم زیڈ کی بنیاد پر آرڈر سنک مینجمنٹ سسٹم ڈیزائن (1)

ایف ایم زیڈ کے سابقہ مضامین میں ہم نے کئی احکامات اور اسٹوریج ہم وقت سازی کی حکمت عملیوں کو ڈیزائن کیا ہے۔

یہ ایک حکمت عملی میں حوالہ جات اور ہم وقت سازی کے اکاؤنٹس کو منظم کرنے کے لئے ہیں. آج ہم ایک مختلف ڈیزائن کی کوشش کر رہے ہیں، FMZ کوالٹی ٹریڈنگ پلیٹ فارم کے طاقتور توسیع API انٹرفیس پر مبنی، ہم ایک آرڈر ہم وقت سازی کے انتظام کے نظام کو ڈیزائن کرتے ہیں.

ڈیزائن کے خیالات

پہلے ہمیں کچھ اچھی تجاویز کی ضرورت ہے، ضروریات کی ضرورت ہے۔ مندرجہ بالا دو سابقہ احکامات، اسٹاک ہولڈنگ کی ہم آہنگی کی حکمت عملی میں کچھ واضح درد کے نقطے ہیں، آئیے ان پر تبادلہ خیال کریں:

  • 1، ہم آہنگی کی حکمت عملی کا عملی طور پر نفاذ کرنے والے کو حوالہ اکاؤنٹ کے لئے ایکسچینج API KEY، ہم آہنگی اکاؤنٹ کے لئے ایکسچینج API KEY ہونا ضروری ہے۔ یہ مسئلہ استعمال کے منظرنامے کے لئے ہے: اپنے دوسرے ایکسچینج اکاؤنٹس کو اپنے اکاؤنٹ کے ساتھ ساتھ رکھنا ٹھیک ہے۔ لیکن حوالہ اکاؤنٹ اور ہم وقت سازی والے اکاؤنٹس کے لئے ایک ہی مالک کے منظر نامے کے لئے یہ پریشانی کا باعث بن سکتا ہے۔ ہم وقت سازی والے اکاؤنٹس کے مالکان کبھی کبھی سیکیورٹی کی وجوہات کی بناء پر اپنے ایکسچینج اکاؤنٹ کی API KEY فراہم کرنے سے گریز کرتے ہیں۔ لیکن API KEY فراہم کرنے کے بغیر کس طرح ایک ہی تجارت کو ہم وقت سازی کرنا ہے؟

    حل: ایف ایم زیڈ کے توسیعی API انٹرفیس کا استعمال کرتے ہوئے ، ہم آہنگی والے اکاؤنٹ کے مالک (ملاحظہ کرنے والے) کو صرف ایف ایم زیڈ کوالٹی ٹریڈنگ پلیٹ فارم میں اندراج کرنا ہوگا ، اور پھر اس نظام میں سے ایک حکمت عملی (جو اس مضمون کے لئے ڈیزائن کیا گیا ہے) کو چلانا ہوگا:订单同步管理系统(Synchronous Server)اس کے بعد FMZ کی توسیع API KEY (نوٹ، ایکسچینج اکاؤنٹ کی API KEY نہیں) ، آرڈر سنکرونس سرورز کی ڈیوائس ID کو حوالہ اکاؤنٹ کے مالک کو فراہم کیا جا سکتا ہے. جب حوالہ اکاؤنٹ ہولڈر (بنیادی ڈسک) کے اکاؤنٹ ہولڈر (بنیادی ڈسک) کو اس نظام میں ڈیزائن کیا گیا ہے订单同步管理系统类库(Single Server)(ایس او پی) ایک سگنل بھیجتا ہے، ہم آہنگی اکاؤنٹ ہولڈر کے اصلی ڈسک کو ایک ٹرانزیکشن سگنل موصول ہوتا ہے، جس کے بعد خود کار طریقے سے حکم دیا جاتا ہے.

  • 2، بہت سے ڈویلپرز کے پاس بہتر حکمت عملی ہے جو اوپر بیان کردہ دو متوقع احکامات ، اسٹاک میں مطابقت پذیری کی حکمت عملی کا استعمال نہیں کرسکتے ہیں۔ کیونکہ اس طرح کی حکمت عملی کو ان مطابقت پذیری کی حکمت عملیوں کے ساتھ جوڑنے کی ضرورت ہوتی ہے ، اس کے لئے حکمت عملی میں بڑی تبدیلی اور محنت کی ضرورت پڑسکتی ہے۔ کیا آپ کے پاس اپنی کچھ معیاری حکمت عملیوں کو براہ راست اپ گریڈ کرنے کا کوئی اچھا طریقہ ہے؟ حل: ایک آرڈر ہم آہنگ ٹیمپلیٹ کلاس لائبریری (اس نظام میں ڈیزائن کیا گیا ہے) ڈیزائن کر سکتے ہیں订单同步管理系统类库(Single Server)اس طرح کی حکمت عملی کے ساتھ ، آپ کو اپنے اکاؤنٹ کے مالک کو براہ راست اس ٹیمپلیٹ کو اپنی پالیسی میں سرایت کرنے کی اجازت دی جاسکتی ہے۔

  • 3، ایک اضافی فلیش ڈسک کو کم کریں۔ ایک آخری تکلیف یہ ہے کہ اگر اوپر بیان کردہ دو دورانیے کے احکامات ، ہولڈنگ ہم وقت سازی کی حکمت عملی استعمال کی جاتی ہے تو ، اضافی طور پر ایک حقیقی مانیٹرنگ ریفرنس اکاؤنٹ کھولنے کی ضرورت ہوتی ہے۔ حل: ٹیمپلیٹ کلاس لائبریری کا استعمال کرتے ہوئے ، افعال کو حوالہ اکاؤنٹ کی پالیسی میں سرایت کریں۔

اس نظام کے دو حصے ہیں: 1، آرڈر ہم وقت سازی کے انتظام کے نظام کی کلاس لائبریری ((Single Server) 2، آرڈر سنکرونس مینجمنٹ سسٹم (Synchronous Server)

اگر آپ کو اپنی ضروریات کا پتہ چل گیا ہے تو ، پھر ڈیزائن کرنا شروع کریں!

ڈیزائن 1: آرڈر ہم وقت سازی کے انتظام کے نظام کی کلاس لائبریری (سنگل سرور)

نوٹ کریں کہ یہ کوئی حکمت عملی نہیں ہے۔ یہ ایک FMZ ٹیمپلیٹ لائبریری ہے۔ ٹیمپلیٹ لائبریری کے بارے میں تصورات کو FMZ API دستاویزات میں تلاش کیا جاسکتا ہے ، جو یہاں مزید نہیں ہے۔

ٹیمپلیٹ کلاس لائبریری کا کوڈ:

// 全局变量
var keyName_label = "label"
var keyName_robotId = "robotId"
var keyName_extendAccessKey = "extendAccessKey"
var keyName_extendSecretKey = "extendSecretKey"
var fmzExtendApis = parseConfigs([config1, config2, config3, config4, config5])
var mapInitRefPosAmount = {}

function parseConfigs(configs) {
    var arr = []
    _.each(configs, function(config) {
        if (config == "") {
            return 
        }
        var strArr = config.split(",")
        if (strArr.length != 4) {
            throw "configs error!"
        }
        var obj = {}
        obj[keyName_label] = strArr[0]
        obj[keyName_robotId] = strArr[1]
        obj[keyName_extendAccessKey] = strArr[2]
        obj[keyName_extendSecretKey] = strArr[3]
        arr.push(obj)
    })
    return arr 
}

function getPosAmount(pos, ct) {
    var longPosAmount = 0
    var shortPosAmount = 0
    _.each(pos, function(ele) {
        if (ele.ContractType == ct && ele.Type == PD_LONG) {
            longPosAmount = ele.Amount
        } else if (ele.ContractType == ct && ele.Type == PD_SHORT) {
            shortPosAmount = ele.Amount
        }
    })
    var timestamp = new Date().getTime()
    return {ts: timestamp, long: longPosAmount, short: shortPosAmount}
}

function sendCommandRobotMsg (robotId, accessKey, secretKey, msg) {
    // https://www.fmz.com/api/v1?access_key=xxx&secret_key=yyyy&method=CommandRobot&args=[186515,"ok12345"]
    var url = "https://www.fmz.com/api/v1?access_key=" + accessKey + "&secret_key=" + secretKey + "&method=CommandRobot&args=[" + robotId + ',"' + msg + '"]'
    Log(url)
    var ret = HttpQuery(url)
    return ret 
}

function follow(nowPosAmount, symbol, ct, type, delta) {
    var msg = ""
    var nowAmount = type == PD_LONG ? nowPosAmount.long : nowPosAmount.short
    if (delta > 0) {
        // 开仓
        var tradeDirection = type == PD_LONG ? "buy" : "sell"
        // 发送信号
        msg = symbol + "," + ct + "," + tradeDirection + "," + Math.abs(delta)        
    } else if (delta < 0) {
        // 平仓
        var tradeDirection = type == PD_LONG ? "closebuy" : "closesell"
        if (nowAmount <= 0) {
            Log("未检测到持仓")
            return 
        }
        // 发送信号
        msg = symbol + "," + ct + "," + tradeDirection + "," + Math.abs(delta)
    } else {
        throw "错误"
    }
    if (msg) {
        _.each(fmzExtendApis, function(extendApiConfig) {
            var ret = sendCommandRobotMsg(extendApiConfig[keyName_robotId], extendApiConfig[keyName_extendAccessKey], extendApiConfig[keyName_extendSecretKey], msg)
            Log("调用CommandRobot接口,", "label:", extendApiConfig[keyName_label], ", msg:", msg, ", ret:", ret)
            Sleep(1000)
        })
    }
}

$.PosMonitor = function(exIndex, symbol, ct) {    
    var ts = new Date().getTime()
    var ex = exchanges[exIndex]
    // 判断ex类型
    var exName = ex.GetName()
    var isFutures = exName.includes("Futures_")
    var exType = isFutures ? "futures" : "spot"
    if (!isFutures) {
        throw "仅支持期货跟单"
    }

    if (exType == "futures") {
        // 缓存 symbol ct
        var buffSymbol = ex.GetCurrency()
        var buffCt = ex.GetContractType()

        // 切换到对应的交易对、合约代码
        ex.SetCurrency(symbol)
        if (!ex.SetContractType(ct)) {
            throw "SetContractType failed"
        }

        // 监控持仓
        var keyInitRefPosAmount = "refPos-" + exIndex + "-" + symbol + "-" + ct    // refPos-exIndex-symbol-contractType
        var initRefPosAmount = mapInitRefPosAmount[keyInitRefPosAmount]
        if (!initRefPosAmount) {
            // 没有初始化数据,初始化          
            mapInitRefPosAmount[keyInitRefPosAmount] = getPosAmount(_C(ex.GetPosition), ct)
            initRefPosAmount = mapInitRefPosAmount[keyInitRefPosAmount]
        }

        // 监控
        var nowRefPosAmount = getPosAmount(_C(ex.GetPosition), ct)
        // 计算仓位变动
        var longPosDelta = nowRefPosAmount.long - initRefPosAmount.long
        var shortPosDelta = nowRefPosAmount.short - initRefPosAmount.short

        // 检测变动
        if (!(longPosDelta == 0 && shortPosDelta == 0)) {
            // 执行多头动作
            if (longPosDelta != 0) {
                Log(ex.GetName(), ex.GetLabel(), symbol, ct, "执行多头跟单,变动量:", longPosDelta)
                follow(nowRefPosAmount, symbol, ct, PD_LONG, longPosDelta)
            }
            // 执行空头动作
            if (shortPosDelta != 0) {
                Log(ex.GetName(), ex.GetLabel(), symbol, ct, "执行空头跟单,变动量:", shortPosDelta)
                follow(nowRefPosAmount, symbol, ct, PD_SHORT, shortPosDelta)
            }

            // 执行跟单操作后,更新
            mapInitRefPosAmount[keyInitRefPosAmount] = nowRefPosAmount
        }

        // 恢复 symbol ct
        ex.SetCurrency(buffSymbol)
        ex.SetContractType(buffCt)
    } else if (exType == "spot") {
        // 现货
    }
}

$.getTbl = function() {
    var tbl = {
        "type" : "table", 
        "title" : "同步数据", 
        "cols" : [], 
        "rows" : []
    }
    // 构造表头
    tbl.cols.push("监控账户:refPos-exIndex-symbol-contractType")
    tbl.cols.push(`监控持仓:{"时间戳":xxx,"多头持仓量":xxx,"空头持仓量":xxx}`)
    _.each(fmzExtendApis, function(extendApiData, index) {
        tbl.cols.push(keyName_robotId + "-" + index)
    })
    
    // 写入数据
    _.each(mapInitRefPosAmount, function(initRefPosAmount, key) {
        var arr = [key, JSON.stringify(initRefPosAmount)]
        _.each(fmzExtendApis, function(extendApiData) {
            arr.push(extendApiData[keyName_robotId])
        })
        tbl.rows.push(arr)
    })

    return tbl
}

// 引用该模板类库的策略调用范例
function main() {
    // 清除所有日志
    LogReset(1)

    // 切换到OKEX 模拟盘测试
    exchanges[0].IO("simulate", true)

    // 设置合约
    exchanges[0].SetCurrency("ETH_USDT")
    exchanges[0].SetContractType("swap")

    // 定时交易时间间隔
    var tradeInterval = 1000 * 60 * 3        // 三分钟交易一次,用于观察跟单信号
    var lastTradeTS = new Date().getTime()
    
    while (true) {
        // 策略其它逻辑...

        // 用于测试的模拟交易触发
        var ts = new Date().getTime()
        if (ts - lastTradeTS > tradeInterval) {
            Log("模拟带单策略发生交易,持仓变化", "#FF0000")
            exchanges[0].SetDirection("buy")
            exchanges[0].Buy(-1, 1)
            lastTradeTS = ts
        }

        // 使用模板的接口函数
        $.PosMonitor(0, "ETH_USDT", "swap")    // 可以设置多个监控,监控带单策略上的不同的exchange对象  
        var tbl = $.getTbl()
        
        // 显示状态栏
        LogStatus(_D(), "\n" + "`" + JSON.stringify(tbl) + "`")
        Sleep(1000)
    }
}

یہ ایک سادہ ڈیزائن ہے اور اس میں دو افعال ہیں۔ جب ایف ایم زیڈ پلیٹ فارم پر ایک پروگرام کی تجارت کی حکمت عملی کا حوالہ دیا جاتا ہے订单同步管理系统类库(Single Server)ٹیمپلیٹ کلاس لائبریری کے بعد۔ اس حکمت عملی کو مندرجہ ذیل فنکشن کا استعمال کرتے ہوئے استعمال کیا جا سکتا ہے۔

  • $$ پوس مانیٹر اس فنکشن کا کردار ایک تبادلے کی حکمت عملی میں اسٹاک ہولڈنگ کی تبدیلیوں کی نگرانی کرنا ہے ، اور پھر ٹرانزیکشن سگنل بھیجنا ہے جو ٹیمپلیٹ: آرڈر سنک مینجمنٹ سسٹم لائبریری (سنگل سرور) کی پیرامیٹرز میں طے شدہ فکسڈ ڈسک پر ہے۔

  • .getTbl ہم آپ کو اس کے بارے میں بتاتے ہیں:

مثال کے طور پر: آرڈر مطابقت پذیری مینجمنٹ سسٹم کلاس لائبریری (سنگل سرور ٹیمپلیٹ)mainفنکشن میں:

// 引用该模板类库的策略调用范例
function main() {
    // 清除所有日志
    LogReset(1)

    // 切换到OKEX 模拟盘测试
    exchanges[0].IO("simulate", true)

    // 设置合约
    exchanges[0].SetCurrency("ETH_USDT")
    exchanges[0].SetContractType("swap")

    // 定时交易时间间隔
    var tradeInterval = 1000 * 60 * 3        // 三分钟交易一次,用于观察跟单信号
    var lastTradeTS = new Date().getTime()
    
    while (true) {
        // 策略其它逻辑...

        // 用于测试的模拟交易触发
        var ts = new Date().getTime()
        if (ts - lastTradeTS > tradeInterval) {
            Log("模拟带单策略发生交易,持仓变化", "#FF0000")
            exchanges[0].SetDirection("buy")
            exchanges[0].Buy(-1, 1)
            lastTradeTS = ts
        }

        // 使用模板的接口函数
        $.PosMonitor(0, "ETH_USDT", "swap")    // 可以设置多个监控,监控带单策略上的不同的exchange对象  
        var tbl = $.getTbl()
        
        // 显示状态栏
        LogStatus(_D(), "\n" + "`" + JSON.stringify(tbl) + "`")
        Sleep(1000)
    }
}

ایک ٹیمپلیٹ کلاس لائبریری اپنے آپ میں ایک پالیسی ورڈپریس بھی تشکیل دے سکتی ہے ، جو عام طور پر ٹیمپلیٹ کلاس لائبریریوں کی جانچ کے لئے استعمال ہوتی ہے۔ مثال کے طور پر ، اس ٹیمپلیٹ کی جانچ۔ آپ ٹیمپلیٹ میں موجود حکمت عملی کو سمجھ سکتے ہیں۔mainآپ کے پاس ایک فنکشن ہے جو آپ کی اپنی حکمت عملی ہےmainفنکشن۔

ٹیسٹ کوڈ OKEX ڈسک کے ساتھ ٹیسٹ کرنے کے لئے لکھا گیا ہے ، جس میں FMZ پر OKEX ڈسک کے API KEY کو بطور حوالہ اکاؤنٹ (ٹائپ) تشکیل دینے کی ضرورت ہوتی ہے ، جس میں مرکزی فنکشن میں ڈسک پر سوئچ کرنا شروع ہوتا ہے۔ پھر ٹرانزیکشن جوڑی کو ETH_USDT پر سیٹ کریں ، اور معاہدہ کو مستقل طور پر سیٹ کریں (سواپ) ؛ پھر ایک while لوپ میں داخل ہوں۔ ہر 3 منٹ میں ایک بار لوپ میں ایک بار ٹرانزیکشن کی ترتیب دیں ، جس سے ڈسک کی حکمت عملی ٹریڈنگ کو متحرک کرنے کے لئے استعمال ہوتا ہے۔ جبکہ لوپ میں کال کیا جاتا ہے۔$.PosMonitor(0, "ETH_USDT", "swap")اس فنکشن کو کال کرنے کے لئے ، اس کی پہلی پیرامیٹر 0 میں منتقل کی جاتی ہے ، جس کا مطلب ہے کہ مانیٹرنگ ایکسچینج [0] اس تبادلے کا اعتراض ، جس میں ETH_USDT ٹریڈنگ جوڑی ، تبادلہ معاہدہ کی نگرانی کی جاتی ہے۔ پھر کال کریں۔$.getTbl()چارٹ کی معلومات حاصل کریں، استعمال کریںLogStatus(_D(), "\n" + "`" + JSON.stringify(tbl) + "`")چارٹ کے اعداد و شمار کو اسٹیٹ بار پر ظاہر کریں۔

تو آپ دیکھیں، صرف اس بات کو یقینی بنائیں کہ آپ اس ٹیمپلیٹ کا حوالہ دیتے ہوئے کسی حکمت عملی میں استعمال کرتے ہیں.$.PosMonitor(0, "ETH_USDT", "swap")اس کے علاوہ ، آپ کو اس بات کا یقین کرنے کی ضرورت ہے کہ آپ کی حکمت عملی میں ایک قسم کی ہولڈنگ کی نگرانی ، ہولڈنگ کی تبدیلیوں کو پیغام بھیجنے کی صلاحیت ہے۔

ٹیسٹ سے پہلے وضاحت کریں订单同步管理系统类库(Single Server)حکمت عملی کے پیرامیٹر ڈیزائن: ہم نے پہلے ہی بتایا ہے کہ ٹیمپلیٹ کے انٹرفیس فنکشن کو کس طرح استعمال کیا جائے تاکہ کسی حکمت عملی کو اپ گریڈ کیا جا سکے جس میں بینڈ کی خصوصیت ہو۔ تو جب اسٹاک تبدیل ہوتا ہے تو سگنل بھیجا جاتا ہے ، اور کس کو بھیجا جاتا ہے؟ یہ سوال یہ ہے کہ کس کو بھیجنا ہے؟订单同步管理系统类库(Single Server)اس کے لئے آپ کو اس کی ترتیب کی ضرورت ہے.

img

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

  • لیبل ہم آہنگی کے اکاؤنٹس کے ٹیگ، ایک اکاؤنٹ کو نشان زد کرنے کے لئے استعمال کیا جاتا ہے، ناموں کو کسی بھی طرح سے مقرر کیا جا سکتا ہے.

  • روبوٹ ID ڈسک ID، مطابقت پذیر اکاؤنٹس کے مالک کی طرف سے بنایا گیا订单同步管理系统(Synchronous Server)آپ کا آئی ڈی کیا ہے؟

  • accessKey FMZ کی توسیع API کے لئے رسائی کی

  • خفیہ کلید ایف ایم زیڈ کی توسیع API کا سیکرٹ کی

اس کے بعد ہم ایک سادہ ٹیسٹ کر سکتے ہیں۔

آرڈر سنک مینجمنٹ سسٹم کلاس لائبریری ((سنگل سرور) فکسڈ ڈسک پر چل رہا ہے:

img

آرڈر سنکرونوس سرور کی فکسڈ ڈسک کو ایک سگنل موصول ہوا: ہم نے ابھی تک آرڈر سنکرونس مینجمنٹ سسٹم (Synchronous Server) تیار نہیں کیا ہے ، ہم نے پہلے ایک سادہ کوڈ کا استعمال کرتے ہوئے اس کا نفاذ کیا ، کوئی ٹرانزیکشن نہیں کیا ، صرف سگنل پرنٹ کیا:

آرڈر سنکرونوس سرور عارضی کوڈ:

function main() {
    LogReset(1)
    while (true) {
        var cmd = GetCommand()
        if (cmd) {
            // cmd: ETH_USDT,swap,buy,1
            Log("cmd: ", cmd)
        }
        Sleep(1000)
    }
}

img

ایک بار جب ہم نے ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر ایک بار پھر.ETH_USDT,swap,buy,1◄ اس کے بعد ، آپ کو اپنی خود کار طریقے سے ٹرانزیکشنز کی فہرست بنانا ہوگی ، جو کہ معلومات میں موجود تجارت کی جوڑی ، معاہدے کا کوڈ ، تجارت کی سمت اور مقدار پر مبنی ہے۔

فی الحال订单同步管理系统(Synchronous Server)یہ صرف ایک عارضی کوڈ ہے، اور ہم اس کے ڈیزائن پر اگلے نمبر میں مزید بات کریں گے۔


متعلقہ

مزید

مینگسی1005لسٹنگ کو لاگو کرنے کے لئے، آپ کو دو ڈرائیوز کی ضرورت ہے، ایک کلاس لائبریری ڈرائیو اور ایک آرڈر مینجمنٹ سسٹم ڈرائیو.

مینگسی1005ٹیوٹوریل کے مطابق بنایا گیا، ترتیب میں خرابی دکھائی گئی

علیریورس ٹائم لائن میں کون سی پیرامیٹرز کو تبدیل کرنے کی ضرورت ہے

علیاگر آپ اپنے آپ کو چارج کرتے ہیں تو آپ کو دو فلیش ڈسکوں کو بھی کھولنا ہوگا، ایک سگنل بھیجنے والا اور ایک وصول کرنے والا، کیا یہ دونوں فلیش ڈسک ایک ساتھ مل کر کام کر سکتے ہیں؟

چھوٹا سا خوابآپ نے شاید یہ مضمون نہیں پڑھا ہو گا، یہ کلاس لائبریری ایک ایسا ٹول ہے جو براہ راست بینڈرز کی پالیسی لائن میں سرایت کر سکتا ہے، اور پھر اس پالیسی میں بینڈرز کا فنکشن ہوتا ہے، جس کے بعد یہ سیٹ اپ شدہ بینڈرز اکاؤنٹس کو پیغامات بھیجتا ہے، جس کے بعد روبوٹ کو پیغامات موصول ہوتے ہیں۔ اس کے علاوہ ، یہ ایک بہت ہی دلچسپ منظر نامہ ہے جس کے بارے میں ہم آپ کو بتائیں گے۔

چھوٹا سا خوابآپ اس مضمون کو دیکھ سکتے ہیں ، ترتیب کی معلومات: ٹیگ ، اصلی ڈسک ID ، رسائی کلید ، خفیہ کلید.

مینگسی1005غلطی configs error!، حکم سنک مینجمنٹ سسٹم کی کتابچہ ((Single Server) میں، بینڈر کی ڈسک اور 2 KEYs دونوں کو بھرا ہوا ہے، اور پھر حکم سنک مینجمنٹ سسٹم کی کتابچہ ((Single Server) کا حوالہ دیا گیا ہے، غلطی، غلطی configs error!

مینگسی1005configs error! configs error! configs error! configs error! configs error! configs error! configs error! configs error! configs error! configs error! configs error! configs error! configs error! configs error!

چھوٹا سا خواباس کے علاوہ ، آپ کو یہ بھی دیکھنا چاہئے کہ آپ کو کس طرح غلط معلومات کی اطلاع دی جاتی ہے۔

چھوٹا سا خواباس کے علاوہ، اس نے اپنے دوستوں کو بھی بتایا کہ وہ اس کے بارے میں کیا سوچتے ہیں۔

چھوٹا سا خواباس کا کوڈ عوامی ہے اور آپ اسے اپنی ضروریات کے مطابق تبدیل کرسکتے ہیں۔