Apprenez à utiliser l'API étendue FMZ pour modifier les paramètres du bot

Auteur:Je ne sais pas., Créé à: 2023-12-11 13:37:55, Mis à jour à: 2024-01-02 21:22:49

img

Comment puis-je modifier les paramètres des transactions en direct en lot sur FMZ? Lorsque le nombre de transactions en direct dépasse des dizaines et atteint des centaines, il serait très gênant de configurer manuellement les transactions en direct une par une. À ce stade, nous pouvons utiliser l'API étendue FMZ pour effectuer ces opérations. Dans cet article, nous explorerons le contrôle de groupe du bot, mettre à jour certains détails des paramètres.

Dans l'article précédent, nous avons résolu le problème de la façon d'utiliser l'API étendue FMZ pour surveiller toutes les transactions en direct, contrôler les transactions en direct et envoyer des commandes aux transactions en direct.

Paramètres définis:

img

Code de stratégie:

// Global variable
var isLogMsg = true   // Controls whether logs are printed or not
var isDebug = false   // Debugging mode
var arrIndexDesc = ["all", "running", "stop"]
var descRobotStatusCode = ["Idle", "Running", "Stopping", "Exited", "Stopped", "There is an error in the strategy"]
var dicRobotStatusCode = {
    "all" : -1,
    "running" : 1,
    "stop" : 4,
}

// Extended logging functions
function LogControl(...args) {
    if (isLogMsg) {
        Log(...args)
    }
}

// FMZ extended API call functions
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)  // Control frequency
    return ret 
}

// Get information about all running bots for the specified strategy 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("Maximum number of retries exceeded", 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 
}

Apprenez d'abord à connaître la fonction RestartRobot de l'API étendue FMZ

Lorsque nous avons besoin de modifier les paramètres du trading en direct et de l'exécuter, il y a 2 cas pour ce scénario pour commencer.

    1. Un bot a été créé Pour un trading en direct qui a déjà été créé, il est naturel de le redémarrer à l'aide de la fonction RestartRobot, qui est une interface API étendue à FMZ.
    1. Le bot n' a pas été créé Pour le trading en direct n'a pas été créé, il n'y a pas besoin de modifier les paramètres du trading en direct, c'est la création par lots du trading en direct à exécuter, et nous utilisons l'interface API étendue FMZ - fonction NewRobot.

Mais peu importe le type de méthode, l'idée suivante ainsi que l'opération sont similaires, donc nous allons utiliser leRestartRobotL'extension de la fonction API est un exemple à expliquer.

La fonction RestartRobot est utilisée de deux façons:

    1. Configuration avec uniquement l'identifiant de négociation en direct transmis, pas les paramètres de négociation en direct Cette approche maintient la configuration des paramètres inchangée lorsque la négociation en direct est arrêtée et ne redémarre que la négociation en direct.
    1. Configuration avec l'identifiant de négociation en direct et les paramètres de négociation en direct passés Cette approche démarre la négociation en direct avec la nouvelle configuration de paramètres.

La première approche n'est pas utile pour notre scénario de demande, parce que notre propre demande est de modifier un grand nombre de paramètres de la négociation en direct en vrac.

Ne vous inquiétez pas, explorons-les un par un.

Obtenez les informations sur le commerce en direct que vous souhaitez exploiter

Sur FMZ, si vous souhaitez modifier la configuration des paramètres d'un trading en direct, alors il doit être non-exécuté. Parce que seul un trading en direct qui n'est pas en cours peut avoir sa configuration de paramètres modifiée. Un trading en direct qui n'est pas en cours d'exécution peut être en:

  • La stratégie a cessé.
  • La stratégie a des erreurs, arrêtée.

Donc, nous avons besoin d'obtenir les transactions en direct pour la stratégie spécifiée d'abord, et ces transactions en direct sont dans unétat arrêtéouIl y a une erreur à arrêter.

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 commerce en direct que nous avons besoin de changer la configuration de, ensuite, nous allons obtenir la configuration détaillée du commerce en direct.

Modification des paramètres de configuration de négociation en direct

Par exemple, la stratégie de trading en direct pour laquelle 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):

img

img

La stratégie comporte 3 paramètres comme test.

