Die Ressourcen sind geladen. Beförderung...

Effiziente Cluster-Management-Vorteile bei quantitativen Transaktionen mit FMZs erweiterten API

Schriftsteller:Die Erfinder quantifizieren - Kleine Träume, Erstellt: 2023-11-19 20:57:18, Aktualisiert: 2023-12-09 23:21:49

img

Im Zuge der Verbreitung und Entwicklung von Quantitative Trades müssen Anleger häufig eine große Anzahl von Live-Konten verwalten, was eine große Herausforderung für die Handelsentscheidung, Überwachung und Ausführung darstellt. Um die Verwaltungseffizienz zu verbessern und die Operationsschwierigkeit zu reduzieren, können Händler auf FMZ die FMZ-Erweiterungs-API für die Clusterverwaltung verwenden.

Viele Benutzer haben ihre eigenen Client-Fixits zu verwalten und zu warten. FMZ bietet eine leistungsstarke Erweiterungs-API, die das Cluster-Management durch die FMZ-Erweiterungs-API ideal macht.

Zentrale Überwachung

Mit der FMZ-API-Erweiterung können Sie die Handelsaktivitäten und die Vermögensstatus aller Live-Konten zentral überwachen.

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

function main() {
    var robotStatusCode = dicRobotStatusCode[arrIndexDesc[robotStatus]]
    var robotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, robotStatusCode)
    if (!robotList) {
        Log("获取实盘数据失败")
    }
    
    var robotTbl = {"type": "table", "title": "实盘列表", "cols": [], "rows": []}
    robotTbl.cols = ["实盘Id", "实盘名称", "实盘状态", "策略名称", "实盘收益"]

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

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

Strategieparameter:

img

Interaktives Design:

img

Die Festplatte läuft:

img

Einfach ausführen

Cluster-Management macht es sehr einfach, Transaktionen mit einem einzigen Schlüssel auszuführen. Sie können auf mehreren Platten gleichzeitig kaufen, verkaufen, platzieren usw. ohne dass Sie einzeln verschiedene Platten öffnen müssen. Dies verbessert nicht nur die Ausführungseffizienz, sondern reduziert auch die Wahrscheinlichkeit von Fehlern.

Nach der Festplattenliste können wir Anweisungen an die Festplatte senden, um eine Reihe von vorgegebenen Aktionen auszuführen. Zum Beispiel: Festplattenräumung, Festplattenunterbrechungsschutz, Festplattenmoduswechsel. Dies alles kann über die FMZ-Erweiterungs-API erfolgen.CommandRobotIch bin nicht derjenige, der das tut.

Wir schreiben weiterhin Code, wir müssen nur einige Interaktionen und erweiterte API-Schnittstellen in die Hauptfunktionen hinzufügen.CommandRobotDer Anruf:

function main() {
    var robotStatusCode = dicRobotStatusCode[arrIndexDesc[robotStatus]]
    var robotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, robotStatusCode)
    if (!robotList) {
        Log("获取实盘数据失败")
    }
    
    var robotTbl = {"type": "table", "title": "实盘列表", "cols": [], "rows": []}
    robotTbl.cols = ["实盘Id", "实盘名称", "实盘状态", "策略名称", "实盘收益"]

    _.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(), ", 等待接收交互命令", "\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 = "清仓"               // 可以定义所需的消息格式
                    if (robotInfo.status != 1) {     // 只有”活着“的实盘才能接收命令
                        return 
                    }
                    var ret = callFmzExtAPI(accessKey, secretKey, "CommandRobot", parseInt(robotInfo.id), strCmd)
                    LogControl("向id:", robotInfo.id, "的实盘发送命令:", strCmd, ", 执行结果:", ret)
                })
            }
        }
        Sleep(1000)
    }
}

img

Die Cluster-Control-Politik sendet Anweisungen an "Test 1 A" und "Test 1 B".

img

img

Strategie synchronisiert

Mit der FMZ-Erweiterung API können Sie die Parameter für die Änderung der Bündelpolitik, die Bündelstarts und -Stopps der Festplatte einfach umsetzen. In Anbetracht des Inhalts des Artikels werden die Parameter für die Massenmodifizierung der Festplattenparameter in unserem nächsten Artikel eingehend erläutert.

Abschluss

In Quantitative Trades kann der Händler mehrere reale Konten effizienter überwachen, ausführen und anpassen. Diese zentralisierte Verwaltung verbessert nicht nur die operative Effizienz, sondern hilft auch, Risikokontrolle und Strategie-Synchronisierung besser umzusetzen. Für Händler, die eine große Anzahl von Live-Konten verwalten, bietet FMZs erweiterte API ein leistungsfähiges und flexibles Tool, das es einfacher und kontrollierter macht, Transaktionen zu quantifizieren.


Mehr