En la carga de los recursos... Cargando...

Utiliza la API de extensión de FMZ para lograr una administración de control de grupo eficiente con ventajas en transacciones cuantitativas

El autor:Los inventores cuantifican - sueños pequeños, Creado: 2023-11-19 20:57:18, Actualizado: 2023-12-09 23:21:49

img

A medida que la comercialización y el desarrollo de las transacciones cuantitativas aumentan, los inversores suelen tener que administrar una gran cantidad de cuentas reales, lo que plantea enormes desafíos para la toma de decisiones, el monitoreo y la ejecución de las transacciones. Para mejorar la eficiencia de la administración y reducir la dificultad operativa, los traders en FMZ pueden usar la API de extensión de FMZ para administrar el grupo.

Muchos usuarios tienen sus propios discos de clientes que necesitan ser administrados y mantenidos, y cuando los discos de clientes son muy grandes, necesitan una forma más conveniente de administrar el mantenimiento (por lo general, unas pocas decenas de discos, o cientos de discos). FMZ ofrece una potente API de extensión, por lo que la administración de grupos a través de la API de extensión de FMZ es una opción ideal.

La vigilancia centralizada

A través de la API ampliada de FMZ, puede monitorear centralmente la actividad comercial y el estado de los activos de todas las cuentas en vivo. Puede verificar el estado de tenencia de las cuentas, los registros históricos de transacciones o monitorear en tiempo real el estado de las ganancias y pérdidas de las cuentas.

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

Los parámetros de diseño de la estrategia:

img

El diseño interactivo:

img

Disco en marcha:

img

Ejecución de una tecla

La gestión de grupos hace que la ejecución de transacciones de un solo botón sea muy sencilla. Puede realizar operaciones de compra, venta, liquidación, etc. en varios discos físicos al mismo tiempo sin tener que abrir diferentes discos físicos para operar individualmente. Esto no solo mejora la eficiencia de la ejecución, sino que también reduce la posibilidad de errores en la operación.

Una vez obtenida la información de la lista del disco, podemos enviar instrucciones al disco para realizar una serie de operaciones establecidas. Por ejemplo: limpieza del disco, protección de suspensión del disco, cambio de modo del disco. Todo esto se puede hacer a través de la API de extensión de FMZ.CommandRobot¿Qué es lo que está pasando?

Seguimos escribiendo el código, sólo hay que añadir algunas interactividades y extender las interfaces API en las funciones principales.CommandRobotEl mensaje fue:

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 política de control de grupo envía instrucciones a "Teste 1 A" y "Teste 1 B".

img

img

Sincronización estratégica

Utilizando la API de extensión de FMZ, puede implementar fácilmente los parámetros de política de modificación de lotes, inicio y parada de lotes. Dado el contenido del artículo, sobre los parámetros del disco real de la estrategia de modificación masiva, vamos a comenzar con más detalles en nuestro próximo artículo.

Las palabras finales

En la transacción cuantitativa, mediante la administración de clusters mediante el uso de la API de extensión de FMZ, los operadores pueden monitorear, ejecutar y ajustar varias cuentas en vivo de manera más eficiente. Esta forma centralizada de administración no solo mejora la eficiencia operativa, sino que también ayuda a implementar mejor el control de riesgos y la sincronización de estrategias. Para los traders que gestionan una gran cantidad de cuentas en vivo, la API ampliada de FMZ les ofrece una herramienta poderosa y flexible que hace que la transacción cuantitativa sea más fácil y controlada.


Más.