Die Ressourcen sind geladen. Beförderung...

Wie man die FMZ-Erweiterte API verwendet, um die Parameter des Bots zu ändern

Schriftsteller:FMZ~Lydia, Erstellt: 2023-12-11 13:37:55, Aktualisiert: 2024-11-06 21:16:44

img

Wie kann ich die Parameter von Live-Tradings in Chargen auf FMZ ändern? Wenn die Anzahl der Live-Tradings Dutzende übersteigt und Hunderte erreicht, wäre es sehr unbequem, Live-Tradings einzeln manuell zu konfigurieren. Zu diesem Zeitpunkt können wir die FMZ erweiterte API verwenden, um diese Operationen abzuschließen. In diesem Artikel werden wir die Gruppenkontrolle des Bots erforschen, einige Details der Parameter aktualisieren.

In dem vorherigen Artikel haben wir das Problem gelöst, wie wir die FMZ erweiterte API verwenden, um alle Live-Tradings zu überwachen, Live-Tradings zu steuern und Befehle an die Live-Tradings zu senden.

Einstellungen der Parameter:

img

Strategiecode:

// Global variable
var isLogMsg = true   // Controls whether logs are printed or not
var isDebug = false   // Debugging mode
var arrIndexDesc = ["all", "running", "stop"]
var descRobotStatusCode = ["Idle", "Running", "Stopping", "Exited", "Stopped", "There is an error in the strategy"]
var dicRobotStatusCode = {
    "all" : -1,
    "running" : 1,
    "stop" : 4,
}

// Extended logging functions
function LogControl(...args) {
    if (isLogMsg) {
        Log(...args)
    }
}

// FMZ extended API call functions
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)  // Control frequency
    return ret 
}

// Get information about all running bots for the specified strategy 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("Maximum number of retries exceeded", 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 
}

Lernen Sie zuerst die RestartRobot-Funktion der FMZ Extended API kennen

Wenn wir die Parameter des Live-Handels modifizieren und dann ausführen müssen, gibt es 2 Fälle für dieses Szenario.

    1. Bot wurde erstellt Für einen Live-Handel, der bereits erstellt wurde, ist es natürlich, ihn mit der RestartRobot-Funktion neu zu starten, die eine erweiterte API-Schnittstelle zu FMZ ist.
    1. Es wurde kein Bot erstellt Für den Live-Handel wurde nicht erstellt, es gibt keine Notwendigkeit, modifizieren die Parameter des Live-Handels, das ist die Chargenerstellung des Live-Handels zu laufen, und wir verwenden FMZ erweiterte API-Schnittstelle - NewRobot Funktion.

Aber egal, welche Art von Methode, die nächste Idee sowie die Operation sind ähnlich, so werden wir dieRestartRoboterweiterte API-Funktion als Beispiel zu erklären.

Die RestartRobot-Funktion wird auf zwei Arten verwendet:

    1. Konfiguration mit nur Live-Trading-ID, nicht mit den Parametern des Live-Tradings Dieser Ansatz hält die Parameterkonfiguration unverändert, wenn der Live-Handel eingestellt wurde, und startet nur den Live-Handel neu.
    1. Konfiguration mit Live-Trading-ID und den Parametern des Live-Tradings Dieser Ansatz startet den Live-Handel mit der neuen Parameterkonfiguration.

Der erste Ansatz ist nicht nützlich für unser Nachfrage-Szenario, weil unsere eigene Nachfrage ist, eine große Anzahl von Parametern des Live-Handels in großen Mengen zu modifizieren.

Machen Sie sich keine Sorgen, wir erforschen sie einzeln.

Erhalten Sie die Informationen über den Live-Handel, den Sie betreiben möchten

Wenn Sie die Parameterkonfiguration eines Live-Handels ändern möchten, muss er nicht ausgeführt werden. Denn nur ein Live-Handel, der nicht ausgeführt wird, kann seine Parameterkonfiguration ändern. Ein Live-Handel, der nicht im laufenden Zustand ist, kann in:

  • Die Strategie hat aufgehört.
  • Die Strategie hat Fehler, gestoppt.

Also müssen wir die Live-Handels für die angegebene Strategie zuerst zu bekommen, und diese Live-Handels sind in einemStandstillzustandoderIch habe einen Fehler, um zu stoppen.

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

Dies gibt uns alle Informationen über den Live-Handel, die wir brauchen, um die Konfiguration zu ändern, als nächstes werden wir die detaillierte Konfiguration des Live-Handels zu bekommen.

Änderung der Live-Handelskonfigurationsparameter

