avatar of 发明者量化-小小梦 发明者量化-小小梦
konzentrieren Sie sich auf Private Nachricht
4
konzentrieren Sie sich auf
1271
Anhänger

Erfahren Sie, wie Sie mithilfe der erweiterten FMZ-API Echtzeitparameter stapelweise ändern können

Erstellt in: 2023-12-09 20:39:41, aktualisiert am: 2025-05-16 17:00:20
comments   2
hits   1004

Erfahren Sie, wie Sie mithilfe der erweiterten FMZ-API Echtzeitparameter stapelweise ändern können

Wie ändere ich die Echtzeitparameter stapelweise in FMZ? Wenn die Anzahl der realen Festplatten Dutzende oder sogar Hunderte übersteigt, ist die Wartung sehr umständlich, wenn Sie die realen Festplatten einzeln manuell konfigurieren. Derzeit können Sie die erweiterte API von FMZ verwenden, um diese Vorgänge abzuschließen. Lassen Sie uns in diesem Artikel einige Details zur Gruppensteuerung und Aktualisierung von Parametern untersuchen.

Im vorherigen Artikel haben wir erklärt, wie man mit der erweiterten API von FMZ alle realen Datenträger überwacht, reale Datenträger gruppenweise steuert und Anweisungen an reale Datenträger sendet. Wir verwenden weiterhin den im vorherigen Artikel gekapselten Schnittstellenaufrufcode als Grundlage und schreiben weiterhin Code, um die Stapeländerung von Echtzeitparametern zu realisieren.

Parametereinstellungen:

Erfahren Sie, wie Sie mithilfe der erweiterten FMZ-API Echtzeitparameter stapelweise ändern können

Strategiecode:

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

Lassen Sie uns zunächst die RestartRobot-Funktion der FMZ-Erweiterungs-API verstehen.

Wenn wir die Echtzeitparameter stapelweise ändern und dann in Echtzeit ausführen müssen, gibt es in diesem Szenario zwei Situationen.

  • 1. Das eigentliche Angebot wurde erstellt Beim Neustart einer real erstellten Festplatte wird natürlich die erweiterte API-Schnittstelle von FMZ verwendet – die Funktion „RestartRobot“.
  • 2. Der echte Markt ist noch nicht geschaffen Wenn keine reale Festplatte erstellt wird, gibt es kein Konzept zum „Ändern“ der Parameter der realen Festplatte. Dies gehört zur Stapelerstellung von Operationen zur realen Festplatte. Zu diesem Zeitpunkt wird die erweiterte API-Schnittstelle der FMZ-NewRobot-Funktion verwendet.

Aber egal, welche Methode verwendet wird, die folgenden Ideen und Operationen sind ähnlich, also beginnen wir mitRestartRobotDiese erweiterte API-Funktion wird als Beispiel verwendet.

Es gibt zwei Möglichkeiten, die Funktion RestartRobot zu verwenden:

  • 1. Es wird nur die ID der realen Festplatte übergeben, die Parameterkonfiguration der realen Festplatte wird nicht übergeben. Bei dieser Methode bleibt die Parameterkonfiguration beim Stoppen der realen Festplatte unverändert und startet nur die reale Festplatte neu.
  • 2. Geben Sie die reale Datenträger-ID und die Parameterkonfiguration des realen Datenträgers ein. Diese Methode startet den tatsächlichen Festplattenbetrieb mit neuer Parameterkonfiguration.

Die erste Methode ist für unser Szenario unbrauchbar, da unsere Anforderung darin besteht, eine große Anzahl von Echtzeitparametern stapelweise zu ändern. Das Problem besteht also darin, dass die Parameterkonfiguration des realen Marktes sehr kompliziert ist, einschließlich der Konfiguration von Austauschobjekten, der Konfiguration von Strategieparametern, der Einstellung des K-Line-Zyklus usw.

Keine Sorge, wir werden sie einzeln erkunden.

Holen Sie sich die echten Informationen, die Sie benötigen

