Bagaimana saya boleh menukar parameter perdagangan langsung dalam batch di FMZ? Apabila bilangan perdagangan langsung melebihi berpuluh-puluh dan mencapai ratusan, ia akan menjadi sangat tidak selesa untuk mengkonfigurasi perdagangan langsung satu demi satu secara manual. Pada masa ini, kita boleh menggunakan FMZ diperluaskan API untuk menyelesaikan operasi ini. Jadi dalam artikel ini, kita akan meneroka kawalan kumpulan bot, mengemas kini beberapa butiran parameter.
Dalam artikel sebelumnya, kami menyelesaikan masalah bagaimana untuk menggunakan FMZ diperluaskan API untuk memantau semua perdagangan hidup, kumpulan kawalan perdagangan hidup, dan menghantar arahan kepada perdagangan hidup. dan kita masih menggunakan antara muka panggilan kod yang kita dilampirkan dalam artikel sebelumnya sebagai asas, terus menulis kod untuk merealisasikan modifikasi batch parameter perdagangan hidup.
Tetapan parameter:
Kod strategi:
// 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
}
Apabila kita perlu batch mengubah suai parameter perdagangan langsung dan kemudian menjalankan ia, terdapat 2 kes untuk senario ini untuk bermula dengan.
Tetapi tidak kira apa jenis kaedah, idea seterusnya serta operasi adalah sama, jadi kita akan menggunakanRestartRobot
fungsi API yang diperluaskan sebagai contoh untuk menjelaskan.
Fungsi RestartRobot digunakan dalam dua cara:
Pendekatan pertama tidak berguna untuk senario permintaan kita, kerana permintaan kita sendiri adalah untuk mengubah suai sebilangan besar parameter perdagangan langsung secara pukal. jadi persoalan adalah, konfigurasi parameter perdagangan langsung sangat kompleks, terdapat konfigurasi objek pertukaran, konfigurasi parameter strategi, tetapan tempoh K-garis dan sebagainya.
Jangan risau, mari kita meneroka mereka satu demi satu.
Pada FMZ, jika anda ingin mengubah konfigurasi parameter perdagangan langsung, maka ia mesti tidak berjalan. Kerana hanya perdagangan langsung yang tidak berjalan boleh mempunyai konfigurasi parameternya diubah. Dagangan langsung yang tidak dalam keadaan berjalan mungkin berada di:
Jadi kita perlu mendapatkan perdagangan langsung untuk strategi yang ditentukan terlebih dahulu, dan perdagangan langsung ini adalah dalamkeadaan berhentiatauMempunyai kesilapan untuk berhenti.
function main() {
var stopRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 4)
var errorRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 5)
var robotList = stopRobotList.concat(errorRobotList)
}
Ini memberi kita semua maklumat mengenai perdagangan langsung yang kita perlukan untuk mengubah konfigurasi, seterusnya kita akan mendapat konfigurasi terperinci perdagangan langsung.
Sebagai contoh, strategi dagangan langsung yang kita perlu mengubah suai parameter adalah seperti berikut (iaitu, strategi yang ID strategi adalah strategyId pembolehubah):
Strategi ini mempunyai 3 parameter sebagai ujian.
Mengubahsuai parameter strategi untuk perdagangan langsung, tetapi mungkin kita tidak mahu mengubahsuai konfigurasi pertukaran strategi, tetapi untuk antarmuka API Terpanjang fungsi RestartRobot, sama ada tiada parameter yang ditentukan (seperti hanya memulakan perdagangan langsung) atau semua konfigurasi parameter mesti ditentukan.
Maksudnya, sebelum kita menggunakan fungsi RestartRobot untuk memulakan perdagangan langsung, kita mesti menggunakan fungsi antarmuka API lanjutan GetRobotDetail untuk mendapatkan konfigurasi semasa perdagangan langsung terlebih dahulu, dan kemudian kita menggantikan bahagian parameter yang perlu diubah suai, untuk membina semula parameter konfigurasi untuk permulaan perdagangan langsung (iaitu, parameter yang akan digunakan untuk memanggil RestartRobot), dan kemudian mulakan semula perdagangan langsung.
Jadi, seterusnya kita merentasi robotList, dan mendapatkan konfigurasi parameter semasa satu demi satu,/**/
Komentar sebahagian daripada kod berikut adalah butiran perdagangan langsung, kita perlu menangani data ini.
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)
})
}
Selepas menjalankan batch parameter modifikasi strategi, perdagangan hidup saya:
Pengubahsuaian batch parameter dilakukan dengan objek pertukaran yang dikonfigurasikan, pasangan dagangan dan tempoh K-line tidak berubah:
Ia telah diubah pada halaman perdagangan langsung secara automatik:
Dan mula berjalan. kerana kita menentukan parameter yang diubahsuai dalam kod di atas:
// Update parameters
var dicParams = {
"pairs" : "AAA_BBB,CCC_DDD",
"col" : "999",
"htight" : "666"
}
Untuk berpuluh-puluh, beratus-ratus batch perdagangan hidup mengubah suai parameter, kaedah ini lebih mudah. dalam contoh, parameter diubahsuai kepada seragam, sudah tentu anda boleh menyesuaikan peraturan pengubahsuaian anda sendiri dalam kod untuk menentukan konfigurasi parameter yang berbeza untuk setiap perdagangan hidup. atau menentukan objek pertukaran yang berbeza, pasangan dagangan dan sebagainya.
Untuk platform FMZ, keperluan ini fleksibel dan boleh disesuaikan untuk dicapai. Jangan ragu untuk meninggalkan komen jika anda mempunyai sebarang idea keperluan, kita boleh membincangkan, penyelidikan dan belajar dari satu sama lain, dan mencari penyelesaian kepada masalah.