Những lợi thế của việc sử dụng API mở rộng của FMZ để quản lý kiểm soát nhóm hiệu quả trong giao dịch định lượng

Tác giả:Lydia., Tạo: 2023-11-20 14:05:49, Cập nhật: 2024-01-01 12:16:20

img

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.

Giám sát tập trung

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:

img

Chạy trên giao dịch trực tiếp:

img

Thực thi bằng một cú nhấp chuột

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 FMZs mở rộng APICommandRobot.

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ộngCommandRobottrong 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)
    }
}

img

Chiến lược kiểm soát nhóm đã gửi hướng dẫn cho Thử nghiệm 1 AThử nghiệm 1 B.

img img

img img

Phối hợp chiến lược

Với API mở rộng của FMZ, bạn có thể dễ dàng thực hiện các sửa đổi hàng loạt các thông số chiến lược, và bắt đầu hoặc dừng giao dịch trực tiếp hàng loạt.

Tóm lại

Trong giao dịch định lượng, bằng cách sử dụng API mở rộng của FMZ cho quản lý kiểm soát nhóm, các nhà giao dịch có thể theo dõi, thực hiện và điều chỉnh nhiều tài khoản trực tiếp hiệu quả hơn.

Đố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 cung cấp cho họ một công cụ mạnh mẽ và linh hoạt giúp giao dịch định lượng thuận tiện và có thể kiểm soát được hơn.


Thêm nữa