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

ریئل ٹائم پیرامیٹرز کو بیچ میں ترمیم کرنے کے لیے آپ کو FMZ توسیعی API استعمال کرنے کا طریقہ سکھائیں۔

میں تخلیق کیا: 2023-12-09 20:39:41, تازہ کاری: 2025-05-16 17:00:20
comments   2
hits   1004

ریئل ٹائم پیرامیٹرز کو بیچ میں ترمیم کرنے کے لیے آپ کو FMZ توسیعی API استعمال کرنے کا طریقہ سکھائیں۔

FMZ پر بیچوں میں ریئل ٹائم پیرامیٹرز کو کیسے تبدیل کیا جائے؟ جب اصلی ڈسکوں کی تعداد درجنوں سے بڑھ جاتی ہے یا سینکڑوں تک پہنچ جاتی ہے، تو اسے برقرار رکھنا بہت تکلیف دہ ہوتا ہے اگر آپ اصلی ڈسکوں کو ایک ایک کرکے ترتیب دیتے ہیں۔ اس وقت، آپ ان کارروائیوں کو مکمل کرنے کے لیے FMZ کا توسیعی API استعمال کر سکتے ہیں۔ اس مضمون میں، آئیے گروپ کنٹرول اور پیرامیٹرز کو اپ ڈیٹ کرنے کے بارے میں کچھ تفصیلات دریافت کریں۔

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

پیرامیٹر کی ترتیبات:

ریئل ٹائم پیرامیٹرز کو بیچ میں ترمیم کرنے کے لیے آپ کو FMZ توسیعی API استعمال کرنے کا طریقہ سکھائیں۔

حکمت عملی کوڈ:

// 全局变量
var isLogMsg = true   // 控制日志是否打印
var isDebug = false   // 调试模式
var arrIndexDesc = ["all", "running", "stop"]
var descRobotStatusCode = ["空闲中", "运行中", "停止中", "已退出", "被停止", "策略有错误"]
var dicRobotStatusCode = {
    "all" : -1,
    "running" : 1,
    "stop" : 4,
}

// 扩展的日志函数
function LogControl(...args) {
    if (isLogMsg) {
        Log(...args)
    }
}

// FMZ扩展API调用函数
function callFmzExtAPI(accessKey, secretKey, funcName, ...args) {
    var params = {
        "version" : "1.0",
        "access_key" : accessKey,
        "method" : funcName,
        "args" : JSON.stringify(args),
        "nonce" : Math.floor(new Date().getTime())
    }

    var data = `${params["version"]}|${params["method"]}|${params["args"]}|${params["nonce"]}|${secretKey}`
    params["sign"] = Encode("md5", "string", "hex", data)
    
    var arrPairs = []
    for (var k in params) {
        var pair = `${k}=${params[k]}`
        arrPairs.push(pair)
    }
    var query = arrPairs.join("&")
    
    var ret = null
    try {
        LogControl("url:", baseAPI + "/api/v1?" + query)
        ret = JSON.parse(HttpQuery(baseAPI + "/api/v1?" + query))
        if (isDebug) {
            LogControl("Debug:", ret)
        }
    } catch(e) {
        LogControl("e.name:", e.name, "e.stack:", e.stack, "e.message:", e.message)
    }
    Sleep(100)  // 控制频率
    return ret 
}

// 获取指定策略Id的所有运行中的实盘信息
function getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, robotStatusCode, maxRetry) {
    var retryCounter = 0
    var length = 100
    var offset = 0
    var arr = []

    if (typeof(maxRetry) == "undefined") {
        maxRetry = 10
    }

    while (true) {
        if (retryCounter > maxRetry) {
            LogControl("超过最大重试次数", maxRetry)
            return null
        }
        var ret = callFmzExtAPI(accessKey, secretKey, "GetRobotList", offset, length, robotStatusCode)
        if (!ret || ret["code"] != 0) {
            Sleep(1000)
            retryCounter++
            continue
        }

        var robots = ret["data"]["result"]["robots"]
        for (var i in robots) {
            if (robots[i].strategy_id != strategyId) {
                continue
            }
            arr.push(robots[i])
        }

        if (robots.length < length) {
            break
        }
        offset += length
    }

    return arr 
}

