As vantagens da utilização da API alargada da FMZ para uma gestão eficiente do controlo do grupo na negociação quantitativa

Autora:Lydia., Criado: 2023-11-20 14:05:49, Atualizado: 2024-01-01 12:16:20

img

Com a popularização e o desenvolvimento da negociação quantitativa, os investidores geralmente precisam gerenciar um grande número de contas reais, o que traz grandes desafios para decisões de negociação, monitoramento e execução. A fim de melhorar a eficiência de gerenciamento e reduzir a dificuldade operacional, os traders no FMZ podem usar a API estendida do FMZ para gerenciamento de controle de grupo.

Muitos usuários têm suas próprias contas ao vivo de clientes que precisam ser gerenciadas e mantidas. Quando há muitas contas ao vivo de clientes, uma maneira mais conveniente é necessária para gerenciá-las (tanto poucas como dezenas ou até centenas).

Monitorização centralizada

Através da API estendida do FMZ, você pode monitorar centralmente as atividades de negociação e as condições de ativos de todas as contas ao 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) + "`")
}

Desenho dos parâmetros da estratégia:

img

A funcionar em negociação ao vivo:

img

Execução de um clique

O gerenciamento de controle de grupo torna muito conveniente executar transações com um clique. Você pode comprar, vender e fechar posições em várias contas de negociação ao vivo simultaneamente sem ter que abrir cada conta individualmente. Isso não só melhora a eficiência de execução, mas também reduz a possibilidade de erros operacionais.

Depois de obter a lista de contas de negociação ao vivo, podemos enviar comandos para essas contas e executar uma série de operações predeterminadas. Por exemplo: compensação de posições na conta ao vivo, pausa de proteção na conta ao vivo, mudança de modos na conta ao vivo.CommandRobot.

À medida que continuamos a escrever código, só precisamos adicionar algumas interações e chamadas para a interface API estendidaCommandRobotna nossa função 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

A estratégia de controlo do grupo enviou instruções para Test 1 A e Test 1 B.

img img

img img

Sincronização da estratégia

Com a API estendida do FMZ, você pode facilmente implementar modificações por lotes de parâmetros de estratégia e iniciar ou parar o comércio ao vivo.

Resumo

Na negociação quantitativa, usando a API estendida do FMZ para gerenciamento de controle de grupo, os comerciantes podem monitorar, executar e ajustar várias contas reais de forma mais eficiente.

Para os traders que gerenciam um grande número de contas reais, a API estendida da FMZ fornece uma ferramenta poderosa e flexível que torna a negociação quantitativa mais conveniente e controlável.


Mais.