Le enseñaremos cómo utilizar la API extendida de FMZ para modificar por lotes parámetros en tiempo real

Creado el: 2023-12-09 20:39:41, Actualizado el: 2024-11-06 21:17:27
comments   2
hits   693

Le enseñaremos cómo utilizar la API extendida de FMZ para modificar por lotes parámetros en tiempo real

¿Cómo modificar los parámetros en tiempo real en lotes en FMZ? Cuando el número de discos reales supera las docenas o incluso llega a cientos, resulta muy incómodo realizar el mantenimiento si configura manualmente los discos reales uno por uno. En este momento, puedes utilizar la API extendida de FMZ para completar estas operaciones. En este artículo, exploraremos algunos detalles sobre el control de grupo y la actualización de parámetros.

En el artículo anterior, resolvimos cómo usar la API extendida de FMZ para monitorear todos los discos reales, controlar grupos de discos reales y enviar instrucciones a discos reales. Seguimos utilizando el código de llamada de interfaz encapsulado en el artículo anterior como base y continuamos escribiendo código para realizar la modificación por lotes de parámetros en tiempo real.

Configuración de parámetros:

Le enseñaremos cómo utilizar la API extendida de FMZ para modificar por lotes parámetros en tiempo real

Código de estrategia:

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

Primero, comprendamos la función RestartRobot de la API de extensión FMZ.

Cuando necesitamos modificar los parámetros en tiempo real en lotes y luego ejecutar el tiempo real, hay dos situaciones en este escenario.

  • 1. Se ha creado la oferta real. En el caso de un disco real que se ha creado, reiniciarlo naturalmente utiliza la interfaz API extendida de FMZ: la función RestartRobot.
  • 2. El mercado real aún no se ha creado Si no se crea ningún disco real, no existe el concepto de “modificar” los parámetros del disco real. Pertenece a la operación de creación de discos reales por lotes. En este momento, se utiliza la interfaz API extendida de la función FMZ - NewRobot.

Pero no importa qué método se utilice, las siguientes ideas y operaciones son similares, por lo que comenzaremos conRestartRobotEsta función API extendida se utiliza como ejemplo.

Hay dos formas de utilizar la función RestartRobot:

  • 1. Solo se pasa el ID del disco real y no se pasa la configuración de parámetros del disco real. Este método mantiene sin cambios la configuración de parámetros cuando el disco real se detiene y solo reinicia el disco real.
  • 2. Ingrese el ID del disco real y la configuración de parámetros del disco real. Este método inicia la operación del disco real con una nueva configuración de parámetros.

El primer método no es de utilidad para nuestro escenario, porque nuestro requerimiento es modificar una gran cantidad de parámetros en tiempo real en lotes. Entonces, el problema es que la configuración de los parámetros del mercado real es muy complicada, incluyendo la configuración del objeto de intercambio, la configuración de los parámetros de la estrategia, la configuración del ciclo de la línea K, etc.

No te preocupes, los exploraremos uno por uno.

Obtenga la información real que desea operar

En FMZ, si desea modificar la configuración de parámetros de un disco real, entonces el disco real debe estar en un estado no en ejecución. Porque sólo el disco real que no está en estado de ejecución puede modificar la configuración de parámetros. Un disco real que no está en funcionamiento puede ser:

  • La estrategia se detuvo.
  • Hay algo mal con la estrategia, detente.

Entonces, primero necesitamos obtener el mercado real de la estrategia especificada, y estos mercados reales están enEstado de paradaoDetenerse en caso de errorestado.

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

De esta manera, hemos obtenido toda la información del disco real que se necesita modificar. A continuación, debemos obtener la configuración detallada del disco real.

Modificar los parámetros de configuración del disco real

Por ejemplo, la estrategia en tiempo real cuyos parámetros necesitamos modificar es la siguiente (es decir, la estrategia cuyo ID de estrategia es la variable strategyId):

Le enseñaremos cómo utilizar la API extendida de FMZ para modificar por lotes parámetros en tiempo real

Le enseñaremos cómo utilizar la API extendida de FMZ para modificar por lotes parámetros en tiempo real

Esta estrategia tiene 3 parámetros, a modo de experimento.

Modificar los parámetros de la estrategia en tiempo real, pero es posible que no queramos modificar la configuración de intercambio de la estrategia. Sin embargo, para la función RestartRobot de la interfaz API extendida, no se especifican parámetros (solo se inicia el comercio en tiempo real tal como está) o Todas las configuraciones de parámetros deben ser especificadas.

Esto significa que antes de usar la función RestartRobot para iniciar el disco real, primero debemos usar la función GetRobotDetail de la interfaz API extendida para obtener la configuración actual del disco real y luego reemplazar los parámetros que deben modificarse para reconstruir el disco real. inicio del disco real (es decir, llamar a los parámetros que se utilizarán al reiniciar el robot) y luego reiniciar el disco real.

A continuación, recorremos robotList y obtenemos la configuración de parámetros actual uno por uno. En el siguiente código/**/La parte comentada es la información detallada de la transacción real, y debemos procesar estos datos a continuación.

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

Después de ejecutar esta estrategia de modificación de parámetros por lotes, mi volumen comercial real es:

  • Prueba 1A
  • Prueba 1B

Los parámetros se modifican mientras que el objeto de intercambio configurado, el par comercial y el período de la línea K permanecen sin cambios:

La página del mercado real cambia automáticamente a:

Le enseñaremos cómo utilizar la API extendida de FMZ para modificar por lotes parámetros en tiempo real

Y empieza a correr. Porque especificamos los parámetros modificados en el código anterior:

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

END

Este método es más conveniente para modificar por lotes los parámetros de docenas o cientos de discos reales. En este ejemplo, los parámetros se modifican para que sean unificados. Por supuesto, también puedes personalizar tus propias reglas de modificación en el código y especificar diferentes configuraciones de parámetros para cada cuenta real. O especificar diferentes objetos de intercambio, pares comerciales, etc.

Para la plataforma FMZ, estos requisitos se pueden personalizar e implementar de manera flexible. Si tiene algún requisito o idea, deje un mensaje y analizaremos, investigaremos y aprenderemos soluciones a los problemas juntos.