Ensine-o a usar a FMZ Extended API para Batch Modify Parameters do Bot

Autora:Lydia., Criado: 2023-12-11 13:37:55, Atualizado: 2024-01-02 21:22:49

img

Como posso alterar os parâmetros das negociações ao vivo em lote no FMZ? Quando o número de negociações ao vivo excede dezenas e atinge centenas, seria muito inconveniente configurar as negociações ao vivo uma a uma manualmente. Neste momento, podemos usar a API estendida do FMZ para concluir essas operações. Então, neste artigo, vamos explorar o controle de grupo do bot, atualizar alguns detalhes dos parâmetros.

No artigo anterior, nós resolvemos o problema de como usar a API estendida FMZ para monitorar todas as negociações ao vivo, controle de grupo de negociações ao vivo, e enviar comandos para as negociações ao vivo.

Configurações de parâmetros:

img

Código de estratégia:

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

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

Quando precisamos de batch modificar os parâmetros da negociação ao vivo e depois executá-lo, há 2 casos para este cenário para começar.

    1. Bot foi criado Para uma negociação ao vivo que já foi criada, é natural reiniciá-la usando a função RestartRobot, que é uma interface API estendida para FMZ.
    1. Bot não foi criado Para a negociação ao vivo não foi criado, não há necessidade de modificar os parâmetros da negociação ao vivo, que é a criação de lote da negociação ao vivo para executar, e usamos FMZ extensão API interface - função NewRobot.

Mas não importa que tipo de método, a próxima idéia, bem como a operação são semelhantes, por isso vamos usar oRestartRobotFunção de API estendida como exemplo para explicar.

A função RestartRobot é usada de duas maneiras:

    1. Configuração com apenas o ID de negociação em tempo real transmitido, não os parâmetros da negociação em tempo real Esta abordagem mantém a configuração dos parâmetros inalterada quando a negociação ao vivo é interrompida e reinicia apenas a negociação ao vivo.
    1. Configuração com o ID de negociação em tempo real e os parâmetros de negociação em tempo real transmitidos Esta abordagem inicia a negociação em tempo real com a nova configuração de parâmetros.

A primeira abordagem não é útil para o nosso cenário de demanda, porque a nossa própria demanda é modificar um grande número de parâmetros da negociação ao vivo a granel.

Não se preocupe, vamos explorá-los um por um.

Obtenha as informações da negociação ao vivo que deseja operar

No FMZ, se você quiser modificar a configuração de parâmetros de uma negociação ao vivo, então ela deve não estar em execução. Porque apenas uma negociação ao vivo que não esteja em execução pode ter sua configuração de parâmetros modificada. Uma negociação ao vivo que não esteja no estado de execução pode estar em:

  • A estratégia parou.
  • A estratégia tem erros, parou.

Então precisamos obter as negociações ao vivo para a estratégia especificada primeiro, e essas negociações ao vivo estão em umestado paradoouter um erro para parar.

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

Isso nos dá todas as informações sobre o comércio ao vivo que precisamos para mudar a configuração de, em seguida, vamos obter a configuração detalhada do comércio ao vivo.

Modificação dos parâmetros de configuração de negociação em tempo real

Por exemplo, a estratégia de negociação ao vivo para a qual precisamos modificar os parâmetros é a seguinte (ou seja, a estratégia cujo ID de estratégia é a variável strategyId):

img

img

A estratégia tem 3 parâmetros como teste.

Modificar os parâmetros da estratégia para a negociação ao vivo, mas talvez não queiramos modificar a configuração de troca da estratégia, mas para a função Extended API interface RestartRobot, ou nenhum parâmetro é especificado (como é apenas iniciar a negociação ao vivo) ou todas as configurações de parâmetros devem ser especificadas.

Ou seja, antes de usarmos a função RestartRobot para iniciar a negociação ao vivo, devemos usar a função GetRobotDetail da interface API estendida para obter a configuração atual da negociação ao vivo primeiro, e então substituímos a parte dos parâmetros que precisam ser modificados, para reconstruir os parâmetros de configuração para o início da negociação ao vivo (ou seja, os parâmetros que serão usados para chamar o RestartRobot), e depois reiniciar a negociação ao vivo.

Então, a seguir nós atravessar robotList, e obter a configuração de parâmetros atual um por um, o/**/comentado parte do código a seguir é os detalhes de negociação ao vivo, precisamos lidar com 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": "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)
    })
}

Depois de executar a estratégia de modificação de parâmetros de lote, a minha negociação ao vivo:

  • Teste 1A
  • Teste 1B

A modificação por lotes dos parâmetros foi feita com os objetos de troca configurados, pares de negociação e períodos de linha K inalterados:

Foi alterado na página de negociação em tempo real automaticamente:

img

Porque especificamos os parâmetros modificados no código acima:

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

Fim de ano

Para dezenas, centenas de lotes de negociação ao vivo modificar parâmetros, este método é mais conveniente. No exemplo, os parâmetros são modificados para um uniforme, é claro que você pode personalizar suas próprias regras de modificação no código para especificar diferentes configurações de parâmetros para cada negociação ao vivo. Ou especificar diferentes objetos de troca, pares de negociação e assim por diante.

Para a plataforma FMZ, esses requisitos são flexíveis e personalizáveis para serem alcançados.


Mais.