avatar of 发明者量化-小小梦 发明者量化-小小梦
집중하다 사신
4
집중하다
1271
수행원

FMZ 확장 API를 사용하여 실시간 매개변수를 일괄 수정하는 방법을 알려드립니다.

만든 날짜: 2023-12-09 20:39:41, 업데이트 날짜: 2025-05-16 17:00:20
comments   2
hits   1004

FMZ 확장 API를 사용하여 실시간 매개변수를 일괄 수정하는 방법을 알려드립니다.

FMZ에서 실시간 매개변수를 일괄적으로 수정하는 방법은 무엇입니까? 실제 디스크의 개수가 수십 개, 심지어 수백 개에 달하게 되면 실제 디스크를 하나하나 수동으로 구성하려고 하면 유지 관리가 매우 불편해집니다. 현재 FMZ의 확장 API를 사용하여 이러한 작업을 완료할 수 있습니다. 이 문서에서는 그룹 제어와 매개변수 업데이트에 대한 세부 정보를 살펴보겠습니다.

이전 문서에서는 FMZ의 확장 API를 사용하여 모든 실제 디스크를 모니터링하고, 실제 디스크를 그룹 제어하고, 실제 디스크로 지침을 보내는 방법을 알아보았습니다. 우리는 여전히 이전 문서에서 캡슐화된 코드를 호출하는 인터페이스를 기반으로 사용하고 실시간 매개변수의 일괄 수정을 실현하는 코드를 계속 작성합니다.

매개변수 설정:

FMZ 확장 API를 사용하여 실시간 매개변수를 일괄 수정하는 방법을 알려드립니다.

전략 코드:

// 全局变量
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 
}

먼저 FMZ 확장 API의 RestartRobot 함수를 알아보겠습니다.

일괄적으로 실시간 매개변수를 수정한 다음 실시간으로 실행해야 하는 경우에는 두 가지 상황이 있습니다.

  • 1. 실제 오퍼가 생성되었습니다. 실제로 생성된 디스크의 경우 다시 시작하려면 FMZ의 확장된 API 인터페이스인 RestartRobot 함수를 사용해야 합니다.
  • 2. 아직 실제 시장은 만들어지지 않았다 실제 디스크가 생성되지 않으면 실제 디스크 매개변수를 “수정”하는 개념이 없습니다. 이는 실제 디스크 작업의 일괄 생성에 속합니다. 이때 FMZ-NewRobot 함수의 확장 API 인터페이스가 사용됩니다.

그러나 어떤 방법을 사용하든 다음 아이디어와 작업은 유사하므로 다음으로 시작하겠습니다.RestartRobot이 확장된 API 함수는 예시로 사용됩니다.

RestartRobot 기능을 사용하는 방법은 두 가지가 있습니다.

  • 1. 실제 디스크 ID만 전달되고, 실제 디스크의 매개변수 구성은 전달되지 않습니다. 이 방법은 실제 디스크가 중지되면 매개변수 구성을 변경하지 않고 실제 디스크만 다시 시작합니다.
  • 2. 실제 디스크 ID와 실제 디스크의 매개변수 구성을 입력합니다. 이 방법은 새로운 매개변수 구성으로 실제 디스크 작업을 시작합니다.

첫 번째 방법은 우리 시나리오에는 쓸모가 없습니다. 왜냐하면 우리의 요구 사항은 대량의 실시간 매개변수를 일괄적으로 수정하는 것이기 때문입니다. 그래서 문제는 실제 시장의 매개변수 구성이 매우 복잡하다는 것입니다. 여기에는 거래소 대상 구성, 전략 매개변수 구성, K-라인 사이클 설정 등이 포함됩니다.

걱정하지 마세요. 하나하나씩 살펴보겠습니다.

운영에 필요한 실제 정보를 얻으세요

FMZ에서 실제 디스크의 매개변수 구성을 수정하려면 실제 디스크가 실행 중이 아닌 상태여야 합니다. 실행 상태가 아닌 실제 디스크만이 매개변수 구성을 수정할 수 있기 때문입니다. 작동하지 않는 실제 디스크는 다음과 같습니다.

  • 전략이 중단되었습니다.
  • 전략에 문제가 있어요. 멈춰주세요.

따라서 먼저 우리는 지정된 전략의 실제 시장을 얻어야 하며 이러한 실제 시장은 다음과 같습니다.정지 상태또는오류로 인해 중지상태.

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

이런 식으로, 우리는 수정해야 할 모든 실제 디스크 정보를 얻었습니다. 다음으로, 우리는 실제 디스크의 자세한 구성을 얻어야 합니다.

실제 디스크 구성 매개변수 수정

예를 들어, 매개변수를 수정해야 하는 실시간 전략은 다음과 같습니다(즉, 전략 ID가 strategyId 변수인 전략).

FMZ 확장 API를 사용하여 실시간 매개변수를 일괄 수정하는 방법을 알려드립니다.

FMZ 확장 API를 사용하여 실시간 매개변수를 일괄 수정하는 방법을 알려드립니다.

이 전략에는 실험적으로 3가지 매개변수가 있습니다.

실시간 전략 매개변수를 수정하지만, 전략의 거래소 구성을 수정하고 싶지 않을 수도 있습니다. 그러나 확장된 API 인터페이스 RestartRobot 함수의 경우 매개변수를 지정하지 않거나(실시간 거래를 그대로 시작) 모든 매개변수 구성을 지정해야 합니다.

이는 RestartRobot 함수를 사용하여 실제 디스크를 시작하기 전에 먼저 확장된 API 인터페이스 GetRobotDetail 함수를 사용하여 실제 디스크의 현재 구성을 얻은 다음 재구성을 위해 수정해야 하는 매개변수를 바꿔야 함을 의미합니다. 실제 디스크를 시작합니다(즉, 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)
    })
}

이 배치 매개변수 수정 전략을 실행한 후 실제 거래량은 다음과 같습니다.

  • 테스트 1A
  • 테스트 1B

구성된 교환 객체, 거래 쌍 및 K-라인 기간은 변경되지 않은 채로 매개변수가 수정됩니다.

실제 시장 페이지는 자동으로 다음으로 변경됩니다.

FMZ 확장 API를 사용하여 실시간 매개변수를 일괄 수정하는 방법을 알려드립니다.

그리고 달리기를 시작하세요. 위 코드에서 수정된 매개변수를 지정했기 때문입니다.

        // 更新参数
        var dicParams = {
            "pairs" : "AAA_BBB,CCC_DDD",
            "col" : "999",
            "htight" : "666"
        }

END

이 방법은 수십 개 또는 수백 개의 실제 디스크의 매개변수를 일괄 수정하는 데 더 편리합니다. 이 예에서 매개변수는 통합된 매개변수로 수정됩니다. 물론 코드에서 사용자 정의 수정 규칙을 만들고 각 실제 계정에 대해 다른 매개변수 구성을 지정할 수도 있습니다. 또는 다양한 거래소 대상, 거래 쌍 등을 지정하세요.

FMZ 플랫폼의 경우 이러한 요구 사항은 유연하게 사용자 지정하고 구현할 수 있습니다. 요구 사항이나 아이디어가 있으면 메시지를 남겨주세요. 함께 문제에 대한 해결책을 논의하고, 연구하고, 배우겠습니다.