En la carga de los recursos... Cargando...

Enseñarle a usar la API ampliada de FMZ para modificar los parámetros del bot

El autor:FMZ~Lydia, Creado: 2023-12-11 13:37:55, Actualizado: 2024-11-06 21:16:44

img

¿Cómo puedo cambiar los parámetros de las operaciones en vivo en lote en FMZ? Cuando el número de operaciones en vivo excede las docenas y alcanza los cientos, sería muy inconveniente configurar las operaciones en vivo una por una manualmente. En este momento, podemos usar la API ampliada de FMZ para completar estas operaciones. Así que en este artículo, exploraremos el control de grupo del bot, actualizaremos algunos detalles de los parámetros.

En el artículo anterior, resolvimos el problema de cómo usar la API ampliada de FMZ para monitorear todas las operaciones en vivo, controlar las operaciones en vivo en grupo y enviar comandos a las operaciones en vivo.

Configuración de parámetros:

img

Código de estrategia:

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

Conozca primero la función RestartRobot de la API ampliada de FMZ

Cuando necesitamos para el lote modificar los parámetros de la negociación en vivo y luego ejecutarlo, hay 2 casos para este escenario para empezar.

    1. Se ha creado un bot Para un comercio en vivo que ya se ha creado, es natural reiniciarlo utilizando la función RestartRobot, que es una interfaz API extendida a FMZ.
    1. No se ha creado bot Para el comercio en vivo no se ha creado, no hay necesidad de modificar los parámetros del comercio en vivo, que es la creación por lotes del comercio en vivo para ejecutar, y utilizamos la interfaz API ampliada FMZ - función NewRobot.

Pero no importa qué tipo de método, la siguiente idea, así como la operación son similares, por lo que vamos a utilizar elRestartRobotFunción de API extendida como ejemplo para explicar.

La función RestartRobot se utiliza de dos maneras:

    1. Configuración con solo el ID de negociación en vivo, no los parámetros de negociación en vivo Este enfoque mantiene la configuración de parámetros sin cambios cuando se detiene la negociación en vivo, y reinicia solo la negociación en vivo.
    1. Configuración con ID de negociación en vivo y los parámetros de negociación en vivo transmitidos Este enfoque inicia la operación en vivo con la nueva configuración de parámetros.

El primer enfoque no es útil para nuestro escenario de demanda, porque nuestra propia demanda es modificar un gran número de parámetros del comercio en vivo a granel.

No te preocupes, vamos a explorarlos uno por uno.

Obtener la información del comercio en vivo que desea operar

En FMZ, si desea modificar la configuración de parámetros de una negociación en vivo, entonces debe no estar en ejecución. Porque solo una negociación en vivo que no esté en ejecución puede tener su configuración de parámetros modificada. Una negociación en vivo que no esté en el estado de ejecución puede estar en:

  • La estrategia se detuvo.
  • La estrategia tiene errores, se detuvo.

Así que tenemos que obtener las operaciones en vivo para la estrategia especificada primero, y estas operaciones en vivo están en unestado de paradao bienHay un error para detener.

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

Esto nos da toda la información sobre el comercio en vivo que necesitamos para cambiar la configuración de, a continuación, vamos a obtener la configuración detallada del comercio en vivo.

Modificación de los parámetros de configuración de operaciones en vivo

Por ejemplo, la estrategia de negociación en vivo para la cual necesitamos modificar los parámetros es la siguiente (es decir, la estrategia cuyo ID de estrategia es la variable strategyId):

img

img

La estrategia tiene 3 parámetros como prueba.

Modificar los parámetros de la estrategia para la negociación en vivo, pero tal vez no queremos modificar la configuración de intercambio de la estrategia, pero para la interfaz API extendida RestartRobot función, o bien no se especifican parámetros (como es sólo iniciar la negociación en vivo) o todas las configuraciones de parámetros deben especificarse.

Es decir, antes de usar la función RestartRobot para iniciar el comercio en vivo, debemos usar la función GetRobotDetail de la interfaz API extendida para obtener primero la configuración actual del comercio en vivo, y luego reemplazamos la parte de los parámetros que deben modificarse, para reconstruir los parámetros de configuración para el inicio del comercio en vivo (es decir, los parámetros que se utilizarán para llamar a RestartRobot), y luego reiniciar el comercio en vivo.

Así que, a continuación, atravesamos robotList, y obtener la configuración de parámetros actuales uno por uno, el/**/Comentado parte del siguiente código es los detalles de negociación en vivo, necesitamos tratar con estos datos.

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

Después de ejecutar la estrategia de modificación de parámetros de lote, mi negociación en vivo:

  • Prueba 1A
  • Prueba 1B

La modificación por lotes de los parámetros se realizó con los objetos de intercambio configurados, los pares de operaciones y los períodos de línea K sin cambios:

Fue cambiado en la página de operaciones en vivo automáticamente:

img

Porque hemos especificado los parámetros modificados en el código anterior:

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

Enlace a la sección

Para docenas, cientos de lotes de comercio en vivo modificar parámetros, este método es más conveniente. En el ejemplo, los parámetros se modifican a un uniforme, por supuesto, se puede personalizar sus propias reglas de modificación en el código para especificar diferentes configuraciones de parámetros para cada comercio en vivo. O especificar diferentes objetos de intercambio, pares de comercio y así sucesivamente.

Para la plataforma FMZ, estos requisitos son flexibles y personalizables para lograr. Siéntase libre de dejar un comentario si tiene alguna idea de requisitos, podemos discutir, investigar y aprender unos de otros, y encontrar la solución al problema.


Más.