Dạy bạn sử dụng FMZ Extended API để Batch Modify Parameters của bot

Tác giả:Lydia., Tạo: 2023-12-11 13:37:55, Cập nhật: 2024-01-02 21:22:49

img

Làm thế nào tôi có thể thay đổi các tham số của giao dịch trực tiếp theo lô trên FMZ? Khi số lượng giao dịch trực tiếp vượt quá hàng chục và đạt đến hàng trăm, sẽ rất khó khăn để cấu hình giao dịch trực tiếp một lần một lần theo cách thủ công. Tại thời điểm này, chúng tôi có thể sử dụng API mở rộng FMZ để hoàn thành các hoạt động này. Vì vậy, trong bài viết này, chúng tôi sẽ khám phá kiểm soát nhóm của bot, cập nhật một số chi tiết về các tham số.

Trong bài viết trước, chúng tôi đã giải quyết vấn đề về cách sử dụng FMZ mở rộng API để theo dõi tất cả các giao dịch trực tiếp, kiểm soát nhóm giao dịch trực tiếp, và gửi lệnh đến các giao dịch trực tiếp.

Cài đặt tham số:

img

Mã chiến lược:

// Global variable
var isLogMsg = true   // Controls whether logs are printed or not
var isDebug = false   // Debugging mode
var arrIndexDesc = ["all", "running", "stop"]
var descRobotStatusCode = ["Idle", "Running", "Stopping", "Exited", "Stopped", "There is an error in the strategy"]
var dicRobotStatusCode = {
    "all" : -1,
    "running" : 1,
    "stop" : 4,
}

// Extended logging functions
function LogControl(...args) {
    if (isLogMsg) {
        Log(...args)
    }
}

// FMZ extended API call functions
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 
}

// Get information about all running bots for 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("Maximum number of retries exceeded", 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 
}

Tìm hiểu chức năng RestartRobot của FMZ Extended API trước

Khi chúng ta cần để batch sửa đổi các thông số của giao dịch trực tiếp và sau đó chạy nó, có 2 trường hợp cho kịch bản này để bắt đầu với.

    1. Bot đã được tạo Đối với một giao dịch trực tiếp đã được tạo, nó là tự nhiên để khởi động lại nó bằng cách sử dụng chức năng RestartRobot, đó là một giao diện API mở rộng cho FMZ.
    1. Bot chưa được tạo Đối với giao dịch trực tiếp đã không được tạo ra, không cần phải sửa đổi các tham số của giao dịch trực tiếp, đó là việc tạo hàng loạt của giao dịch trực tiếp để chạy, và chúng tôi sử dụng FMZ mở rộng giao diện API - chức năng NewRobot.

Nhưng không có vấn đề loại phương pháp, ý tưởng tiếp theo cũng như các hoạt động là tương tự, vì vậy chúng tôi sẽ sử dụngRestartRobotchức năng API mở rộng như một ví dụ để giải thích.

Chức năng RestartRobot được sử dụng theo hai cách:

    1. Cấu hình chỉ có ID giao dịch trực tiếp được truyền vào, không phải các tham số giao dịch trực tiếp Cách tiếp cận này giữ cấu hình tham số không thay đổi khi giao dịch trực tiếp dừng lại và chỉ khởi động lại giao dịch trực tiếp.
    1. Cấu hình với ID giao dịch trực tiếp và các tham số giao dịch trực tiếp được truyền vào Cách tiếp cận này bắt đầu giao dịch trực tiếp chạy với cấu hình tham số mới.

Cách tiếp cận đầu tiên không hữu ích cho kịch bản nhu cầu của chúng tôi, bởi vì nhu cầu của chúng tôi là sửa đổi một số lượng lớn các thông số của giao dịch trực tiếp bằng cách bán hàng hàng loạt.

Đừng lo lắng, chúng ta hãy khám phá chúng từng cái một.

Nhận thông tin về giao dịch trực tiếp mà bạn muốn vận hành

Trên FMZ, nếu bạn muốn sửa đổi cấu hình tham số của giao dịch trực tiếp, thì nó phải không chạy. Bởi vì chỉ có giao dịch trực tiếp không chạy mới có thể sửa đổi cấu hình tham số của nó. Một giao dịch trực tiếp không ở trạng thái chạy có thể ở:

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

