Die Ressourcen sind geladen. Beförderung...

Wie man die Festplattenparameter mit der FMZ-Erweiterungs-API in großen Mengen modifiziert

Schriftsteller:Die Erfinder quantifizieren - Kleine Träume, Erstellt: 2023-12-09 20:39:41, Aktualisiert: 2024-11-06 21:17:27

img

Wie kann man die Festplattenparameter in FMZ massenhaft ändern? Wenn es mehr als ein paar Dutzend von Festplatten gibt, und wenn es Hunderte gibt, ist es sehr schwierig, die Festplatte manuell zu konfigurieren.

Im letzten Artikel haben wir gelöst, wie wir FMZs Erweiterungs-API verwenden, um alle Festplatten, Gruppen-Kontrollplatten zu überwachen und Anweisungen an die Festplatte zu senden.

Parameter Einstellung:

img

Das ist ein sehr schwieriger Fall.

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

Erst einmal mit der Funktion RestartRobot für die FMZ-Erweiterung API

Wenn wir die Festplattenparameter massenhaft ändern und dann die Festplatte ausführen müssen, gibt es zunächst zwei Szenarien.

  • 1. Die Festplatte wurde erstellt. Für die bereits erstellte Festplatte wird ein natürlicher Neustart mit der Funktion RestartRobot durchgeführt, die die erweiterte API-Schnittstelle von FMZ verwendet.
  • 2. Die Festplatte wurde noch nicht erstellt. Für die nicht erstellte Festplatte gibt es keine Konzeption für die Änderung der Festplattenparameter, sondern es geht um die Massenerstellung von Festplatten, bei der die Funktion NewRobot verwendet wird.

Aber in jedem Fall sind die nächsten Ideen und Handlungen ziemlich unterschiedlich.RestartRobotDiese Erweiterungs-API-Funktion wird als Beispiel verwendet.

Die RestartRobot-Funktion kann auf zwei Arten verwendet werden:

  • 1, nur die Festplatten-ID, keine Festplatten-Parameterkonfiguration. Diese Methode behält die Parameterkonfiguration bei Festplattenstillstand unverändert und ist lediglich ein Neustart der Festplatte.
  • 2, die Festplatten-ID und die Parameterkonfiguration der Festplatte werden übermittelt. Das ist ein einfaches Verfahren, um die Festplatte mit den neuen Parameterkonfigurationen zu starten.

Die erste Methode ist für unsere Bedarfsszenarien nicht geeignet, da wir selbst eine große Anzahl von Festplattenparametern in großen Mengen ändern müssen. Das Problem ist also, dass die Parameterkonfiguration der Festplatte sehr kompliziert ist, mit Austauschobjektkonfigurationen, Strategieparameterkonfigurationen, K-Line-Zyklus-Einstellungen und so weiter.

Keine Sorge, wir werden es einzeln herausfinden.

Erhalten Sie Speicher-Informationen für die zu handhabenden Aktionen

Bei FMZ muss die Parameterkonfiguration einer Festplatte nicht in Betrieb sein, wenn sie geändert werden soll. Die Parameterkonfiguration kann nur von einer nicht in Betrieb befindlichen Festplatte geändert werden.

  • Die Strategie ist gestoppt.
  • Die Strategie ist falsch, stoppen.

Also müssen wir zunächst die Festplatten mit den angegebenen Strategien bekommen, und diese Festplatten befinden sich in derHaltestandOderFehler beim StoppenIch bin nicht derjenige, der das sagt.

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

Wir haben also alle Informationen über die Festplattenkonfiguration, die wir ändern müssen, und dann müssen wir detaillierte Festplattenkonfigurationen erhalten.

Änderungen der Festplattenkonfiguration

Zum Beispiel müssen wir die Festplattenpolitik, in der die Parameter geändert werden, wie folgt ändern (d. h. die Strategie-ID für die Strategie-Id-Variante):

img

img

Die Strategie besteht aus drei Parametern, die als Experiment dienen.

Ändern Sie die Politikparameter der Festplatte, aber möglicherweise möchten wir die Konfiguration der Börse der Politik nicht ändern, aber für die Erweiterung der API-Interface RestartRobot-Funktion müssen entweder keine Parameter angegeben werden (die ursprüngliche Inaktivität startet nur die Festplatte), oder alle Parameterkonfigurationen müssen angegeben werden.

Das heißt, bevor wir die Festplatte mit der RestartRobot-Funktion starten, müssen wir zunächst die GetRobotDetail-Funktion der erweiterten API-Schnittstelle verwenden, um auf die aktuelle Festplattenkonfiguration zu gelangen, und dann ersetzen wir die Parameter, die wir ändern müssen, um die Konfigurationsparameter für die Festplattenstartung (d. h. die Parameter, die bei der Aufforderung von RestartRobot verwendet werden sollen) neu zu erstellen und die Festplatte neu zu starten.

Also gehen wir weiter durch die RobotList und holen uns die aktuellen Parameterkonfigurationen einzeln, in folgender Code./**/Die Kommentare sind Details der Festplatte, die wir dann verarbeiten müssen.

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)
    })
}

Nach dem Ausführen dieser Strategie zur Massenänderung der Parameter wird meine Festplatte:

  • Test 1A
  • Test 1B

Die Parameter wurden geändert, wenn die konfigurierten Austauschobjekte, Handelspare und K-Linie-Zyklen unverändert sind:

Die Seite wird automatisch geändert, um:

img

Und es wird ausgeführt. Denn wir haben in der oben genannten Code die Parameter für die Änderung angegeben:

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

Ende

Für Dutzende oder Hunderte von Festplatten ist es relativ einfach, diese Methode zu verwenden. In diesem Fall werden sie als einheitliche Parameter geändert. Natürlich können Sie auch Ihre eigenen Modifikationsregeln im Code anpassen, indem Sie für jede Festplatte eine andere Parameterkonfiguration angeben.

Für die FMZ-Plattform sind diese Bedürfnisse flexibel und individuell umsetzbar.


Mehr

- Ich komme.Es gibt Dutzende, Hunderte von Festplatten, und die Miete ist viel Geld.

Die Erfinder quantifizieren - Kleine TräumeEs gibt einige Produkte, die mit der FMZ-Erweiterung API verpackt sind, und es gibt viele Festplatten.