Aprenda a modificar os parâmetros do disco físico em massa usando a FMZ Extension API

Autora:Sonhos pequenos, Criado: 2023-12-09 20:39:41, Atualizado: 2023-12-12 21:43:48

img

Como modificar em massa os parâmetros do disco rígido no FMZ? Quando o número de discos rígidos é superior a dezenas e chega a centenas, é muito inconveniente manter um disco rígido configurado manualmente. Neste momento, você pode usar a API de extensão do FMZ para realizar essas operações.

No artigo anterior, resolvemos como usar a API de extensão do FMZ para monitorar todos os discos físicos, consoles de grupo e enviar instruções para o disco físico. Ainda usando o código de chamada de interface que envolvemos no artigo anterior como base, continuamos a escrever o código para realizar a modificação em massa dos parâmetros do disco físico.

Parâmetros definidos:

img

O código da estratégia:

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

Conheça primeiro a função RestartRobot da FMZ Extension API

Quando precisamos modificar em massa os parâmetros do disco real e depois executar o disco real, este cenário tem dois primeiros casos.

  • 1o, o disco real já foi criado. Para discos que já foram criados, o reinicio natural é feito usando a função RestartRobot, um plugin de interface API de extensão do FMZ.
  • 2o Disco não criado Para não criar um disco real, não existe o conceito de modificar o parâmetro do disco real, mas é para criar um disco real em massa, usando a função NewRobot, uma interface API de extensão da FMZ.

Mas, de qualquer forma, as ideias e as ações que se seguem são muito diferentes, por isso, nós começamos a usar o termo "criação" para descrever o processo.RestartRobotEsta função de API de extensão é usada como exemplo de explicação.

Há duas maneiras de usar a função RestartRobot:

  • 1, apenas o ID do disco real é transmitido, não a configuração dos parâmetros do disco real. Este método mantém a configuração dos parâmetros do disco real quando ele é parado, apenas reinicia o disco real.
  • 2, para transmitir o ID do disco real, também para transmitir a configuração de parâmetros do disco real. Assim, o disco real é iniciado com a nova configuração de parâmetros.

O primeiro método não é útil para o cenário de demanda, porque nós mesmos precisamos modificar em massa uma grande quantidade de parâmetros do disco real. Então o problema é que a configuração de parâmetros do disco real é complexa, com configurações de objetos de câmbio, configurações de parâmetros de estratégia, configurações de ciclos de linha K, etc.

Não se preocupe, vamos investigar um a um.

Obter informações sobre o disco real a ser operado

No FMZ, se for necessário modificar a configuração dos parâmetros de um disco, este deve estar em estado não-operativo; porque só um disco que não esteja em estado operativo pode modificar a configuração dos parâmetros; um disco que não esteja em estado operativo pode estar em:

  • A estratégia foi interrompida.
  • A estratégia está errada, pare.

Então, primeiro, temos que obter os discos físicos com as políticas especificadas, e esses discos físicos estão emParadoOuHá um erro de parada.O estado do país.

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

Assim, temos toda a informação do disco rígido que precisa ser modificada para a configuração, e agora vamos obter as configurações detalhadas do disco rígido.

Modificar os parâmetros de configuração do disco

Por exemplo, precisamos alterar a política real do parâmetro da seguinte forma (ou seja, a política ID para a variável strategyId):

img

img

A estratégia tem três parâmetros para ser experimentada.

Modificar os parâmetros da política do disco, mas talvez não queiramos modificar a configuração do exchange da política, mas para a função RestartRobot da interface API de extensão, ou não especificar nenhum parâmetro (o portátil não funciona apenas para iniciar o disco), ou todas as configurações de parâmetros devem ser especificadas.

Isso significa que, antes de iniciar o disco com a função RestartRobot, temos que usar a função GetRobotDetail para obter a configuração atual do disco com a extensão API, substituir a parte de parâmetros que precisamos alterar, reconstituir os parâmetros de configuração para iniciar o disco (ou seja, os parâmetros a serem usados ao chamar o RestartRobot) e reiniciar o disco.

Então, a seguir, vamos percorrer a lista de robôs, e vamos obter uma configuração de parâmetros atual, uma a uma, no código abaixo./**/A parte de comentários é a informação detalhada do disco real, e depois precisamos processar esses dados.

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

Depois de executar esta estratégia de modificação de parâmetros em massa, meu disco real:

  • Teste 1A
  • Teste 1B

Os parâmetros foram alterados para que os objetos de troca, os pares de transações e o ciclo da linha K não mudassem:

A página do disco real é automaticamente alterada para:

img

A função é executada e iniciada. Porque nós especificamos o parâmetro de modificação no código acima:

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

Fim de ano

Para a modificação de parâmetros em massa de dezenas, centenas de discos, é mais conveniente usar este método. Neste exemplo, a modificação é de parâmetros uniformes, e, claro, você também pode personalizar suas próprias regras de modificação no código, especificando configurações de parâmetros diferentes para cada disco; ou especificando diferentes objetos de negociação, pares de negociação, etc.

Para a plataforma FMZ, essas necessidades são flexíveis e personalizáveis, quaisquer ideias são bem-vindas e deixe um comentário para que possamos explorar, pesquisar e aprender soluções para os problemas.


Mais.

Vou-me embora.Dezenas, centenas de discos, aluguel por mês é muito dinheiro.

Sonhos pequenosHá alguns que usam o FMZ para expandir a API de embalagem de produtos, e há muitos discos físicos.