Как я могу изменить параметры живой торговли в партии на FMZ? Когда количество живой торговли превышает десятки и достигает сотен, было бы очень неудобно настраивать живой торговли один за другим вручную. В это время мы можем использовать расширенный API FMZ для завершения этих операций. Так что в этой статье мы рассмотрим групповой контроль бота, обновить некоторые подробности параметров.
В предыдущей статье мы решили проблему использования расширенного API FMZ для мониторинга всех прямых торгов, группового контроля прямых торгов и отправки команд на прямые торговли.
Параметры:
Код стратегии:
// 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
}
Когда нам нужно модифицировать параметры живой торговли и затем запустить его, есть 2 случая для этого сценария, чтобы начать с.
Но независимо от того, какой метод, следующая идея, а также операция похожи, так что мы будем использоватьRestartRobot
расширенная функция API в качестве примера для объяснения.
Функция RestartRobot используется двумя способами:
Первый подход не полезен для нашего сценария спроса, потому что наш собственный спрос заключается в изменении большого количества параметров живой торговли оптом.
Не волнуйтесь, давайте рассмотрим их по одному.
На FMZ, если вы хотите изменить конфигурацию параметров живой торговли, то она должна быть не запущенной. Потому что только живая торговля, которая не запущена, может иметь свою конфигурацию параметров. Живая торговля, которая не в запущенном состоянии, может быть в:
Так что мы должны получить прямые торгов для указанной стратегии сначала, и эти прямые торгов всостояние остановкиилиУ вас есть ошибка, чтобы остановить.
function main() {
var stopRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 4)
var errorRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 5)
var robotList = stopRobotList.concat(errorRobotList)
}
Это дает нам всю информацию о живой торговли, что мы должны изменить конфигурацию, далее мы получим подробную конфигурацию живой торговли.
Например, стратегия торговли в режиме реального времени, для которой нам нужно изменить параметры, выглядит следующим образом (т.е. стратегия, идентификатором которой является переменная strategyId):
Стратегия имеет 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)
})
}
После выполнения стратегии модификации параметров партии, моя прямая торговля:
Базовая модификация параметров была выполнена с конфигурированными обменными объектами, торговыми парами и периодами K-линии без изменений:
Он был изменен на странице торговли автоматически:
Потому что мы указали модифицированные параметры в коде выше:
// Update parameters
var dicParams = {
"pairs" : "AAA_BBB,CCC_DDD",
"col" : "999",
"htight" : "666"
}
Для десятков, сотен живых торговых партий модифицируют параметры, этот метод более удобный. В примере параметры модифицируются в униформе, конечно, вы можете настроить свои собственные правила модификации в коде, чтобы указать различные конфигурации параметров для каждой живой торговли. Или указать различные обменные объекты, торговые пары и так далее.
Для платформы FMZ эти требования гибкие и настраиваемые для достижения. Не стесняйтесь оставлять комментарий, если у вас есть идеи требований, мы можем обсудить, исследовать и учиться друг у друга и найти решение проблемы.