avatar of 发明者量化-小小梦 发明者量化-小小梦
Suivre Messages privés
4
Suivre
1271
Abonnés

Apprenez à utiliser l'API étendue FMZ pour modifier par lots les paramètres en temps réel

Créé le: 2023-12-09 20:39:41, Mis à jour le: 2025-05-16 17:00:20
comments   2
hits   1004

Apprenez à utiliser l’API étendue FMZ pour modifier par lots les paramètres en temps réel

Comment modifier les paramètres en temps réel par lots sur FMZ ? Lorsque le nombre de disques réels dépasse des dizaines ou même atteint des centaines, il est très gênant de les entretenir si vous configurez manuellement les disques réels un par un. À ce stade, vous pouvez utiliser l’API étendue de FMZ pour effectuer ces opérations. Dans cet article, explorons quelques détails sur le contrôle de groupe et la mise à jour des paramètres.

Dans l’article précédent, nous avons expliqué comment utiliser l’API étendue de FMZ pour surveiller tous les disques réels, contrôler les groupes de disques réels et envoyer des instructions aux disques réels. Nous utilisons toujours le code d’appel d’interface encapsulé dans l’article précédent comme base et continuons à écrire du code pour réaliser la modification par lots des paramètres en temps réel.

Réglages des paramètres :

Apprenez à utiliser l’API étendue FMZ pour modifier par lots les paramètres en temps réel

Code de 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, comprenons la fonction RestartRobot de l’API d’extension FMZ.

Lorsque nous devons modifier les paramètres en temps réel par lots, puis exécuter le temps réel, il existe deux situations dans ce scénario.

  • 1. L’offre réelle a été créée Pour un vrai disque qui a été créé, son redémarrage utilise naturellement l’interface API étendue de FMZ - la fonction RestartRobot.
  • 2. Le véritable marché n’a pas encore été créé Si aucun disque réel n’est créé, il n’y a pas de notion de « modification » des paramètres du disque réel. Il s’agit d’une opération de création par lots de disques réels. À ce stade, l’interface API étendue de FMZ - fonction NewRobot est utilisée.

Mais quelle que soit la méthode utilisée, les idées et opérations suivantes sont similaires, nous commencerons donc parRestartRobotCette fonction API étendue est utilisée comme exemple.

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

  • 1. Seul l’ID du disque réel est transmis et la configuration des paramètres du disque réel n’est pas transmise. Cette méthode conserve la configuration des paramètres lorsque le disque réel est arrêté inchangé et redémarre uniquement le disque réel.
  • 2. Entrez l’ID du disque réel et la configuration des paramètres du disque réel. Cette méthode démarre le fonctionnement réel du disque avec une nouvelle configuration de paramètres.

La première méthode n’est d’aucune utilité dans notre scénario, car notre exigence est de modifier un grand nombre de paramètres en temps réel par lots. Le problème est donc que la configuration des paramètres du marché réel est très compliquée, y compris la configuration des objets d’échange, la configuration des paramètres de stratégie, le réglage du cycle de la ligne K, etc.

Ne vous inquiétez pas, nous allons les explorer un par un.

Obtenez les informations réelles que vous souhaitez exploiter

Sur FMZ, si vous souhaitez modifier la configuration des paramètres d’un disque réel, le disque réel doit être dans un état non exécuté. Car seul le disque réel qui n’est pas en état de fonctionnement peut modifier la configuration des paramètres. Un vrai disque qui n’est pas en fonctionnement peut être :

  • La stratégie s’est arrêtée.
  • Il y a quelque chose qui ne va pas avec la stratégie, arrêtez.

Nous devons donc d’abord obtenir le marché réel de la stratégie spécifiée, et ces marchés réels sont enÉtat d’arrêtouArrêt sur erreurstatut.

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

De cette façon, nous avons obtenu toutes les informations réelles du disque qui doivent être modifiées. Ensuite, nous devons obtenir la configuration détaillée du disque réel.

Modifier les paramètres de configuration du disque réel

Par exemple, la stratégie en temps réel dont nous devons modifier les paramètres est la suivante (c’est-à-dire la stratégie dont l’ID de stratégie est la variable strategyId) :

Apprenez à utiliser l’API étendue FMZ pour modifier par lots les paramètres en temps réel

Apprenez à utiliser l’API étendue FMZ pour modifier par lots les paramètres en temps réel

Cette stratégie comporte 3 paramètres, à titre expérimental.

Modifiez les paramètres de la stratégie en temps réel, mais nous ne souhaitons peut-être pas modifier la configuration d’échange de la stratégie. Cependant, pour la fonction RestartRobot de l’interface API étendue, soit aucun paramètre n’est spécifié (il suffit de démarrer le trading en temps réel tel quel), soit toutes les configurations de paramètres doivent être spécifiées.

Cela signifie qu’avant d’utiliser la fonction RestartRobot pour démarrer le disque réel, nous devons d’abord utiliser la fonction GetRobotDetail de l’interface API étendue pour obtenir la configuration actuelle du disque réel, puis remplacer les paramètres qui doivent être modifiés pour reconstruire le démarrage du disque réel (c’est-à-dire, appel des paramètres à utiliser lors de RestartRobot), puis redémarrage du disque réel.

Ensuite, nous parcourons robotList et obtenons la configuration actuelle des paramètres un par un. Dans le code suivant/**/La partie commentée contient les informations détaillées de la transaction réelle et nous devons ensuite 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 des paramètres par lots, mon volume de transactions réel est :

  • Test 1A
  • Test 1B

Les paramètres sont modifiés tandis que l’objet d’échange configuré, la paire de négociation et la période K-line restent inchangés :

La page du marché réel change automatiquement en :

Apprenez à utiliser l’API étendue FMZ pour modifier par lots les paramètres en temps réel

Et commence à courir. Parce que nous avons spécifié les paramètres modifiés dans le code ci-dessus :

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

END

Cette méthode est plus pratique pour modifier par lots les paramètres de dizaines ou de centaines de disques réels. Dans cet exemple, les paramètres sont modifiés en un seul. Bien entendu, vous pouvez également personnaliser vos propres règles de modification dans le code et spécifier différentes configurations de paramètres pour chaque compte réel. Ou spécifiez différents objets d’échange, paires de trading, etc.

Pour la plateforme FMZ, ces exigences peuvent être personnalisées et mises en œuvre de manière flexible. Si vous avez des exigences ou des idées, veuillez laisser un message et nous discuterons, rechercherons et trouverons ensemble des solutions aux problèmes.