پہلے، آئیے FMZ ایکسٹینشن API کے RestartRobot فنکشن کو سمجھیں۔

جب ہمیں بیچوں میں ریئل ٹائم پیرامیٹرز میں ترمیم کرنے اور پھر ریئل ٹائم چلانے کی ضرورت ہوتی ہے، تو اس منظر نامے میں دو صورتیں ہوتی ہیں۔

  • 1. حقیقی پیشکش بنائی گئی ہے۔ ایک حقیقی ڈسک کے لیے جو بنائی گئی ہے، اسے دوبارہ شروع کرنا قدرتی طور پر FMZ کے توسیعی API انٹرفیس - RestartRobot فنکشن کا استعمال کرتا ہے۔
  • 2. حقیقی مارکیٹ ابھی تک نہیں بنائی گئی ہے اگر کوئی حقیقی ڈسک نہیں بنائی گئی ہے، تو حقیقی ڈسک کے پیرامیٹرز کو تبدیل کرنے کا کوئی تصور نہیں ہے، اس وقت FMZ - NewRobot فنکشن کا توسیع شدہ API انٹرفیس استعمال کیا جاتا ہے۔

لیکن اس بات سے کوئی فرق نہیں پڑتا ہے کہ کون سا طریقہ استعمال کیا جاتا ہے، مندرجہ ذیل خیالات اور آپریشن ایک جیسے ہیں، لہذا ہم شروع کریں گےRestartRobotاس توسیعی API فنکشن کو بطور مثال استعمال کیا جاتا ہے۔

RestartRobot فنکشن کو استعمال کرنے کے دو طریقے ہیں:

  • 1. صرف اصلی ڈسک ID پاس کی جاتی ہے، اور اصلی ڈسک کی پیرامیٹر کنفیگریشن پاس نہیں ہوتی ہے۔ یہ طریقہ پیرامیٹر کی ترتیب کو برقرار رکھتا ہے جب اصلی ڈسک کو بغیر کسی تبدیلی کے روک دیا جاتا ہے، اور صرف اصلی ڈسک کو دوبارہ شروع کرتا ہے۔
  • 2. اصلی ڈسک ID اور اصلی ڈسک کی پیرامیٹر کنفیگریشن درج کریں۔ یہ طریقہ نئے پیرامیٹر کنفیگریشن کے ساتھ اصلی ڈسک آپریشن شروع کرتا ہے۔

پہلا طریقہ ہمارے منظر نامے کے لیے کوئی فائدہ مند نہیں ہے، کیونکہ ہماری ضرورت بیچوں میں ریئل ٹائم پیرامیٹرز کی ایک بڑی تعداد میں ترمیم کرنا ہے۔ لہذا مسئلہ یہ ہے کہ حقیقی مارکیٹ کی پیرامیٹر کی ترتیب بہت پیچیدہ ہے، بشمول ایکسچینج آبجیکٹ کی ترتیب، حکمت عملی پیرامیٹر کی ترتیب، K-لائن سائیکل کی ترتیب وغیرہ۔

پریشان نہ ہوں، ہم انہیں ایک ایک کرکے دریافت کریں گے۔

حقیقی معلومات حاصل کریں جو آپ کام کرنا چاہتے ہیں۔

FMZ پر، اگر آپ اصلی ڈسک کے پیرامیٹر کنفیگریشن میں ترمیم کرنا چاہتے ہیں، تو اصلی ڈسک کو نہ چلنے والی حالت میں ہونا چاہیے۔ کیونکہ صرف اصلی ڈسک جو چلنے والی حالت میں نہیں ہے وہ پیرامیٹر کی ترتیب میں ترمیم کر سکتی ہے۔ ایک حقیقی ڈسک جو کام میں نہیں ہو سکتی ہے:

  • حکمت عملی رک گئی۔
  • حکمت عملی میں کچھ گڑبڑ ہے، روکو۔

