
С ростом популярности и развития количественной торговли инвесторам обычно приходится управлять большим количеством реальных счетов, что создает огромные трудности при принятии торговых решений, мониторинге и исполнении. Чтобы повысить эффективность управления и снизить операционные трудности, трейдеры FMZ могут использовать расширенный API FMZ для управления групповым контролем. В этой статье будут рассмотрены преимущества использования расширенного API FMZ в количественной торговле и способы достижения эффективного управления групповым контролем.
У многих пользователей есть свои собственные клиентские аккаунты, которые необходимо управлять и поддерживать. Когда клиентских аккаунтов много, необходим более удобный способ управления и поддержки (минимум дюжина аккаунтов, максимум сотни аккаунтов). FMZ предоставляет мощный расширенный API, и управление групповым контролем через расширенный API FMZ становится идеальным выбором.
Благодаря расширенному API FMZ вы можете централизованно отслеживать торговую активность и состояние активов всех реальных счетов. Этого можно добиться, будь то проверка позиций по каждому счету, исторические записи транзакций или мониторинг прибылей и убытков по счету в режиме реального времени.
// 全局变量
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) + "`")
}
Разработка параметров стратегии:

Проектирование взаимодействия:

Реальная работа диска:

Групповое управление контролем позволяет легко выполнять транзакции одним щелчком мыши. Вы можете покупать, продавать, закрывать позиции и совершать другие операции по нескольким реальным ордерам одновременно, без необходимости открывать разные реальные ордера по одному. Это не только повышает эффективность выполнения, но и снижает вероятность операционных ошибок.
Получив информацию о списке в режиме реального времени, мы можем отправлять инструкции на рынок в режиме реального времени для выполнения ряда заранее определенных операций. Например: ликвидация в реальном времени, защита от приостановки в реальном времени и переключение режимов в реальном времени. Их можно расширить через FMZ API.CommandRobotвыполнить.
Продолжаем писать код, просто добавляем некоторые взаимодействия и расширяем интерфейс API в основной функции.CommandRobotЗвонок:
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)
}
}

Затем стратегия группового контроля отправляла инструкции «Тесту 1 А» и «Тесту 1 Б».


Используя расширенный API FMZ, вы можете легко изменять параметры стратегии пакетами, а также запускать и останавливать реальную торговлю пакетами. Из-за большого объема статьи мы подробно рассмотрим, как пакетно изменять параметры стратегии и запустить ее, в следующей статье.
В количественной торговле, используя расширенный API FMZ для управления групповым контролем, трейдеры могут более эффективно отслеживать, исполнять и корректировать несколько реальных счетов. Такой централизованный подход к управлению не только повышает операционную эффективность, но и помогает лучше реализовать контроль рисков и синхронизацию стратегий. Для трейдеров, управляющих большим количеством реальных счетов, расширенный API FMZ предоставляет мощный и гибкий инструмент, делая количественную торговлю более удобной и контролируемой.