Die Vorteile der Nutzung der erweiterten API von FMZ für ein effizientes Gruppenkontrollmanagement im quantitativen Handel

Schriftsteller:Lydia., Erstellt: 2023-11-20 14:05:49, Aktualisiert: 2024-01-01 12:16:20

img

Mit der Popularisierung und Entwicklung des quantitativen Handels müssen Anleger häufig eine große Anzahl von Live-Konten verwalten, was große Herausforderungen für Handelsentscheidungen, Überwachung und Ausführung mit sich bringt. Um die Managementeffizienz zu verbessern und die operativen Schwierigkeiten zu reduzieren, können Händler auf FMZ die erweiterte API von FMZ für das Gruppenkontrollmanagement verwenden. In diesem Artikel werden wir die Vorteile der Verwendung der erweiterten API von FMZ im quantitativen Handel und wie wir ein effizientes Gruppenkontrollmanagement erreichen, diskutieren.

Viele Benutzer haben ihre eigenen Live-Kundenkonten, die verwaltet und gewartet werden müssen. Wenn es viele Live-Kundenkonten gibt, ist eine bequemere Art und Weise erforderlich, sie zu verwalten (so wenige wie Dutzende oder so viele wie Hunderte). FMZ bietet eine leistungsstarke erweiterte API; die Verwendung dieser für das Gruppenkontrollmanagement ist eine ideale Wahl geworden.

Zentralisierte Überwachung

Durch FMZs erweiterte API können Sie die Handelsaktivitäten und Vermögensbedingungen aller Live-Konten zentral überwachen.

// Global variable
var isLogMsg = true   // Control whether the log is printed
var isDebug = false   // Debug mode
var arrIndexDesc = ["all", "running", "stop"]
var descRobotStatusCode = ["In idle", "Running", "Stopping", "Exited", "Stopped", "Strategy error"]
var dicRobotStatusCode = {
    "all" : -1,
    "running" : 1,
    "stop" : 4,
}

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

// FMZ extended API call function
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 
}

// Obtain all live trading information of 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("Exceeded the maximum number of retries", 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 
}

function main() {
    var robotStatusCode = dicRobotStatusCode[arrIndexDesc[robotStatus]]
    var robotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, robotStatusCode)
    if (!robotList) {
        Log("Failed to obtain live trading data")
    }
    
    var robotTbl = {"type": "table", "title": "live trading list", "cols": [], "rows": []}
    robotTbl.cols = ["live trading Id", "live trading name", "live trading status", "strategy name", "live trading profit"]

    _.each(robotList, function(robotInfo) {
        robotTbl.rows.push([robotInfo.id, robotInfo.name, descRobotStatusCode[robotInfo.status], robotInfo.strategy_name, robotInfo.profit])
    })

    LogStatus(_D(), "`" + JSON.stringify(robotTbl) + "`")
}

Strategieparameterentwurf:

img

Auf Live-Trading läuft:

img

Ausführung mit einem Klick

Das Gruppenmanagement macht es sehr praktisch, Transaktionen mit einem Klick auszuführen. Sie können gleichzeitig auf mehreren Live-Handelskonten kaufen, verkaufen und Positionen schließen, ohne jedes Konto einzeln öffnen zu müssen. Dies verbessert nicht nur die Ausführungseffizienz, sondern reduziert auch die Möglichkeit von Betriebsfehlern.

Nachdem wir die Liste der Live-Handelskonten erhalten haben, können wir Befehle an diese Konten senden und eine Reihe von vorgegebenen Operationen ausführen. Zum Beispiel: Positionen im Live-Konto klären, den Schutz im Live-Konto pausieren, die Modi im Live-Konto wechseln. All dies kann durch FMZs erweiterte API erreicht werdenCommandRobot.

Wie wir weiterhin Code schreiben, müssen wir nur einige Interaktionen und Anrufe auf die erweiterte API-Schnittstelle hinzufügenCommandRobotin unserer Hauptfunktion:

function main() {
    var robotStatusCode = dicRobotStatusCode[arrIndexDesc[robotStatus]]
    var robotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, robotStatusCode)
    if (!robotList) {
        Log("Failed to obtain live trading data")
    }
    
    var robotTbl = {"type": "table", "title": "live trading list", "cols": [], "rows": []}
    robotTbl.cols = ["live trading Id", "live trading name", "live trading status", "strategy name", "live trading profit"]

    _.each(robotList, function(robotInfo) {
        robotTbl.rows.push([robotInfo.id, robotInfo.name, descRobotStatusCode[robotInfo.status], robotInfo.strategy_name, robotInfo.profit])
    })

    LogStatus(_D(), "`" + JSON.stringify(robotTbl) + "`")

    while(true) {
        LogStatus(_D(), ", Waiting to receive interactive commands", "\n", "`" + JSON.stringify(robotTbl) + "`")

        var cmd = GetCommand()
        if (cmd) {
            var arrCmd = cmd.split(":")
            if (arrCmd.length == 1 && cmd == "coverAll") {
                _.each(robotList, function(robotInfo) {
                    var strCmd = "Clearance"               // You can define the required message format
                    if (robotInfo.status != 1) {     // Only the "live" trading platform can receive commands.
                        return 
                    }
                    var ret = callFmzExtAPI(accessKey, secretKey, "CommandRobot", parseInt(robotInfo.id), strCmd)
                    LogControl("Send command to the live trading board with id: ", robotInfo.id, ":", strCmd, ", execution result:", ret)
                })
            }
        }
        Sleep(1000)
    }
}

img

Die Kontrollstrategie der Gruppe hat Anweisungen an Test 1 A und Test 1 B gesendet.

img img

img img

Synchronisierung der Strategie

Mit der erweiterten API von FMZ können Sie leicht Batch-Modifikationen von Strategieparametern implementieren und den Live-Handel per Batch starten oder stoppen.

Zusammenfassung

Im quantitativen Handel können Händler mithilfe der erweiterten API von FMZ für das Gruppenkontrollmanagement mehrere Live-Konten effizienter überwachen, ausführen und anpassen.

Für Händler, die eine große Anzahl von Live-Konten verwalten, bietet die erweiterte API von FMZ ein leistungsstarkes und flexibles Tool, das den quantitativen Handel komfortabler und kontrollierbarer macht.


Mehr