Wenn Sie bei FMZ die Parameterkonfiguration einer realen Festplatte ändern möchten, muss sich die reale Festplatte in einem nicht laufenden Zustand befinden. Denn nur die reale Festplatte, die sich nicht im Betriebszustand befindet, kann die Parameterkonfiguration ändern. Eine reale Festplatte, die nicht in Betrieb ist, kann sein:

  • Strategie gestoppt.
  • Da stimmt etwas mit der Strategie nicht, hör auf.

Also müssen wir zuerst den realen Markt der angegebenen Strategie erhalten, und diese realen Märkte sind inStoppzustandoderBei Fehler anhaltenStatus.

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

Auf diese Weise haben wir alle realen Festplatteninformationen erhalten, die geändert werden müssen. Als Nächstes müssen wir die detaillierte Konfiguration der realen Festplatte abrufen.

Ändern der Konfigurationsparameter für reale Datenträger

Beispielsweise lautet die Echtzeitstrategie, deren Parameter wir ändern müssen, wie folgt (d. h. die Strategie, deren Strategie-ID die Variable „strategyId“ ist):

Erfahren Sie, wie Sie mithilfe der erweiterten FMZ-API Echtzeitparameter stapelweise ändern können

Erfahren Sie, wie Sie mithilfe der erweiterten FMZ-API Echtzeitparameter stapelweise ändern können

Diese Strategie hat experimentell 3 Parameter.

Ändern Sie die Parameter der Echtzeitstrategie, aber wir möchten möglicherweise nicht die Börsenkonfiguration der Strategie ändern. Für die erweiterte API-Schnittstelle RestartRobot-Funktion geben Sie jedoch entweder keine Parameter an (starten Sie den Echtzeithandel einfach so, wie er ist), oder alle Parameterkonfigurationen müssen angegeben werden.

Das bedeutet, dass wir, bevor wir die Funktion RestartRobot verwenden, um die reale Festplatte zu starten, zuerst die erweiterte API-Schnittstelle GetRobotDetail verwenden müssen, um die aktuelle Konfiguration der realen Festplatte abzurufen und dann die Parameter zu ersetzen, die geändert werden müssen, um die Starten Sie die reale Festplatte (d. h. rufen Sie die beim RestartRobot zu verwendenden Parameter auf) und starten Sie dann die reale Festplatte neu.

Als nächstes durchlaufen wir robotList und holen uns die aktuelle Parameterkonfiguration nacheinander. Im folgenden Code/**/Der kommentierte Teil enthält die detaillierten Informationen zur tatsächlichen Transaktion. Diese Daten müssen wir als Nächstes verarbeiten.

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 Änderung von Batch-Parametern beträgt mein tatsächliches Handelsvolumen:

  • Prüfung 1A
  • Prüfung 1B

Die Parameter werden geändert, während das konfigurierte Börsenobjekt, das Handelspaar und die K-Line-Periode unverändert bleiben:

Die echte Marktseite wechselt automatisch zu:

Erfahren Sie, wie Sie mithilfe der erweiterten FMZ-API Echtzeitparameter stapelweise ändern können

Und fang an zu rennen. Weil wir im obigen Code die geänderten Parameter angegeben haben:

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

END

Diese Methode eignet sich besser für die stapelweise Änderung der Parameter von Dutzenden oder Hunderten realer Festplatten. In diesem Beispiel werden die Parameter zu einem einheitlichen geändert. Natürlich können Sie im Code auch Ihre eigenen Änderungsregeln anpassen und für jedes reale Konto unterschiedliche Parameterkonfigurationen angeben. Oder geben Sie verschiedene Tauschobjekte, Handelspaare usw. an.

Für die FMZ-Plattform können diese Anforderungen flexibel angepasst und umgesetzt werden. Wenn Sie Anforderungen oder Ideen haben, hinterlassen Sie bitte eine Nachricht und wir werden gemeinsam Lösungen für die Probleme diskutieren, erforschen und lernen.