리소스 로딩... 로딩...

FMZ 확장 API를 사용하여 대량으로 디스크 변수를 변경하는 방법을 알려줍니다.

저자:발명가들의 수량화 - 작은 꿈, 생성: 2023-12-09 20:39:41, 업데이트: 2024-11-06 21:17:27

img

FMZ에서 대량으로 디스크를 수정하는 방법은 무엇입니까? 디스크 수가 수십 개 이상의 경우, 수백 개에 도달하면 디스크를 수동으로 구성하는 것이 매우 불편합니다. 이 경우 FMZ의 확장 API를 사용하여 작업을 수행 할 수 있습니다.

이전 문서에서는 FMZ의 확장 API를 사용하여 모든 디스크, 그룹 디스크를 모니터링하고 디스크에 명령어를 보내는 방법을 해결했습니다.

패러미터 설정:

img

이 문서는 다른 문장과 연결됩니다.

// 全局变量
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의 확장 API 인터페이스 NewRobot 함수를 사용하여 대량으로 리얼 디스크를 만듭니다.

하지만 어떤 방식으로든, 다음의 아이디어와 동작은 거의 똑같습니다.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가 전략Id 변수에 대한 전략):

img

img

이 전략은 세 가지 매개 변수를 가지고 있습니다.

실제 디스크의 정책 매개 변수를 변경할 수 있습니다. 하지만 아마도 우리는 정책의 거래소 설정을 변경하고 싶지 않을 수도 있습니다. 그러나 확장 API 인터페이스 RestartRobot 함수에 대해, 아무 매개 변수를 지정하지 않거나 모든 매개 변수 설정을 지정해야 합니다.

즉, 다음으로 우리는 RestartRobot 함수를 사용하여 디스크를 시작하기 전에 확장 API 인터페이스 GetRobotDetail 함수를 사용하여 디스크의 현재 구성에 액세스해야 합니다. 그리고 우리는 변경해야 할 파라미터의 일부를 교체하고 디스크의 시작 (즉, RestartRobot을 호출할 때 사용해야 할 파라미터) 의 구성 파라미터를 재구성하고 디스크를 다시 시작합니다.

그래서 다음으로 우리는 로봇 리스트를 니다. 그리고 현재 변수 구성을 하나씩 얻습니다./**/이 부분에서는 디스크에 대한 세부 정보를 설명하고, 그 다음에는 데이터를 처리해야 합니다.

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 라인 주기가 변하지 않는 경우 변수를 변경합니다:

이 페이지의 페이지가 자동으로 변경됩니다.

img

그리고 실행을 시작합니다. 왜냐하면 우리는 위의 코드에서 변경된 매개 변수를 지정했기 때문입니다.

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

END

수십, 수백 개의 디스크의 대용량 수정 매개 변수를 위해, 이 방법은 비교적 편리하다. 이 예에서는 통일된 매개 변수로 수정된다. 물론 당신은 또한 코드에서 자신의 수정 규칙을 사용자 지정할 수 있으며, 각 디스크에 다른 매개 변수 설정을 지정할 수 있다. 또는 다른 거래소 객체를 지정할 수 있다.

FMZ 플랫폼의 경우 이러한 요구 사항은 모두 유연하게 맞춤화 될 수 있으며, 어떤 요구 사항이 있는지에 대한 아이디어가 있다면, 함께 문제를 연구하고 학습할 수 있는 솔루션을 논의할 수 있도록 의견을 남길 것을 환영합니다.


더 많은

알레즈-z수십 개, 수백 개의 실제 디스크, 한 달의 임대료는 많은 돈입니다.

발명가들의 수량화 - 작은 꿈FMZ 확장 API를 사용하는 제품 패키지도 있고, 실제 디스크도 많이 있습니다.