Với sự phổ biến và phát triển của giao dịch định lượng, các nhà đầu tư thường cần quản lý một số lượng lớn tài khoản trực tiếp, điều này mang lại những thách thức lớn cho các quyết định giao dịch, giám sát và thực hiện. Để cải thiện hiệu quả quản lý và giảm khó khăn hoạt động, các nhà giao dịch trên FMZ có thể sử dụng API mở rộng của FMZ để quản lý kiểm soát nhóm.
Nhiều người dùng có tài khoản khách hàng trực tiếp của riêng họ cần quản lý và duy trì. Khi có nhiều tài khoản khách hàng trực tiếp, cần một cách thuận tiện hơn để quản lý chúng (chỉ có vài chục hoặc hàng trăm). FMZ cung cấp một API mở rộng mạnh mẽ; sử dụng điều này cho quản lý kiểm soát nhóm đã trở thành một lựa chọn lý tưởng.
Thông qua API mở rộng của FMZ, bạn có thể theo dõi trung tâm các hoạt động giao dịch và điều kiện tài sản của tất cả các tài khoản trực tiếp.
// 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) + "`")
}
Thiết kế tham số chiến lược:
Chạy trên giao dịch trực tiếp:
Quản lý kiểm soát nhóm làm cho nó rất thuận tiện để thực hiện giao dịch với một cú nhấp chuột. Bạn có thể mua, bán và đóng các vị trí trên nhiều tài khoản giao dịch trực tiếp đồng thời mà không cần phải mở từng tài khoản riêng lẻ. Điều này không chỉ cải thiện hiệu quả thực hiện mà còn làm giảm khả năng lỗi hoạt động.
Sau khi có được danh sách các tài khoản giao dịch trực tiếp, chúng ta có thể gửi lệnh đến các tài khoản này và thực hiện một loạt các hoạt động đã xác định trước. Ví dụ: bù trừ vị trí trong tài khoản trực tiếp, tạm dừng bảo vệ trong tài khoản trực tiếp, chuyển đổi chế độ trong tài khoản trực tiếp. Tất cả những điều này có thể đạt được thông qua FMZCommandRobot
.
Khi chúng tôi tiếp tục viết mã, chúng tôi chỉ cần thêm một số tương tác và cuộc gọi đến giao diện API mở rộngCommandRobot
trong chức năng chính của chúng tôi:
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)
}
}
Chiến lược kiểm soát nhóm đã gửi hướng dẫn cho
Với API mở rộng của FMZ
Trong giao dịch định lượng, bằng cách sử dụng API mở rộng của FMZ
Đối với các nhà giao dịch quản lý một số lượng lớn tài khoản trực tiếp, API mở rộng của FMZ