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ố:
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
}
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.
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ụngRestartRobot
chứ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:
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.
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ể ở:
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.
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):
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:
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:
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"
}
Đố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.