Научить вас использовать расширенный API FMZ для модификации параметров бота

Автор:Лидия., Создано: 2023-12-11 13:37:55, Обновлено: 2024-01-02 21:22:49

img

Как я могу изменить параметры живой торговли в партии на FMZ? Когда количество живой торговли превышает десятки и достигает сотен, было бы очень неудобно настраивать живой торговли один за другим вручную. В это время мы можем использовать расширенный API FMZ для завершения этих операций. Так что в этой статье мы рассмотрим групповой контроль бота, обновить некоторые подробности параметров.

В предыдущей статье мы решили проблему использования расширенного API FMZ для мониторинга всех прямых торгов, группового контроля прямых торгов и отправки команд на прямые торговли.

Параметры:

img

Код стратегии:

// 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 
}

Сначала узнайте функцию RestartRobot расширенного API FMZ

Когда нам нужно модифицировать параметры живой торговли и затем запустить его, есть 2 случая для этого сценария, чтобы начать с.

    1. Создан бот Для живой торговли, которая уже была создана, естественно перезагрузить ее с помощью функции RestartRobot, которая является расширенным интерфейсом API для FMZ.
    1. Бота не создано Для живой торговли не было создано, нет необходимости изменять параметры живой торговли, это создание партии живой торговли для запуска, и мы используем расширенный интерфейс API FMZ - функция NewRobot.

Но независимо от того, какой метод, следующая идея, а также операция похожи, так что мы будем использоватьRestartRobotрасширенная функция API в качестве примера для объяснения.

Функция RestartRobot используется двумя способами:

    1. Конфигурация, в которой передается только идентификатор реального трейдинга, а не параметры реального трейдинга Этот подход сохраняет конфигурацию параметров неизменной, когда торговля в режиме реального времени прекращается, и возобновляет торговлю только в режиме реального времени.
    1. Конфигурация с идентификатором торговли в режиме реального времени и параметрами торговли в режиме реального времени Такой подход запускает прямую торговлю с новой конфигурацией параметров.

Первый подход не полезен для нашего сценария спроса, потому что наш собственный спрос заключается в изменении большого количества параметров живой торговли оптом.

Не волнуйтесь, давайте рассмотрим их по одному.

Получить информацию о живой торговли вы хотите работать

На FMZ, если вы хотите изменить конфигурацию параметров живой торговли, то она должна быть не запущенной. Потому что только живая торговля, которая не запущена, может иметь свою конфигурацию параметров. Живая торговля, которая не в запущенном состоянии, может быть в:

  • Стратегия прекратилась.
  • У стратегии есть ошибки, остановилась.

Так что мы должны получить прямые торгов для указанной стратегии сначала, и эти прямые торгов всостояние остановкиилиУ вас есть ошибка, чтобы остановить.

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

Это дает нам всю информацию о живой торговли, что мы должны изменить конфигурацию, далее мы получим подробную конфигурацию живой торговли.

Изменение параметров конфигурации торговли в режиме реального времени

Например, стратегия торговли в режиме реального времени, для которой нам нужно изменить параметры, выглядит следующим образом (т.е. стратегия, идентификатором которой является переменная strategyId):

img

img

Стратегия имеет 3 параметра в качестве теста.

Изменить параметры стратегии для торговли в режиме реального времени, но, возможно, мы не хотим изменять конфигурацию обмена стратегии, но для функции расширенного интерфейса API RestartRobot, либо нет параметров, указанных (как только начать торговлю в режиме реального времени) или все конфигурации параметров должны быть указаны.

То есть, прежде чем мы используем функцию RestartRobot для начала живой торговли, мы должны использовать расширенный интерфейс API GetRobotDetail функция, чтобы получить текущую конфигурацию живой торговли сначала, а затем мы заменяем часть параметров, которые должны быть изменены, чтобы перестроить параметры конфигурации для начала живой торговли (т.е. параметры, которые будут использоваться для вызова RestartRobot), а затем перезапустить живой торговли.

Итак, следующее мы пересекаем robotList, и получить текущую конфигурацию параметров один за другим,/**/Комментированная часть следующего кода - это подробная информация о торговле, мы должны иметь дело с этими данными.

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

После выполнения стратегии модификации параметров партии, моя прямая торговля:

  • Испытание 1А
  • Испытание 1B

Базовая модификация параметров была выполнена с конфигурированными обменными объектами, торговыми парами и периодами K-линии без изменений:

Он был изменен на странице торговли автоматически:

img

Потому что мы указали модифицированные параметры в коде выше:

        // Update parameters
        var dicParams = {
            "pairs" : "AAA_BBB,CCC_DDD",
            "col" : "999",
            "htight" : "666"
        }

Окончание

Для десятков, сотен живых торговых партий модифицируют параметры, этот метод более удобный. В примере параметры модифицируются в униформе, конечно, вы можете настроить свои собственные правила модификации в коде, чтобы указать различные конфигурации параметров для каждой живой торговли. Или указать различные обменные объекты, торговые пары и так далее.

Для платформы FMZ эти требования гибкие и настраиваемые для достижения. Не стесняйтесь оставлять комментарий, если у вас есть идеи требований, мы можем обсудить, исследовать и учиться друг у друга и найти решение проблемы.


Больше