Vì vậy, chúng ta cần phải có được các giao dịch trực tiếp cho chiến lược được chỉ định đầu tiên, và các giao dịch trực tiếp này là trong mộttrạng thái dừnghoặccó một lỗi để dừng lại.

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

Điều này cung cấp cho chúng tôi tất cả các thông tin về giao dịch trực tiếp mà chúng tôi cần để thay đổi cấu hình của, tiếp theo chúng tôi sẽ có được cấu hình chi tiết của giao dịch trực tiếp.

Thay đổi các thông số cấu hình giao dịch trực tiếp

Ví dụ, chiến lược giao dịch trực tiếp mà chúng ta cần sửa đổi các thông số là như sau (tức là chiến lược mà ID chiến lược là biến strategyId):

img

img

Chiến lược có 3 thông số như một thử nghiệm.

Thay đổi các thông số chiến lược cho giao dịch trực tiếp, nhưng có lẽ chúng ta không muốn thay đổi cấu hình giao dịch của chiến lược, nhưng cho chức năng RestartRobot giao diện API mở rộng, hoặc không có thông số được chỉ định (như chỉ bắt đầu giao dịch trực tiếp) hoặc tất cả các cấu hình tham số phải được chỉ định.

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

Vì vậy, tiếp theo chúng ta đi qua robotList, và nhận được cấu hình tham số hiện tại một một,/**/phần được bình luận của mã sau đây là chi tiết giao dịch trực tiếp, chúng tôi cần phải 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": "Test 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\",\"Currency list\",\"English comma spacing\",\"BTC_USDT,ETH_USDT,EOS_USDT,LTC_USDT\"],[\"col\",\"breadth\",\"Total width of the page is 12\",6],[\"htight\",\"height\",\"unit px\",600],[\"$$$__cmd__$$$coverSymbol\",\"close the position\",\"close out trading pairs\",\"\"]]",
                        "strategy_exchange_pairs": "[3600,[186193],[\"BTC_USD\"]]",
                        "strategy_id": 131242,
                        "strategy_last_modified": "2023-12-09 23:14:33",
                        "strategy_name": "Test 1",
                        ...
                    }
                },
                "error": null
            }
        }
        */

        // Parse the exchange configuration data
        var exchangePairs = JSON.parse(robotDetail.data.result.robot.strategy_exchange_pairs)

        // Get the exchange object index, trading pairs, these settings are not going to be changed
        var arrExId = exchangePairs[1]
        var arrSymbol = exchangePairs[2]

        // Parse parameter configuration data
        var params = JSON.parse(robotDetail.data.result.robot.robot_args)

        // Update parameters
        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]])  // Construct the strategy parameters and update the new parameter values
                }
            }
        })
        
        // Note that if there are spaces in the data you need to transcode it, otherwise the request will report an error
        settings = {
            "name": robotDetail.data.result.robot.name,
            // Strategy parameter
            "args": newParams,         
            // The strategy ID can be obtained by the GetStrategyList method.
            "strategy": robotDetail.data.result.robot.strategy_id,
            // K-period parameter, 60 means 60 seconds
            "period": exchangePairs[0],
            // Specifies which docker to run on; not writing this attribute means automatically assigning the run
            "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) // Test
        var retRestart = callFmzExtAPI(accessKey, secretKey, "RestartRobot", robotInfo.id, settings)
        Log("retRestart:", retRestart)
    })
}

Sau khi chạy chiến lược thay đổi tham số hàng loạt, giao dịch trực tiếp của tôi:

  • Thử nghiệm 1A
  • Thử nghiệm 1B

Sự thay đổi hàng loạt các thông số được thực hiện với các đối tượng trao đổi được cấu hình, các cặp giao dịch và các khoảng thời gian K-line không thay đổi:

Nó đã được thay đổi trên trang giao dịch trực tiếp tự động:

img

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

        // Update parameters
        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 hàng loạt giao dịch trực tiếp sửa đổi các tham số, phương pháp này thuận tiện hơn. Trong ví dụ, các tham số được sửa đổi theo một thống nhất, tất nhiên bạn 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ác cấu hình tham số khác nhau cho mỗi giao dịch trực tiếp. hoặc chỉ định các đối tượng trao đổi khác nhau, cặp giao dịch và vân vân.

Đối với nền tảng FMZ, các yêu cầu này rất linh hoạt và có thể tùy chỉnh để đạt được.


Thêm nữa