
Com a popularidade e o desenvolvimento da negociação quantitativa, os investidores geralmente precisam gerenciar um grande número de contas reais, o que traz enormes desafios para a tomada de decisões, monitoramento e execução de negociações. Para melhorar a eficiência da gestão e reduzir as dificuldades operacionais, os traders da FMZ podem usar a API estendida da FMZ para gerenciamento de controle de grupo. Este artigo explorará as vantagens de usar a API estendida do FMZ em negociações quantitativas e como obter um gerenciamento de controle de grupo eficiente.
Muitos usuários têm suas próprias contas de clientes que precisam ser gerenciadas e mantidas. Quando há um grande número de contas de clientes, uma maneira mais conveniente de gerenciamento e manutenção é necessária (pelo menos uma dúzia de contas e, no máximo, centenas de contas). A FMZ fornece uma API estendida poderosa, e o gerenciamento de controle de grupo por meio da API estendida da FMZ se torna uma escolha ideal.
Por meio da API estendida da FMZ, você pode monitorar centralmente as atividades de negociação e o status dos ativos de todas as contas reais. Seja verificando as posições de cada conta, registros históricos de transações ou monitoramento em tempo real da situação de lucros e perdas da conta, isso pode ser alcançado.
// 全局变量
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) + "`")
}
Parâmetros de design de estratégia:

Design de interação:

Operação de disco real:

O gerenciamento de controle de grupo torna muito fácil executar transações com um clique. Você pode comprar, vender, fechar posições e outras operações em várias ordens reais ao mesmo tempo, sem precisar abrir diferentes ordens reais uma por uma. Isso não apenas melhora a eficiência da execução, mas também reduz a possibilidade de erros operacionais.
Após obter as informações da lista em tempo real, podemos enviar instruções ao mercado em tempo real para executar uma série de operações predeterminadas. Por exemplo: liquidação em tempo real, proteção de suspensão em tempo real e troca de modo em tempo real. Eles podem ser estendidos por meio da API FMZCommandRobotconcluir.
Continuamos a escrever código, apenas adicionamos algumas interações e estendemos a interface da API na função principalCommandRobotA chamada:
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)
}
}

A estratégia de controle de grupo então enviou instruções para “Teste 1 A” e “Teste 1 B”.


Usando a API estendida da FMZ, você pode facilmente modificar parâmetros de estratégia em lotes e iniciar e interromper negociações reais em lotes. Devido à extensão do artigo, discutiremos em detalhes como modificar em lote os parâmetros da estratégia e iniciá-lo no próximo artigo.
Na negociação quantitativa, ao usar a API estendida da FMZ para gerenciamento de controle de grupo, os traders podem monitorar, executar e ajustar diversas contas reais com mais eficiência. Essa abordagem de gerenciamento centralizado não apenas melhora a eficiência operacional, mas também ajuda a implementar melhor o controle de riscos e a sincronização de estratégias. Para traders que gerenciam um grande número de contas reais, a API estendida da FMZ fornece uma ferramenta poderosa e flexível, tornando a negociação quantitativa mais conveniente e controlável.