¿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:
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
}
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.
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".RestartRobot
Esta función de API de extensión se utiliza como ejemplo de explicación.
La función RestartRobot se utiliza de dos maneras:
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.
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.
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.
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):
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:
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:
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"
}
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.
¡Vamos ahora!Es una gran cantidad de dinero para tener decenas, cientos de discos y un alquiler lunar.
Los inventores cuantifican - sueños pequeñosHay algunos que utilizan la API de FMZ para empaquetar productos, y hay muchos discos físicos.