تو سب سے پہلے ہمیں مخصوص حکمت عملی کی حقیقی مارکیٹ حاصل کرنے کی ضرورت ہے، اور یہ حقیقی مارکیٹیں موجود ہیں۔ریاست کو روکویاغلطی پر رک جاؤحیثیت

function main() {
    var stopRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 4)
    var errorRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 5)
    var robotList = stopRobotList.concat(errorRobotList)
}

اس طرح، ہم نے تمام حقیقی ڈسک کی معلومات حاصل کر لی ہیں جن میں ترمیم کرنے کی ضرورت ہے، ہمیں حقیقی ڈسک کی تفصیلی ترتیب حاصل کرنے کی ضرورت ہے۔

اصلی ڈسک کنفیگریشن پیرامیٹرز میں ترمیم کریں۔

مثال کے طور پر، اصل وقت کی حکمت عملی جس کے پیرامیٹرز میں ہمیں ترمیم کرنے کی ضرورت ہے وہ مندرجہ ذیل ہے (یعنی وہ حکمت عملی جس کی حکمت عملی ID حکمت عملی آئی ڈی متغیر ہے):

ریئل ٹائم پیرامیٹرز کو بیچ میں ترمیم کرنے کے لیے آپ کو FMZ توسیعی API استعمال کرنے کا طریقہ سکھائیں۔

ریئل ٹائم پیرامیٹرز کو بیچ میں ترمیم کرنے کے لیے آپ کو FMZ توسیعی API استعمال کرنے کا طریقہ سکھائیں۔

اس حکمت عملی میں 3 پیرامیٹرز ہیں، بطور تجربہ۔

ریئل ٹائم حکمت عملی کے پیرامیٹرز میں ترمیم کریں، لیکن ہم حکمت عملی کی ایکسچینج کنفیگریشن میں ترمیم نہیں کرنا چاہتے تاہم، توسیع شدہ API انٹرفیس RestartRobot فنکشن کے لیے، یا تو کوئی پیرامیٹرز متعین نہیں کیے گئے ہیں (بس اصل وقت کی تجارت شروع کریں)، یا۔ تمام پیرامیٹر کنفیگریشنز کی وضاحت ہونی چاہیے۔

اس کا مطلب یہ ہے کہ اس سے پہلے کہ ہم اصلی ڈسک کو شروع کرنے کے لیے RestartRobot فنکشن کا استعمال کریں، ہمیں اصلی ڈسک کی موجودہ کنفیگریشن حاصل کرنے کے لیے پہلے توسیعی API انٹرفیس GetRobotDetail فنکشن کا استعمال کرنا چاہیے، اور پھر ان پیرامیٹرز کو تبدیل کرنا چاہیے جن کو دوبارہ تعمیر کرنے کے لیے ترمیم کرنے کی ضرورت ہے۔ اصلی ڈسک سٹارٹ اپ (یعنی جب ری سٹارٹ روبوٹ استعمال کیا جائے تو پیرامیٹرز کو کال کریں) اور پھر اصلی ڈسک کو دوبارہ شروع کریں۔

اس کے بعد ہم روبوٹ لسٹ کو عبور کرتے ہیں اور درج ذیل کوڈ میں ایک ایک کرکے موجودہ پیرامیٹر کی ترتیب حاصل کرتے ہیں۔/**/تبصرہ کردہ حصہ اصل لین دین کی تفصیلی معلومات ہے، اور ہمیں اس ڈیٹا پر آگے کارروائی کرنے کی ضرورت ہے۔

