
Как изменять параметры реального времени в пакетном режиме на FMZ? Когда количество реальных дисков превышает десятки или даже достигает сотен, то очень неудобно вручную настраивать реальные диски по одному. В настоящее время для выполнения этих операций вы можете использовать расширенный API FMZ. В этой статье давайте рассмотрим некоторые подробности группового управления и обновления параметров.
В предыдущей статье мы решили, как использовать расширенный API FMZ для мониторинга всех реальных дисков, группового управления реальными дисками и отправки инструкций реальным дискам. Мы по-прежнему используем код вызова интерфейса, инкапсулированный в предыдущей статье, в качестве основы и продолжаем писать код для реализации пакетной модификации параметров в реальном времени.
Настройки параметров:

Код стратегии:
// 全局变量
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
}
Когда нам необходимо изменять параметры реального времени пакетами, а затем запускать процесс в реальном времени, в этом сценарии возможны две ситуации.
Но какой бы метод ни использовался, следующие идеи и операции схожи, поэтому начнем сRestartRobotЭта расширенная функция API используется в качестве примера.
Существует два способа использования функции RestartRobot:
Первый метод бесполезен для нашего сценария, поскольку нам требуется изменять большое количество параметров в реальном времени пакетами. Таким образом, проблема заключается в том, что конфигурация параметров реального рынка очень сложна, включая конфигурацию объекта обмена, конфигурацию параметров стратегии, настройку цикла K-линии и т. д.
Не волнуйтесь, мы рассмотрим их по одному.
В FMZ, если вы хотите изменить конфигурацию параметров реального диска, то реальный диск должен находиться в нерабочем состоянии. Потому что только реальный диск, который не находится в рабочем состоянии, может изменять конфигурацию параметров. Реальный диск, который не работает, может быть:
Итак, сначала нам нужно получить реальный рынок указанной стратегии, и эти реальные рынки находятся вОстановить состояниеилиОстановка при ошибкестатус.
function main() {
var stopRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 4)
var errorRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 5)
var robotList = stopRobotList.concat(errorRobotList)
}
Таким образом, мы получили всю информацию о реальном диске, которую необходимо изменить. Далее нам необходимо получить подробную конфигурацию реального диска.
Например, стратегия в реальном времени, параметры которой нам необходимо изменить, выглядит следующим образом (т. е. стратегия, идентификатором которой является переменная strategyId):


Данная стратегия имеет 3 параметра, как эксперимент.
Измените параметры стратегии в реальном времени, но мы можем не захотеть изменять конфигурацию обмена стратегии. Однако для функции RestartRobot расширенного интерфейса API либо не указаны параметры (просто запустите торговлю в реальном времени как есть), либо Все конфигурации параметров должны быть указаны.
Это означает, что перед использованием функции RestartRobot для запуска реального диска мы должны сначала использовать функцию GetRobotDetail расширенного интерфейса API для получения текущей конфигурации реального диска, а затем заменить параметры, которые необходимо изменить для повторного построения запуск реального диска (то есть вызов параметров, которые будут использоваться при RestartRobot), а затем перезапуск реального диска.
Итак, далее мы проходим robotList и получаем текущую конфигурацию параметров по одному. В следующем коде/**/Прокомментированная часть представляет собой подробную информацию о фактической транзакции, и нам необходимо обработать эти данные далее.
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)
})
}
После запуска этой стратегии пакетной модификации параметров мой фактический объем торговли составляет:
Параметры изменяются, а настроенный объект обмена, торговая пара и период K-линии остаются неизменными:
Реальная страница рынка автоматически изменится на:

И начинайте бежать. Потому что мы указали измененные параметры в приведенном выше коде:
// 更新参数
var dicParams = {
"pairs" : "AAA_BBB,CCC_DDD",
"col" : "999",
"htight" : "666"
}
Этот метод более удобен для пакетного изменения параметров десятков или сотен реальных дисков. В этом примере параметры изменены на единый. Конечно, вы также можете настроить собственные правила модификации в коде и указать различные конфигурации параметров для каждого реального счета. Или укажите другие объекты обмена, торговые пары и т. д.
Для платформы FMZ эти требования могут быть гибко настроены и реализованы. Если у вас есть какие-либо требования или идеи, пожалуйста, оставьте сообщение, и мы обсудим, исследуем и найдем решения проблем вместе.