Las ventajas de utilizar la API ampliada de FMZ para una gestión eficiente del control de grupo en el comercio cuantitativo

El autor:- ¿ Por qué?, Creado: 2023-11-20 14:05:49, Actualizado: 2024-01-01 12:16:20

img

Con la popularización y el desarrollo del comercio cuantitativo, los inversores a menudo necesitan administrar un gran número de cuentas en vivo, lo que trae grandes desafíos para las decisiones comerciales, el monitoreo y la ejecución.

Muchos usuarios tienen sus propias cuentas en vivo de clientes que necesitan administrar y mantener. Cuando hay muchas cuentas en vivo de clientes, se necesita una forma más conveniente para administrarlas (tan pocas como docenas o hasta cientos). FMZ proporciona una API extendida poderosa; usar esto para la administración de control de grupo se ha convertido en una opción ideal.

Control centralizado

A través de la API ampliada de FMZ, puede monitorear de forma centralizada las actividades comerciales y las condiciones de los activos de todas las cuentas en vivo.

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

Diseño de parámetros de estrategia:

img

En el comercio en vivo:

img

Ejecución con un solo clic

La gestión de control de grupo hace que sea muy conveniente ejecutar transacciones con un solo clic. Puede comprar, vender y cerrar posiciones en múltiples cuentas de negociación en vivo simultáneamente sin tener que abrir cada cuenta individualmente. Esto no solo mejora la eficiencia de la ejecución, sino que también reduce la posibilidad de errores operativos.

Después de obtener la lista de cuentas de trading en vivo, podemos enviar comandos a estas cuentas y realizar una serie de operaciones predeterminadas. Por ejemplo: compensación de posiciones en la cuenta en vivo, pausa de protección en la cuenta en vivo, cambio de modos en la cuenta en vivo.CommandRobot.

A medida que continuamos escribiendo código, sólo tenemos que añadir algunas interacciones y llamadas a la interfaz API extendidaCommandRoboten nuestra función principal:

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 estrategia de control del grupo envió instrucciones a Prueba 1 A y Prueba 1 B.

img img

img img

Sincronización de la estrategia

Con la API ampliada de FMZ, puede implementar fácilmente modificaciones por lotes de parámetros de estrategia, y comenzar o detener el comercio en vivo por lotes.

Resumen de las actividades

En el comercio cuantitativo, mediante el uso de la API ampliada de FMZ para la gestión de control de grupo, los operadores pueden monitorear, ejecutar y ajustar múltiples cuentas en vivo de manera más eficiente.

Para los operadores que gestionan un gran número de cuentas en vivo, la API extendida de FMZ les proporciona una herramienta poderosa y flexible que hace que el comercio cuantitativo sea más conveniente y controlable.


Más.