আপনাকে FMZ এক্সটেনশন এপিআই ব্যবহার করে ভার্চুয়াল ডিস্কের প্যারামিটারগুলি ব্যাচ পরিবর্তন করতে শেখায়

লেখক:ছোট্ট স্বপ্ন, তৈরিঃ ২০২৩-১২-০৯ ২০ঃ৩৯ঃ৪১, আপডেটঃ ২০২৩-১২-১২ ২১ঃ৪৩ঃ৪৮

img

FMZ-এ কিভাবে ভলিউম পরিবর্তন করা যায়? যখন ভলিউম ডিস্কের সংখ্যা কয়েক ডজনের বেশি হয় এবং শত শত হয়, তখন এক এক করে ম্যানুয়ালি কনফিগার করা খুব অসুবিধাজনক হয়। এই সময়ে FMZ-এর এক্সটেনশন এপিআই ব্যবহার করে এই কাজগুলি সম্পন্ন করা যেতে পারে। তাহলে এই নিবন্ধে আমরা একসাথে গ্রুপ কনসোল ডিস্ক, আপডেট পরামিতিগুলির কিছু বিবরণ অন্বেষণ করব।

পূর্ববর্তী নিবন্ধে আমরা কিভাবে FMZ এর এক্সটেনশন এপিআই ব্যবহার করে সমস্ত ডিস্ক, গ্রুপ ডিস্ক, এবং ডিস্কের নির্দেশাবলী পাঠানোর জন্য মনিটরিং সমাধান করেছি। এখনও আমরা পূর্ববর্তী প্যাকেজিং ইন্টারফেস কল কোডটি বেস হিসাবে ব্যবহার করে, কোডটি লিখতে থাকি, ডিস্কের পরামিতিগুলি ব্যাপকভাবে সংশোধন করতে পারি।

প্যারামিটার সেটিংঃ

img

কৌশলগত কোডঃ

// 全局变量
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 ফাংশনটি জানুন

যখন আমরা ভলিউম ডিস্ক পরামিতি পরিবর্তন করতে হবে এবং তারপর ভলিউম চালানো, এই দৃশ্যকল্প প্রথম দুই অবস্থার আছে।

  • ১, ডিস্ক তৈরি হয়েছে ইতিমধ্যে তৈরি করা ভার্চুয়াল ডিস্কগুলির জন্য, পুনরায় আরম্ভ করা স্বাভাবিকভাবে FMZ এর এক্সটেনশন API ইন্টারফেস প্যানেল পুনরায় আরম্ভRobot ফাংশন ব্যবহার করে।
  • ২। ভার্চুয়াল ডিস্ক তৈরি হয়নি একটি ভার্চুয়াল ডিস্ক তৈরি না করার জন্য, ভার্চুয়াল ডিস্কের পরামিতিগুলি পরিবর্তন করার ধারণাটি বিদ্যমান নেই, এটি ভার্চুয়াল ডিস্ক তৈরির ব্যাচ চালানো হয়। এই সময়টি এফএমজেডের এক্সটেনশান এপিআই ইন্টারফেস পিক নিউরবট ফাংশন ব্যবহার করে।

কিন্তু যেভাবেই হোক না কেন, পরবর্তী ধারণাগুলি এবং পদক্ষেপগুলি প্রায় একই রকম, তাই আমরা এটিকে একটি নতুন পদ্ধতিতে রূপান্তরিত করি।RestartRobotএই এক্সটেনশন এপিআই ফাংশনটি উদাহরণ হিসেবে ব্যবহার করা হয়েছে।

RestartRobot ফাংশনটি ব্যবহার করার জন্য দুটি উপায় রয়েছেঃ

  • ১, শুধুমাত্র ডিস্ক আইডি পাঠানো হয়, ডিস্কের প্যারামিটার কনফিগারেশন পাঠানো হয় না । এই পদ্ধতিটি ডিস্কটি বন্ধ করার সময় প্যারামিটার কনফিগারেশনটি অপরিবর্তিত রাখে, কেবল ডিস্কটি পুনরায় চালু করে।
  • 2, ডিস্ক আইডি পাস করুন, এবং ডিস্কের প্যারামিটার কনফিগারেশনও পাস করুন । এই পদ্ধতিতে নতুন প্যারামিটার কনফিগারেশনের সাথে রিয়েল ডিস্ক চালু করা হয়।

প্রথম পদ্ধতিটি আমাদের চাহিদা দৃশ্যের জন্য খুব একটা কাজ করে না, কারণ আমাদের নিজের চাহিদা হল প্রচুর পরিমাণে বাস্তব ডিস্কের পরামিতিগুলি সংশোধন করা। সুতরাং সমস্যা হল, বাস্তব ডিস্কের পরামিতি কনফিগারেশনগুলি খুব জটিল, এক্সচেঞ্জ অবজেক্ট কনফিগারেশন, কৌশলগত পরামিতি কনফিগারেশন, কে-লাইন চক্র সেটিং ইত্যাদি রয়েছে।

