Les ressources ont été chargées... Je charge...

Utilisation de l'API étendue FMZ pour une gestion efficace des clusters dans les transactions quantitatives

Auteur:L'inventeur de la quantification - un petit rêve, Créé: 2023-11-19 20:57:18, Mis à jour: 2023-12-09 23:21:49

img

Avec la popularité et l'évolution des transactions quantitatives, les investisseurs ont souvent besoin de gérer un grand nombre de comptes réels, ce qui pose de grands défis à la prise de décision, à la surveillance et à l'exécution des transactions. Pour améliorer l'efficacité de la gestion et réduire la difficulté d'exploitation, les traders peuvent utiliser l'API étendue FMZ pour gérer les groupes sur FMZ. Cet article explore les avantages de l'application de l'API étendue FMZ dans les transactions quantitatives et comment réaliser une gestion efficace des groupes.

Beaucoup d'utilisateurs ont leurs propres disques clients qui ont besoin d'être gérés et maintenus, et lorsqu'ils sont très nombreux, ils ont besoin d'un moyen plus pratique de gérer la maintenance (plusieurs dizaines de disques, parfois des centaines de disques). FMZ offre une API d'extension puissante, ce qui en fait une option idéale pour la gestion de groupe via l'API d'extension FMZ.

Surveillance centralisée

Grâce à l'API étendue de FMZ, vous pouvez surveiller de manière centralisée l'activité et l'état des actifs de tous les comptes en direct.

// 全局变量
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) + "`")
}

Les paramètres stratégiques:

img

La conception interactive:

img

Le disque fonctionne:

img

Exécution d'une touche

La gestion de groupe rend l'exécution d'une transaction très simple. Vous pouvez acheter, vendre, liquider, etc. sur plusieurs disques en même temps sans avoir à ouvrir différents disques individuellement. Cela améliore non seulement l'efficacité de l'exécution, mais réduit également le risque d'erreur.

Une fois que nous avons les informations de la liste du disque, nous pouvons envoyer des instructions au disque pour effectuer une série d'opérations prédéfinies. Par exemple: nettoyage du disque, protection du disque, changement de mode du disque. Tout cela peut être fait via l'API étendue FMZ.CommandRobotJe ne suis pas d'accord.

Nous continuons à écrire du code, juste pour ajouter des interfaces interactives et étendues à l'API dans la fonction principale.CommandRobotIl y a eu un appel à l'aide:

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

La stratégie de contrôle de groupe envoie des instructions à "test 1 A" et "test 1 B".

img

img

Synchronisation stratégique

Avec l'API étendue de FMZ, vous pouvez facilement mettre en œuvre des paramètres de stratégie de modification en série, de démarrage en série et d'arrêt en série. En ce qui concerne les paramètres de disque dur de la stratégie de modification en série, nous allons vous en dire plus dans l'article suivant.

Le mot de la fin

Dans les transactions quantitatives, la gestion des clusters est effectuée à l'aide de l'API étendue de FMZ, permettant aux traders de surveiller, exécuter et régler plus efficacement plusieurs comptes réels. Cette gestion centralisée améliore non seulement l'efficacité opérationnelle, mais contribue également à une meilleure mise en œuvre des contrôles de risque et de la synchronisation des stratégies. Pour les traders qui gèrent un grand nombre de comptes en direct, l'API étendue de FMZ leur offre un outil puissant et flexible qui rend la quantification des transactions plus facile et plus contrôlable.


Plus de