Zum Beispiel ist die Live-Handelsstrategie, für die wir die Parameter ändern müssen, wie folgt (d. h. die Strategie, deren Strategie-ID die Strategie-Id-Variable ist):

img

img

Die Strategie hat 3 Parameter als Test.

Ändern Sie die Strategieparameter für den Live-Handel, aber vielleicht wollen wir nicht die Strategie s Exchange-Konfiguration zu ändern, aber für die erweiterte API-Schnittstelle RestartRobot Funktion, entweder keine Parameter angegeben werden (wie ist nur den Live-Handel starten) oder alle Parameterkonfigurationen müssen angegeben werden.

Das heißt, bevor wir die RestartRobot-Funktion verwenden, um den Live-Handel zu starten, müssen wir die erweiterte API-Schnittstelle GetRobotDetail-Funktion verwenden, um zuerst die aktuelle Konfiguration des Live-Handels zu erhalten, und dann ersetzen wir den Teil der Parameter, die geändert werden müssen, um die Konfigurationsparameter für den Start des Live-Handels neu zu konstruieren (dh die Parameter, die verwendet werden, um RestartRobot anzurufen), und dann den Live-Handel neu starten.

Also, als nächstes durchqueren wir robotList, und erhalten Sie die aktuelle Parameter-Konfiguration eins nach dem anderen, die/**/Kommentierte Teil des folgenden Codes sind die Live-Handel Details, müssen wir mit diesen Daten umgehen.

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": "Test 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\",\"Currency list\",\"English comma spacing\",\"BTC_USDT,ETH_USDT,EOS_USDT,LTC_USDT\"],[\"col\",\"breadth\",\"Total width of the page is 12\",6],[\"htight\",\"height\",\"unit px\",600],[\"$$$__cmd__$$$coverSymbol\",\"close the position\",\"close out trading pairs\",\"\"]]",
                        "strategy_exchange_pairs": "[3600,[186193],[\"BTC_USD\"]]",
                        "strategy_id": 131242,
                        "strategy_last_modified": "2023-12-09 23:14:33",
                        "strategy_name": "Test 1",
                        ...
                    }
                },
                "error": null
            }
        }
        */

        // Parse the exchange configuration data
        var exchangePairs = JSON.parse(robotDetail.data.result.robot.strategy_exchange_pairs)

        // Get the exchange object index, trading pairs, these settings are not going to be changed
        var arrExId = exchangePairs[1]
        var arrSymbol = exchangePairs[2]

        // Parse parameter configuration data
        var params = JSON.parse(robotDetail.data.result.robot.robot_args)

        // Update parameters
        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]])  // Construct the strategy parameters and update the new parameter values
                }
            }
        })
        
        // Note that if there are spaces in the data you need to transcode it, otherwise the request will report an error
        settings = {
            "name": robotDetail.data.result.robot.name,
            // Strategy parameter
            "args": newParams,         
            // The strategy ID can be obtained by the GetStrategyList method.
            "strategy": robotDetail.data.result.robot.strategy_id,
            // K-period parameter, 60 means 60 seconds
            "period": exchangePairs[0],
            // Specifies which docker to run on; not writing this attribute means automatically assigning the run
            "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) // Test
        var retRestart = callFmzExtAPI(accessKey, secretKey, "RestartRobot", robotInfo.id, settings)
        Log("retRestart:", retRestart)
    })
}

Nachdem ich die Parametermodifikationsstrategie ausgeführt habe, habe ich live gehandelt:

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

Die Parameter wurden per Batch geändert, wobei die konfigurierten Börsenobjekte, Handelspare und K-Line-Perioden unverändert blieben:

Es wurde automatisch auf der Live-Handelsseite geändert:

img

Wir haben die modifizierten Parameter im obigen Code festgelegt:

        // Update parameters
        var dicParams = {
            "pairs" : "AAA_BBB,CCC_DDD",
            "col" : "999",
            "htight" : "666"
        }

Ende

Für Dutzende, Hunderte von Live-Trading-Batch ändern Parameter, diese Methode ist bequemer. Im Beispiel werden die Parameter zu einer einheitlichen modifiziert, natürlich können Sie Ihre eigenen Modifikationsregeln im Code anpassen, um verschiedene Parameterkonfigurationen für jeden Live-Handel anzugeben. Oder spezifizieren Sie verschiedene Austauschobjekte, Handel Paare und so weiter.

Für die FMZ-Plattform sind diese Anforderungen flexibel und anpassbar zu erreichen. Fühlen Sie sich frei, einen Kommentar zu hinterlassen, wenn Sie irgendwelche Anforderungsideen haben, wir können diskutieren, recherchieren und voneinander lernen und die Lösung für das Problem finden.


Mehr