Modifier les paramètres de la stratégie pour le trading en direct, mais peut-être que nous ne voulons pas modifier la configuration de l'échange de la stratégie, mais pour la fonction RestartRobot de l'interface API étendue, soit aucun paramètre n'est spécifié (comme c'est juste démarrer le trading en direct) ou toutes les configurations de paramètres doivent être spécifiées.

Autrement dit, avant d'utiliser la fonction RestartRobot pour démarrer le trading en direct, nous devons utiliser la fonction GetRobotDetail de l'interface API étendue pour obtenir d'abord la configuration actuelle du trading en direct, puis nous remplaçons la partie des paramètres qui doivent être modifiés, pour reconstruire les paramètres de configuration pour le début du trading en direct (c'est-à-dire les paramètres qui seront utilisés pour appeler RestartRobot), puis redémarrer le trading en direct.

Donc, ensuite, nous traversons robotList, et obtenir la configuration de paramètres actuels un par un, le/**/Commentaire partie du code suivant sont les détails de négociation en direct, nous devons traiter avec 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": "Test 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\",\"Currency list\",\"English comma spacing\",\"BTC_USDT,ETH_USDT,EOS_USDT,LTC_USDT\"],[\"col\",\"breadth\",\"Total width of the page is 12\",6],[\"htight\",\"height\",\"unit px\",600],[\"$$$__cmd__$$$coverSymbol\",\"close the position\",\"close out trading pairs\",\"\"]]",
                        "strategy_exchange_pairs": "[3600,[186193],[\"BTC_USD\"]]",
                        "strategy_id": 131242,
                        "strategy_last_modified": "2023-12-09 23:14:33",
                        "strategy_name": "Test 1",
                        ...
                    }
                },
                "error": null
            }
        }
        */

        // Parse the exchange configuration data
        var exchangePairs = JSON.parse(robotDetail.data.result.robot.strategy_exchange_pairs)

        // Get the exchange object index, trading pairs, these settings are not going to be changed
        var arrExId = exchangePairs[1]
        var arrSymbol = exchangePairs[2]

        // Parse parameter configuration data
        var params = JSON.parse(robotDetail.data.result.robot.robot_args)

        // Update parameters
        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]])  // Construct the strategy parameters and update the new parameter values
                }
            }
        })
        
        // Note that if there are spaces in the data you need to transcode it, otherwise the request will report an error
        settings = {
            "name": robotDetail.data.result.robot.name,
            // Strategy parameter
            "args": newParams,         
            // The strategy ID can be obtained by the GetStrategyList method.
            "strategy": robotDetail.data.result.robot.strategy_id,
            // K-period parameter, 60 means 60 seconds
            "period": exchangePairs[0],
            // Specifies which docker to run on; not writing this attribute means automatically assigning the run
            "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) // Test
        var retRestart = callFmzExtAPI(accessKey, secretKey, "RestartRobot", robotInfo.id, settings)
        Log("retRestart:", retRestart)
    })
}

Après avoir exécuté la stratégie de modification des paramètres de lot, mon trading en direct:

  • Épreuve 1A
  • Épreuve 1B

La modification par lots des paramètres a été effectuée avec les objets d'échange configurés, les paires de négociation et les périodes de ligne K inchangés:

Il a été modifié sur la page de trading en direct automatiquement:

img

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

        // Update parameters
        var dicParams = {
            "pairs" : "AAA_BBB,CCC_DDD",
            "col" : "999",
            "htight" : "666"
        }

Résultats

Pour des dizaines, des centaines de lots de négociation en direct modifient les paramètres, cette méthode est plus pratique. Dans l'exemple, les paramètres sont modifiés à un uniforme, bien sûr, vous pouvez personnaliser vos propres règles de modification dans le code pour spécifier différentes configurations de paramètres pour chaque négociation en direct. Ou spécifier différents objets d'échange, paires de négociation et ainsi de suite.

Pour la plateforme FMZ, ces exigences sont flexibles et personnalisables à atteindre. N'hésitez pas à laisser un commentaire si vous avez des idées d'exigences, nous pouvons discuter, rechercher et apprendre les uns des autres, et trouver la solution au problème.


Plus de