Le enseñará a usar la API de expansión de FMZ para modificar los parámetros del disco duro en serie

El autor:Un sueño pequeño., Creado: 2023-12-09 20:39:41, Actualizado: 2023-12-12 21:43:48

img

¿Cómo modificar los parámetros de disco duro en FMZ en masa? Cuando el número de discos duro es de más de docenas y llega a los cientos, es muy difícil de mantener si uno configura manualmente un disco duro. En este momento, se puede utilizar la API de extensión de FMZ para realizar estas operaciones.

En el artículo anterior, resolvimos cómo usar la API de extensión de FMZ para monitorear todos los discos físicos, los controles de grupo y enviar instrucciones a los discos físicos. Todavía se utiliza el código de llamada de interfaz que hemos envasado anteriormente como base para continuar escribiendo el código y implementar una modificación masiva de los parámetros del disco físico.

Para la configuración de los parámetros:

img

El código de la 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 
}

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

Cuando necesitamos modificar los parámetros del disco real en gran cantidad y luego ejecutar el disco real, este escenario tiene dos situaciones en primer lugar.

  • El disco real ha sido creado. Para los discos que ya se han creado, el reinicio natural es el uso de la función RestartRobot de FMZ.
  • 2o, el disco no ha sido creado. Para la no creación de discos, no existe el concepto de modificar los parámetros de los discos, sino que se ejecuta la creación de discos en serie, en este momento utilizando la función NewRobot de la interfaz API de FMZ.

Pero de cualquier manera, las ideas y las acciones que siguen son muy diferentes, así que lo que hacemos es usar el término "cambio de ideas".RestartRobotEsta función de API de extensión se utiliza como ejemplo de explicación.

La función RestartRobot se utiliza de dos maneras:

  • 1, sólo se transmite el ID del disco real, no se transmite la configuración de parámetros del disco real. Esto mantiene la configuración de los parámetros cuando el disco se detiene, simplemente reinicia el disco.
  • 2, para transmitir el ID del disco real, también para transmitir la configuración de parámetros del disco real. De esta manera, el disco se inicia con la nueva configuración de parámetros.

La primera no es muy útil para nuestro escenario de demanda, ya que nosotros mismos necesitamos modificar una gran cantidad de parámetros de disco real. Así que el problema es que la configuración de parámetros de disco real es compleja, con configuración de objetos de intercambio, configuración de parámetros de estrategia, configuración de ciclos de línea K, etc.

No te preocupes, vamos a investigarlo uno por uno.

Obtener la información del disco para su operación

En FMZ, si se desea modificar la configuración de parámetros de un disco, este debe estar en estado no en funcionamiento; porque solo se puede modificar la configuración de parámetros de un disco que no está en funcionamiento.

  • La estrategia ha sido suspendida.
  • La estrategia está mal, deténgase.

Así que lo primero que tenemos que hacer es obtener los discos virtuales con las políticas especificadas, y estos discos virtuales están en el lugar donde se encuentra el disco virtual.Estado de suspensión¿Qué es esto?Hay un error de parada.El estado de la ciudad.

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

Así tenemos toda la información del disco duro que necesitamos para modificar la configuración, y ahora vamos a obtener la configuración detallada del disco duro.

Cambiar los parámetros de configuración del disco

Por ejemplo, necesitamos modificar la política de disco real de los parámetros de la siguiente manera (es decir, la política ID para la política ID de la variable):

img

img

Esta estrategia tiene tres parámetros para ser probada.

Cambiar los parámetros de política del disco, pero es posible que no queramos cambiar la configuración de la bolsa de la política, pero para la función RestartRobot de la interfaz de API de extensión, o bien no se especifica ningún parámetro (el paquete original no funciona solo para iniciar el disco) o se deben especificar todas las configuraciones de parámetros.

Esto significa que antes de iniciar el disco con la función RestartRobot, primero debemos usar la función GetRobotDetail de la API extendida para acceder a la configuración actual del disco, y luego reemplazar la parte de parámetros que necesitamos modificar, reconstituir los parámetros de configuración para iniciar el disco (es decir, los parámetros que se van a usar cuando se llama a RestartRobot) y luego reiniciar el disco.

Así que ahora vamos a ir a través de la lista de robots, y vamos a obtener la configuración de parámetros actuales, uno por uno, en el siguiente código./**/La parte de los comentarios es la información detallada del disco real, y luego necesitamos procesar los 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": "测试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 en masa, mi disco real:

  • Prueba 1A
  • Prueba 1B

Se modificaron los parámetros en el caso de que los objetos de intercambio, los pares de transacciones y los ciclos de la línea K configurados no cambien:

La página de disco duro cambia automáticamente para:

img

En el código anterior, hemos especificado los parámetros para la modificación:

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

Enlace a la sección

Para varias decenas o cientos de placas, este método es más conveniente. En este ejemplo, se modifica a un parámetro uniforme, y, por supuesto, también puede personalizar sus propias reglas de modificación en el código para especificar una configuración de parámetros diferente para cada disco o especificar diferentes objetos de intercambio, pares de transacción, etc.

Para la plataforma FMZ, estas necesidades son flexibles y personalizadas, si tienes alguna idea, te invitamos a que nos hagas un comentario para que exploremos, estudiemos y aprendamos soluciones.


Más.

¡Vamos ahora!Es una gran cantidad de dinero para tener decenas, cientos de discos y un alquiler lunar.

Un sueño pequeño.Hay algunos que utilizan la API de FMZ para empaquetar productos, y hay muchos discos físicos.