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

Dạy bạn sử dụng FMZ Extension API để thay đổi số lượng các tham số ổ đĩa

Tác giả:Những nhà phát minh định lượng - những giấc mơ nhỏ, Tạo: 2023-12-09 20:39:41, Cập nhật: 2024-11-06 21:17:27

img

Làm thế nào để thay đổi nhiều các tham số ổ đĩa trên FMZ? Khi số lượng ổ đĩa lớn hơn vài chục và lên đến hàng trăm, việc cấu hình một ổ đĩa một cách thủ công sẽ rất khó bảo trì.

Trong bài viết trước, chúng tôi đã giải quyết cách sử dụng API mở rộng của FMZ để giám sát tất cả các ổ đĩa thực, ổ cắm và gửi lệnh cho ổ đĩa thực.

Chế độ cài đặt:

img

Mã chiến lượ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 
}

Đầu tiên, hãy tìm hiểu về chức năng RestartRobot của FMZ Extension API

Khi chúng ta cần thay đổi một số lượng lớn các tham số đĩa thực và sau đó chạy đĩa thực, có hai tình huống đầu tiên.

  • Một, ổ đĩa thực đã được tạo Đối với các ổ đĩa thực đã được tạo, khởi động tự nhiên là sử dụng FMZ's extension API interface plugin RestartRobot function.
  • 2, chưa tạo ổ đĩa thực Không có thiết lập ổ đĩa thực, không có khái niệm sửa đổi các tham số ổ đĩa thực, nó thuộc về việc tạo ra ổ đĩa thực hàng loạt, lần này sử dụng hàm NewRobot của FMZ.

Nhưng dù là bằng cách nào, ý tưởng và hành động tiếp theo cũng khá khác nhau.RestartRobotChức năng API mở rộng này được sử dụng như một ví dụ để giải thích.

Có hai cách để sử dụng chức năng RestartRobot:

  • 1, chỉ truyền ID ổ đĩa thực, không truyền cấu hình tham số ổ đĩa thực. Cách này giữ cấu hình tham số không thay đổi khi ổ đĩa dừng lại, chỉ là khởi động lại ổ đĩa.
  • 2, truyền ID ổ đĩa thực, cũng truyền cấu hình tham số của ổ đĩa thực. Cách này sẽ khởi động ổ đĩa thực chạy với cấu hình tham số mới.

Cách đầu tiên không có gì để sử dụng trong trường hợp nhu cầu của chúng tôi, bởi vì nhu cầu của chúng tôi là thay đổi một lượng lớn các tham số thực đơn. Vì vậy, vấn đề là cấu hình tham số thực đơn rất phức tạp, có cấu hình đối tượng giao dịch, cấu hình tham số chính sách, cài đặt chu kỳ đường K, v.v.

Đừng lo lắng, chúng tôi sẽ tìm hiểu từng cái một.

Nhận thông tin đĩa thực để vận hành

Trên FMZ, nếu muốn thay đổi cấu hình tham số của một ổ đĩa thực, thì ổ đĩa này phải ở trạng thái không chạy. Vì chỉ có ổ đĩa không chạy mới có thể thay đổi cấu hình tham số.

  • Chiến lược dừng lại.
  • Chiến lược sai, dừng đi.

Vì vậy, đầu tiên chúng ta phải có được các ổ đĩa thực với các chính sách được chỉ định, và những ổ đĩa thực này nằm ởChặnHoặcCó lỗi dừng lạiCác bạn có thể đọc bài viết này.

function main() {
    var stopRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 4)
    var errorRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 5)
    var robotList = stopRobotList.concat(errorRobotList)
}

Sau đó, chúng ta có tất cả thông tin về ổ đĩa thực cần sửa cấu hình, và sau đó chúng ta sẽ có được các cấu hình chi tiết của ổ đĩa thực.

Thay đổi các tham số cấu hình ổ đĩa

Ví dụ, chúng ta cần phải thay đổi các tham số của chính sách thực theo cách sau (ví dụ: chính sách ID cho biến strategyId):

img

img

Các chiến lược này có 3 tham số để thử nghiệm.

Thay đổi các tham số chính sách của ổ đĩa thực, nhưng có thể chúng ta không muốn thay đổi cấu hình giao dịch của chính sách, nhưng đối với API mở rộng giao diện RestartRobot, hoặc không chỉ định bất kỳ tham số nào (tạm dịch là không hoạt động chỉ khởi động ổ đĩa thực), hoặc tất cả các cấu hình tham số phải được chỉ định.

Điều này có nghĩa là chúng ta phải sử dụng API mở rộng GetRobotDetail để truy cập vào cấu hình hiện tại của ổ đĩa trước khi khởi động ổ đĩa bằng chức năng RestartRobot, sau đó chúng ta thay thế phần tham số cần sửa đổi, cấu trúc lại các tham số cấu hình cho ổ đĩa khởi động (tức là các tham số được sử dụng khi gọi RestartRobot) và khởi động lại ổ đĩa.

Vì vậy, tiếp theo chúng ta sẽ đi qua danh sách robot và lấy từng tham số hiện tại một lần, trong mã sau đây/**/Phần ghi chú là thông tin chi tiết về đĩa thực, sau đó chúng ta cần xử lý dữ liệu này.

