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:
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
}
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.
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 oRestartRobot
Função de API estendida como exemplo para explicar.
A função RestartRobot é usada de duas maneiras:
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.
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:
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.
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):
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:
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:
Porque especificamos os parâmetros modificados no código acima:
// Update parameters
var dicParams = {
"pairs" : "AAA_BBB,CCC_DDD",
"col" : "999",
"htight" : "666"
}
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.