Tài nguyên đang được tải lên... tải...

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

Tác giả:Những nhà phát minh định lượng - những giấc mơ nhỏ, Tạo: 2023-11-19 20:57:18, Cập nhật: 2023-12-09 23:21:49

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 phải quản lý một lượng lớn tài khoản thực tế, điều này mang lại những thách thức lớn cho quyết định giao dịch, giám sát và thực hiện. Để tăng hiệu quả quản lý và giảm khó khăn trong 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ý đám đông. Bài viết này sẽ xem xét những lợi thế của việc sử dụng API mở rộng FMZ trong giao dịch định lượng và làm thế nào để thực hiện quản lý đám đông hiệu quả.

Có rất nhiều người sử dụng có máy chủ thực của riêng họ cần quản lý bảo trì, khi máy chủ thực rất lớn, họ cần một cách thuận tiện hơn để quản lý bảo trì (thường là vài chục máy chủ thực, thường là hàng trăm máy chủ thực). FMZ cung cấp API mở rộng mạnh mẽ, quản lý nhóm thông qua API mở rộng của FMZ là một lựa chọn lý tưởng.

Giám sát tập trung

Với API mở rộng của FMZ, bạn có thể theo dõi tập trung các hoạt động giao dịch và tình trạng tài sản của tất cả các tài khoản thực.

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

Thiết kế các tham số chiến lược:

img

Thiết kế tương tác:

img

Khả năng hoạt động:

img

Một phím thực hiện

Quản lý tập hợp làm cho việc thực hiện giao dịch một nút trở nên rất đơn giản. Bạn có thể thực hiện các giao dịch mua, bán, đặt hàng, v.v. cùng một lúc trên nhiều ổ đĩa mà không cần phải mở các ổ đĩa khác nhau để thực hiện các giao dịch. Điều này không chỉ cải thiện hiệu quả thực thi mà còn giảm khả năng sai sót trong hoạt động.

Sau khi có được thông tin danh sách ổ đĩa, chúng ta có thể gửi lệnh đến ổ đĩa để thực hiện một loạt các hoạt động được thiết lập. Ví dụ: xóa ổ đĩa, bảo vệ tạm dừng ổ đĩa, chuyển đổi chế độ ổ đĩa. Tất cả đều có thể được thực hiện thông qua API mở rộng của FMZ.CommandRobotNhững gì bạn đang làm là tốt.

Chúng tôi tiếp tục viết mã, chỉ cần thêm một số giao tiếp và mở rộng API trong hàm chínhCommandRobotNgười ta gọi:

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

Các chiến lược kiểm soát nhóm đã gửi các chỉ thị cho "kiểm tra 1A" và "kiểm tra 1B".

img

img

Chiến lược đồng bộ

Sử dụng API mở rộng của FMZ, bạn có thể dễ dàng thực hiện các tham số chính sách thay đổi hàng loạt, khởi động hàng loạt, dừng đĩa thực. Với nội dung của bài viết, về các tham số đĩa thực của chiến lược sửa đổi hàng loạt, hãy bắt đầu bài viết tiếp theo của chúng tôi.

Lời kết thúc

Trong giao dịch định lượng, quản lý kiểm soát nhóm được thực hiện bằng cách sử dụng API mở rộng của FMZ, cho phép các nhà giao dịch giám sát, thực hiện và điều chỉnh nhiều tài khoản thực tế một cách hiệu quả hơn. Phương pháp quản lý tập trung này không chỉ cải thiện hiệu quả hoạt động mà còn giúp thực hiện tốt hơn việc kiểm soát rủi ro và đồng bộ hóa chiến lược. Đối với các nhà giao dịch quản lý một số lượng lớn tài khoản thực tế, FMZ's Extensible API cung cấp cho họ một công cụ mạnh mẽ và linh hoạt, làm cho việc định lượng giao dịch trở nên dễ dàng và dễ kiểm soát hơn.


Thêm nữa