آپ کو FMZ توسیع API کے ساتھ بلٹ میں ڈسک کی پیرامیٹرز کو تبدیل کرنے کے لئے سکھاتا ہے

مصنف:چھوٹا سا خواب, تخلیق: 2023-12-09 20:39:41, تازہ کاری: 2023-12-12 21:43:48

img

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

پچھلے مضمون میں ہم نے FMZ کی توسیع API کا استعمال کرتے ہوئے تمام ڈسک، گروپ ڈسک کی نگرانی کرنے کے لئے کس طرح حل کیا ہے، ڈسک کو ہدایات بھیجنے کے لئے.

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

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 
}

ایف ایم زیڈ توسیع API کے لئے دوبارہ شروع روبوٹ کی تقریب کے ساتھ شروع کریں

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

  • 1، ڈسک تخلیق کی گئی ہے پہلے سے ہی تخلیق شدہ ورچوئل ڈسک کے لئے ، دوبارہ شروع کرنا قدرتی طور پر ایف ایم زیڈ کی توسیع شدہ API انٹرفیس ٹن کا استعمال کرتے ہوئے ہوتا ہے۔
  • 2، ابھی تک تخلیق نہیں کی گئی اگر کوئی ڈسک تخلیق نہیں کی جاتی ہے تو ، ڈسک کے پیرامیٹرز کو تبدیل کرنے کا کوئی تصور نہیں ہوتا ہے۔ یہ بڑے پیمانے پر تخلیق شدہ ڈسک پر چلتا ہے ، اس وقت ایف ایم زیڈ کے توسیعی API انٹرفیس ٹن نیو روبوٹ فنکشن کا استعمال کیا جاتا ہے۔

لیکن کسی بھی طرح سے، اگلے خیالات اور اقدامات تقریبا ایک جیسے ہیں، لہذا ہم نے اس کے بارے میں سوچا.RestartRobotیہ توسیع API تقریب مثال کے طور پر استعمال کیا جاتا ہے.

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

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

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

آپ کو اس کے بارے میں کچھ نہیں معلوم ہے۔

آپریشن کے لئے ڈسک کی معلومات حاصل کریں

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

  • اسٹریٹجی روک دی گئی ہے۔
  • اسٹریٹجی میں خرابی ہے، بند کرو۔

لہذا سب سے پہلے ہم کو مخصوص حکمت عملی کے ساتھ ڈسک حاصل کرنے کی ضرورت ہے، اور ان ڈسک میں واقع ہیں.بند حالتیاغلطی سے روک دیااس کی حالت کا بیان۔

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

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

ڈسک کی ترتیبات کو تبدیل کریں

مثال کے طور پر ، ہمیں اس طرح کے پیرامیٹرز میں ترمیم کرنے کی ضرورت ہے (یعنی حکمت عملی ID کو حکمت عملیId متغیر کے لئے حکمت عملی):

img

img

اس حکمت عملی میں تین پیرامیٹرز ہیں جو ٹیسٹ کے طور پر استعمال کیے جاتے ہیں۔

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

اس کا مطلب یہ ہے کہ اگلا، ہم ری سائیکل کو دوبارہ شروع کرنے سے پہلے ری سائیکل کو شروع کرنے کے لئے استعمال کرتے ہیں، ہمیں پہلے توسیع 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 لائن سائیکل کی ترتیب میں تبدیلی کے ساتھ پیرامیٹرز:

اس صفحے پر آپ کی ویب سائٹ کی ویب سائٹ کی شناخت کی گئی ہے۔

img

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

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

اختتام

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

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


مزید

allez-zیہ ایک بہت بڑا پیسہ ہے، درجنوں، سینکڑوں اصلی ڈرائیوز، ماہانہ کرایہ۔

چھوٹا سا خوابکچھ ایف ایم زیڈ توسیع API پیکجنگ مصنوعات کا استعمال کرتے ہیں، اور بہت سے حقیقی ڈسک ہیں.