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

Les avantages de l'utilisation de l'API étendue de FMZ pour une gestion efficace du contrôle de groupe dans le commerce quantitatif

Auteur:FMZ~Lydia, Créé: 2023-11-20 14:05:49, Mis à jour: 2024-01-01 12:16:20

img

Avec la popularisation et le développement du trading quantitatif, les investisseurs ont souvent besoin de gérer un grand nombre de comptes en direct, ce qui pose de grands défis aux décisions de trading, au suivi et à l'exécution.

Beaucoup d'utilisateurs ont leurs propres comptes clients en direct qui doivent être gérés et maintenus.

Surveillance centralisée

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

// 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) + "`")
}

Conception des paramètres de stratégie:

img

En cours de négociation:

img

Exécution en un clic

La gestion du contrôle de groupe rend très pratique l'exécution des transactions en un clic. Vous pouvez acheter, vendre et fermer des positions sur plusieurs comptes de trading en direct simultanément sans avoir à ouvrir chaque compte individuellement. Cela améliore non seulement l'efficacité de l'exécution, mais réduit également la possibilité d'erreurs opérationnelles.

Après avoir obtenu la liste des comptes de trading en direct, nous pouvons envoyer des commandes à ces comptes et effectuer une série d'opérations prédéterminées.CommandRobot.

Comme nous continuons à écrire du code, nous avons juste besoin d'ajouter quelques interactions et appels à l'interface API étendueCommandRobotdans notre fonction principale:

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

La stratégie de contrôle du groupe a envoyé des instructions à Test 1 A et Test 1 B.

img img

img img

Synchronisation de la stratégie

Avec l'API étendue de FMZ, vous pouvez facilement implémenter des modifications par lots des paramètres de stratégie, et démarrer ou arrêter le trading en direct par lots.

Résumé

Dans le trading quantitatif, en utilisant l'API étendue de FMZ pour la gestion du contrôle de groupe, les traders peuvent surveiller, exécuter et ajuster plusieurs comptes en direct plus efficacement.

Pour les traders gérant un grand nombre de comptes en direct, l'API étendue de FMZ leur fournit un outil puissant et flexible qui rend le trading quantitatif plus pratique et contrôlable.


Plus de