function main() {
    var stopRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 4)
    var errorRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 5)

    var robotList = stopRobotList.concat(errorRobotList)
    _.each(robotList, function(robotInfo) {
        var robotDetail = callFmzExtAPI(accessKey, secretKey, "GetRobotDetail", robotInfo.id)
        
        /*
        {
            "code": 0,
            "data": {
                "result": {
                    "robot": {
                        ...
                        "id": 130350,
                        ...
                        "name": "测试1B",
                        "node_id": 3022561,
                        ...
                        "robot_args": "[[\"pairs\",\"BTC_USDT,ETH_USDT,EOS_USDT,LTC_USDT\"],[\"col\",3],[\"htight\",300]]",
                        "start_time": "2023-11-19 21:16:12",
                        "status": 5,
                        "strategy_args": "[[\"pairs\",\"币种列表\",\"英文逗号间隔\",\"BTC_USDT,ETH_USDT,EOS_USDT,LTC_USDT\"],[\"col\",\"宽度\",\"页面总宽度为12\",6],[\"htight\",\"高度\",\"单位px\",600],[\"$$$__cmd__$$$coverSymbol\",\"平仓\",\"平仓交易对\",\"\"]]",
                        "strategy_exchange_pairs": "[3600,[186193],[\"BTC_USD\"]]",
                        "strategy_id": 131242,
                        "strategy_last_modified": "2023-12-09 23:14:33",
                        "strategy_name": "测试1",
                        ...
                    }
                },
                "error": null
            }
        }
        */

        // 解析交易所配置数据
        var exchangePairs = JSON.parse(robotDetail.data.result.robot.strategy_exchange_pairs)

        // 拿到交易所对象索引、交易对,这些设置是不打算修改的
        var arrExId = exchangePairs[1]
        var arrSymbol = exchangePairs[2]

        // 解析参数配置数据
        var params = JSON.parse(robotDetail.data.result.robot.robot_args)

        // 更新参数
        var dicParams = {
            "pairs" : "AAA_BBB,CCC_DDD",
            "col" : "999",
            "htight" : "666"
        }
        
        var newParams = []
        _.each(params, function(param) {
            for (var k in dicParams) {
                if (param[0] == k) {
                    newParams.push([k, dicParams[k]])  // 构造策略参数,更新上新参数值
                }
            }
        })
        
        // 注意如果数据中有空格需要转码,否则请求的时候会报错
        settings = {
            "name": robotDetail.data.result.robot.name,
            // 策略参数
            "args": newParams,         
            // 策略ID,可以用GetStrategyList方法获取到
            "strategy": robotDetail.data.result.robot.strategy_id,
            // K线周期参数,60即为60秒
            "period": exchangePairs[0],
            // 指定在哪个托管者上运行,不写该属性就是自动分配运行
            "node" : robotDetail.data.result.robot.node_id,
            "exchanges": []
        }
                                
        for (var i = 0 ; i < arrExId.length ; i++) {
            settings["exchanges"].push({"pid": arrExId[i], "pair": arrSymbol[i]})
        }
        Log(settings) // 测试
        var retRestart = callFmzExtAPI(accessKey, secretKey, "RestartRobot", robotInfo.id, settings)
        Log("retRestart:", retRestart)
    })
}

اس بیچ پیرامیٹر میں ترمیم کی حکمت عملی کو چلانے کے بعد، میرا اصل تجارتی حجم یہ ہے:

  • ٹیسٹ 1A
  • ٹیسٹ 1B

پیرامیٹرز میں ترمیم کی جاتی ہے جبکہ کنفیگر شدہ ایکسچینج آبجیکٹ، ٹریڈنگ پیئر، اور K-لائن کی مدت میں کوئی تبدیلی نہیں ہوتی:

اصلی مارکیٹ کا صفحہ خود بخود اس میں تبدیل ہو جاتا ہے:

ریئل ٹائم پیرامیٹرز کو بیچ میں ترمیم کرنے کے لیے آپ کو FMZ توسیعی API استعمال کرنے کا طریقہ سکھائیں۔

اور دوڑنا شروع کر دیں۔ کیونکہ ہم نے مذکورہ کوڈ میں ترمیم شدہ پیرامیٹرز کی وضاحت کی ہے:

        // 更新参数
        var dicParams = {
            "pairs" : "AAA_BBB,CCC_DDD",
            "col" : "999",
            "htight" : "666"
        }

END

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

FMZ پلیٹ فارم کے لیے، ان تقاضوں کو لچکدار طریقے سے اپنی مرضی کے مطابق اور لاگو کیا جا سکتا ہے، اگر آپ کے پاس کوئی تقاضے یا خیالات ہیں، تو براہ کرم ایک پیغام چھوڑیں اور ہم مل کر مسائل کے حل پر بات کریں گے، تحقیق کریں گے اور سیکھیں گے۔