Apprenez à modifier les paramètres du disque dur en masse à l'aide de l'API FMZ Extension

Auteur:Le petit rêve, Créé à partir de:

img

Comment modifier en masse les paramètres de disque dur sur FMZ? Lorsque le nombre de disques dur est supérieur à quelques dizaines et atteint des centaines, il est très difficile de configurer manuellement un disque dur.

Dans l'article précédent, nous avons résolu comment utiliser l'API d'extension FMZ pour surveiller tous les disques, les disques de groupe et envoyer des instructions aux disques.

Les paramètres sont:

img

Le code de la stratégie:

// 全局变量
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 
}

Tout d'abord, la fonction RestartRobot de l'API de l'extension FMZ

Lorsque nous avons besoin de modifier en masse les paramètres du disque réel avant de l'exécuter, il y a deux scénarios.

  • 1°, le disque virtuel a été créé Pour les disques virtuels déjà créés, le redémarrage se fait naturellement à l'aide de la fonction RestartRobot, une extension de l'interface API de FMZ.
  • 2° Le disque virtuel n'a pas encore été créé Pour la création de disques virtuels, il n'existe pas de notion de modification des paramètres de disques virtuels, mais de création de disques virtuels en vrac. Cette fois-ci, la fonction NewRobot est utilisée.

Mais dans les deux cas, les idées et les actions qui suivent sont très différentes.RestartRobotL'API est utilisée comme exemple de présentation.

Il existe deux façons d'utiliser la fonction RestartRobot:

  • 1, ne passe que l'ID du disque réel, pas la configuration des paramètres du disque réel. Cette méthode permet de conserver la configuration des paramètres de l'arrêt du disque, tout en le redémarrant.
  • 2, passez l'ID du disque dur et la configuration des paramètres du disque dur. Cette méthode permet de lancer le disque dur avec une nouvelle configuration de paramètres.

La première méthode ne fonctionne pas pour notre scénario de demande, car nous avons besoin de modifier en masse un grand nombre de paramètres du disque réel. Le problème est donc que la configuration des paramètres du disque réel est très complexe, avec des configurations d'objets d'échange, des configurations de paramètres de stratégie, des paramètres de cycle de ligne K, etc.

Ne vous inquiétez pas, nous allons vérifier un par un.

Obtenir les informations sur le disque pour les opérations

Sur FMZ, si l'on veut modifier la configuration des paramètres d'une disquette, elle doit être en non-fonctionnement.

  • La stratégie est arrêtée.
  • La stratégie est erronée, arrêtez.

Donc tout d'abord, nous avons besoin d'avoir des disques réels avec des stratégies spécifiées, et ces disques réels sont situés dans des endroits très différents.ArrêtezOu alorsUne erreur d'arrêtJe ne sais pas comment faire.

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

Cela nous donne toutes les informations sur le disque dur dont nous avons besoin pour modifier la configuration, puis nous obtenons les détails de la configuration du disque dur.

Modifier les paramètres de configuration du disque

Par exemple, nous avons besoin de modifier les paramètres de la stratégie de disque comme suit (c'est-à-dire la stratégie ID pour la stratégieId):

img

img

Cette stratégie a trois paramètres pour être testée.

Modifier les paramètres de stratégie du disque, mais peut-être que nous ne voulons pas modifier la configuration de l'échange de stratégie, mais pour l'extension de l'interface API de la fonction RestartRobot, soit aucun paramètre n'est spécifié (l'original n'est pas actif, il suffit de démarrer le disque), soit toutes les paramètres doivent être spécifiés.

C'est-à-dire que nous devons d'abord utiliser l'API étendue GetRobotDetail pour accéder à la configuration actuelle du disque avant de démarrer le disque avec la fonction RestartRobot, puis nous remplaçons la partie des paramètres à modifier, reconstituons les paramètres de configuration du disque de démarrage (c'est-à-dire les paramètres à utiliser lors de l'appel de RestartRobot) et redémarrez le disque.

Donc, la prochaine chose que nous faisons est de parcourir la liste des robots et d'obtenir une configuration de paramètres en cours, une par une, dans le code suivant./**/La partie des annotations est l'information détaillée sur le disque, et ensuite nous devons traiter ces données.

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

Après avoir exécuté cette stratégie de modification de paramètres en masse, mon disque virtuel:

  • Le test 1A
  • Le test 1B

Modification des paramètres dans le cas où l'objet d'échange, la paire de transactions et le cycle de ligne K configurés sont inchangés:

Les pages de disques virtuels sont automatiquement modifiées pour:

img

La fonctionnalité de base de l'appareil est de configurer le système pour qu'il fonctionne.

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

Résultats

Pour des dizaines ou des centaines de disques, il est plus pratique d'utiliser cette méthode. Dans cet exemple, il s'agit d'un paramètre unique, bien sûr, vous pouvez également personnaliser vos propres règles de modification dans le code, en spécifiant une configuration de paramètres différente pour chaque disque, ou en spécifiant des objets d'échange, des pairs de transactions, etc.

Pour la plateforme FMZ, ces besoins peuvent être flexiblement personnalisés, et si vous avez des idées, nous vous invitons à nous laisser un message afin que nous puissions explorer, étudier et apprendre ensemble des solutions aux problèmes.


Plus de

allez-zDes dizaines, des centaines de disques, le loyer d'un mois est une grosse somme.

Le petit rêveCertains utilisent l'API d'extension FMZ pour l'emballage des produits, il y a beaucoup de disques.