function main() {
    var stopRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 4)
    var errorRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 5)

    var robotList = stopRobotList.concat(errorRobotList)
    _.each(robotList, function(robotInfo) {
        var robotDetail = callFmzExtAPI(accessKey, secretKey, "GetRobotDetail", robotInfo.id)
        
        /*
        {
            "code": 0,
            "data": {
                "result": {
                    "robot": {
                        ...
                        "id": 130350,
                        ...
                        "name": "测试1B",
                        "node_id": 3022561,
                        ...
                        "robot_args": "[[\"pairs\",\"BTC_USDT,ETH_USDT,EOS_USDT,LTC_USDT\"],[\"col\",3],[\"htight\",300]]",
                        "start_time": "2023-11-19 21:16:12",
                        "status": 5,
                        "strategy_args": "[[\"pairs\",\"币种列表\",\"英文逗号间隔\",\"BTC_USDT,ETH_USDT,EOS_USDT,LTC_USDT\"],[\"col\",\"宽度\",\"页面总宽度为12\",6],[\"htight\",\"高度\",\"单位px\",600],[\"$$$__cmd__$$$coverSymbol\",\"平仓\",\"平仓交易对\",\"\"]]",
                        "strategy_exchange_pairs": "[3600,[186193],[\"BTC_USD\"]]",
                        "strategy_id": 131242,
                        "strategy_last_modified": "2023-12-09 23:14:33",
                        "strategy_name": "测试1",
                        ...
                    }
                },
                "error": null
            }
        }
        */

        // 解析交易所配置数据
        var exchangePairs = JSON.parse(robotDetail.data.result.robot.strategy_exchange_pairs)

        // 拿到交易所对象索引、交易对,这些设置是不打算修改的
        var arrExId = exchangePairs[1]
        var arrSymbol = exchangePairs[2]

        // 解析参数配置数据
        var params = JSON.parse(robotDetail.data.result.robot.robot_args)

        // 更新参数
        var dicParams = {
            "pairs" : "AAA_BBB,CCC_DDD",
            "col" : "999",
            "htight" : "666"
        }
        
        var newParams = []
        _.each(params, function(param) {
            for (var k in dicParams) {
                if (param[0] == k) {
                    newParams.push([k, dicParams[k]])  // 构造策略参数,更新上新参数值
                }
            }
        })
        
        // 注意如果数据中有空格需要转码,否则请求的时候会报错
        settings = {
            "name": robotDetail.data.result.robot.name,
            // 策略参数
            "args": newParams,         
            // 策略ID,可以用GetStrategyList方法获取到
            "strategy": robotDetail.data.result.robot.strategy_id,
            // K线周期参数,60即为60秒
            "period": exchangePairs[0],
            // 指定在哪个托管者上运行,不写该属性就是自动分配运行
            "node" : robotDetail.data.result.robot.node_id,
            "exchanges": []
        }
                                
        for (var i = 0 ; i < arrExId.length ; i++) {
            settings["exchanges"].push({"pid": arrExId[i], "pair": arrSymbol[i]})
        }
        Log(settings) // 测试
        var retRestart = callFmzExtAPI(accessKey, secretKey, "RestartRobot", robotInfo.id, settings)
        Log("retRestart:", retRestart)
    })
}

Sau khi thực hiện chiến lược thay đổi parameter hàng loạt này, ổ đĩa thực của tôi:

  • Kiểm tra 1A
  • Kiểm tra 1B

Thay đổi tham số trong trường hợp đối tượng giao dịch, cặp giao dịch, chu kỳ đường K được cấu hình không thay đổi:

Các trang trên đĩa thực sẽ tự động thay đổi để:

img

Và bắt đầu chạy. Vì chúng tôi đã chỉ định các tham số thay đổi trong mã trên:

        // 更新参数
        var dicParams = {
            "pairs" : "AAA_BBB,CCC_DDD",
            "col" : "999",
            "htight" : "666"
        }

Kết thúc

Đối với hàng chục, hàng trăm đĩa thực, phương pháp này là khá thuận tiện. Trong trường hợp này là sửa đổi thành một tham số thống nhất, tất nhiên bạn cũng có thể tùy chỉnh các quy tắc sửa đổi của riêng bạn trong mã, chỉ định cấu hình tham số khác nhau cho mỗi đĩa thực; hoặc chỉ định đối tượng giao dịch khác nhau, đối thủ giao dịch, v.v.

Đối với nền tảng FMZ, tất cả các nhu cầu này đều có thể được thực hiện tùy chỉnh một cách linh hoạt, nếu bạn có ý tưởng về nhu cầu, hãy để lại ý kiến để chúng tôi cùng nhau khám phá, nghiên cứu và học các giải pháp cho vấn đề.


Thêm nữa

Allez-zCó hàng chục, hàng trăm đĩa CD, thuê một tháng là rất nhiều tiền.

Những nhà phát minh định lượng - những giấc mơ nhỏCó một số sử dụng FMZ mở rộng API đóng gói sản phẩm, có rất nhiều đĩa thực.