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:
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
}
Quando precisamos modificar em massa os parâmetros do disco real e depois executar o disco real, este cenário tem dois primeiros casos.
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.RestartRobot
Esta função de API de extensão é usada como exemplo de explicação.
Há duas maneiras de usar a função RestartRobot:
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.
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:
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.
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):
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:
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:
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"
}
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.
Vou-me embora.Dezenas, centenas de discos, aluguel por mês é muito dinheiro.
Inventor quantificado - sonho pequenoHá alguns que usam o FMZ para expandir a API de embalagem de produtos, e há muitos discos físicos.