আপনি চিন্তা করবেন না, আমরা আপনাকে একের পর এক খুঁজে বের করব।

যেসব ডিস্ক অপারেশন করতে হবে সেগুলোর তথ্য পান

এফএমজেডে, যদি একটি রিয়েল ডিস্কের প্যারামিটার কনফিগারেশন পরিবর্তন করা হয়, তবে এই ডিস্কটি অবশ্যই অ-রানিং অবস্থায় থাকতে হবে। কারণ শুধুমাত্র অ-রানিং অবস্থায় থাকা ডিস্কই প্যারামিটার কনফিগারেশন পরিবর্তন করতে পারে। অ-রানিং অবস্থায় থাকা ডিস্ক হতে পারেঃ

  • এই কৌশলটি বন্ধ করা হয়েছে।
  • পলিসি ভুল, থামুন।

সুতরাং প্রথমে আমরা নির্দিষ্ট কৌশলগুলির জন্য একটি বাস্তব ড্রাইভ পেতে চাই, এবং এই বাস্তব ড্রাইভগুলিবন্ধ অবস্থাঅথবাত্রুটি থামানো হয়েছে#এক্সকিউজ

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

এইভাবে, আমরা সমস্ত ডিস্কের তথ্য পেয়েছি যা কনফিগারেশন পরিবর্তন করতে হবে এবং এরপরে আমরা ডিস্কের বিস্তারিত কনফিগারেশন পেতে পারি।

ডিস্ক কনফিগারেশন প্যারামিটার পরিবর্তন করুন

উদাহরণস্বরূপ, আমরা যে প্যারামিটারটি পরিবর্তন করতে চাই তা হল (যেমন প্যারামিটারটি পরিবর্তন করার জন্য প্যারামিটারটি পরিবর্তন করার জন্য প্যারামিটারটি পরিবর্তন করুন):

img

img

এই কৌশলটি পরীক্ষার জন্য তিনটি প্যারামিটার নিয়ে গঠিত।

ভার্চুয়াল ডিস্কের পলিসি প্যারামিটার পরিবর্তন করুন, কিন্তু আমরা হয়তো পলিসির এক্সচেঞ্জ কনফিগারেশন পরিবর্তন করতে চাই না, কিন্তু এক্সটেনশন এপিআই ইন্টারফেস RestartRobot ফাংশনের জন্য, হয় কোন প্যারামিটার নির্দিষ্ট করা হয় না (প্রাথমিক প্যাকেজটি কেবল ভার্চুয়াল ডিস্কটি চালু করে) অথবা সমস্ত প্যারামিটার কনফিগারেশন অবশ্যই নির্দিষ্ট করতে হবে।

এর অর্থ হল যে, পরবর্তী সময়ে আমরা রিবার্ট রোবট ফাংশন ব্যবহার করে রিবার্ট করার আগে, আমাদের প্রথমে এক্সটেনশন এপিআই ইন্টারফেস 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

কনফিগার করা এক্সচেঞ্জ অবজেক্ট, লেনদেনের জোড়া, কে লাইন চক্র পরিবর্তন না হলে প্যারামিটার পরিবর্তন করা হয়েছেঃ

এই পৃষ্ঠাটি স্বয়ংক্রিয়ভাবে পরিবর্তিত হয়ঃ

img

এবং এটি চালু করা হয়. কারণ আমরা উপরের কোডটিতে একটি পরিবর্তন প্যারামিটার নির্দিষ্ট করেছিঃ

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

END

কয়েক ডজন, শত শত বাস্তব ডিস্কের জন্য, এই পদ্ধতিটি তুলনামূলকভাবে সুবিধাজনক। এই উদাহরণে, এটি একটি একক পরামিতিতে পরিবর্তন করা হয়। অবশ্যই, আপনি কোডটিতে আপনার নিজের পরিবর্তন নিয়মগুলি কাস্টমাইজ করতে পারেন, প্রতিটি বাস্তব ডিস্কের জন্য বিভিন্ন পরামিতি কনফিগারেশন নির্দিষ্ট করতে পারেন। অথবা বিভিন্ন এক্সচেঞ্জ অবজেক্ট, লেনদেনের সমতুল্য ইত্যাদি নির্দিষ্ট করতে পারেন।

এফএমজেড প্ল্যাটফর্মের জন্য, এই চাহিদাগুলি নমনীয়ভাবে কাস্টমাইজ করা যেতে পারে, আপনার কোন প্রয়োজনের ধারণা আছে, আপনার মতামত জানাতে আমরা স্বাগত জানাই, আমরা একসাথে সমস্যা সমাধানের জন্য গবেষণা, গবেষণা এবং শেখার চেষ্টা করব।


আরো

Allez-zকয়েক ডজন, কয়েকশো ডিস্ক, এক মাসের ভাড়া অনেক টাকা।

ছোট্ট স্বপ্নকিছু FMZ এক্সটেনশন এপিআই প্যাকেজিং পণ্য ব্যবহার করে, এবং অনেক বাস্তব ডিস্ক আছে।