O recurso está a ser carregado... Carregamento...

Utilizando a API de extensão do FMZ para gerenciamento de clusters eficientes, aproveite a vantagem de transações quantitativas

Autora:Inventor quantificado - sonho pequeno, Criado: 2023-11-19 20:57:18, Atualizado: 2023-12-09 23:21:49

img

Com a popularização e o desenvolvimento da negociação quantitativa, os investidores geralmente precisam gerenciar grandes quantidades de contas físicas, o que cria grandes desafios para a decisão, monitoramento e execução de negociações. Para aumentar a eficiência da administração e reduzir a dificuldade operacional, os traders no FMZ podem usar a API de extensão do FMZ para gerenciamento de blocos. Este artigo explora as vantagens da aplicação da API de extensão do FMZ na negociação quantitativa e como alcançar uma gestão de blocos eficiente.

Muitos usuários têm seus próprios discos rígidos de clientes que precisam de manutenção administrada, e quando o disco rígido do cliente é muito grande, é necessário uma maneira mais conveniente de administrar a manutenção (menos de dez discos rígidos, mais de cem discos rígidos). FMZ oferece uma API de extensão poderosa, tornando-se uma opção ideal para o gerenciamento de clusters através da API de extensão do FMZ.

Monitorização centralizada

Através da extensão da API do FMZ, você pode monitorar centralmente as atividades de negociação e a situação dos ativos de todas as contas em tempo real. Pode ser feito por meio de exames de posicionamento de cada conta, registros históricos de transações ou monitoramento de ganhos e prejuízos em tempo real.

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

O projeto de parâmetros estratégicos:

img

Design interativo:

img

Disco real:

img

Execução de uma tecla

O gerenciamento de blocos torna a execução de uma transação de um único botão muito simples. Você pode fazer operações de compra, venda, liquidação, etc. em várias placas ao mesmo tempo, sem ter que abrir diferentes placas individualmente para operar. Isso não só aumenta a eficiência da execução, mas também reduz a possibilidade de erros na operação.

Depois de obter as informações da lista do disco, podemos enviar instruções para o disco para executar uma série de operações estabelecidas. Por exemplo: limpeza do disco, proteção do disco suspenso, mudança de modo do disco. Tudo isso pode ser feito através da API de extensão do FMZ.CommandRobotA realização.

Continuamos a escrever código, só precisamos de adicionar algumas interações e extensões de interfaces API nas funções principais.CommandRobotO que você está fazendo?

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

A política de controle de grupo envia instruções para "Teste 1 A" e "Teste 1 B".

img

img

Sincronização estratégica

Usando a API de extensão do FMZ, você pode facilmente implementar parâmetros de política de modificação em lote, inicialização em lote e parada de disco real. Dado o conteúdo do artigo, sobre os parâmetros do disco rígido da estratégia de modificação em massa, comece nosso próximo artigo em detalhes.

A conclusão

Em transações quantitativas, o gerenciamento de clusters é feito usando a API de extensão do FMZ, permitindo que os traders monitorem, executem e ajustem mais eficientemente várias contas físicas. Essa forma centralizada de gerenciamento não só aumenta a eficiência operacional, mas também ajuda a implementar melhor o controle de riscos e a sincronização de estratégias. Para os traders que gerenciam uma grande quantidade de contas físicas, a API de expansão da FMZ oferece uma ferramenta poderosa e flexível para tornar a quantificação de transações mais fácil e controlável.


Mais.