
Bagaimana cara memodifikasi parameter waktu nyata secara batch di FMZ? Bila jumlah cakram riil melebihi puluhan atau bahkan mencapai ratusan, akan sangat merepotkan untuk memeliharanya jika Anda mengonfigurasi cakram riil tersebut satu per satu secara manual. Saat ini, Anda dapat menggunakan API FMZ yang diperluas untuk menyelesaikan operasi ini. Dalam artikel ini, mari kita bahas beberapa detail tentang kontrol grup dan pembaruan parameter.
Pada artikel sebelumnya, kami memecahkan masalah cara menggunakan API FMZ yang diperluas untuk memantau semua disk nyata, mengelompokkan kontrol disk nyata, dan mengirim instruksi ke disk nyata. Kami masih menggunakan kode pemanggilan antarmuka yang dirangkum dalam artikel sebelumnya sebagai dasar dan terus menulis kode untuk mewujudkan modifikasi batch parameter waktu nyata.
Pengaturan parameter:

Kode strategi:
// 全局变量
var isLogMsg = true // 控制日志是否打印
var isDebug = false // 调试模式
var arrIndexDesc = ["all", "running", "stop"]
var descRobotStatusCode = ["空闲中", "运行中", "停止中", "已退出", "被停止", "策略有错误"]
var dicRobotStatusCode = {
"all" : -1,
"running" : 1,
"stop" : 4,
}
// 扩展的日志函数
function LogControl(...args) {
if (isLogMsg) {
Log(...args)
}
}
// FMZ扩展API调用函数
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) // 控制频率
return ret
}
// 获取指定策略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("超过最大重试次数", 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
}
Saat kita perlu memodifikasi parameter waktu nyata secara batch dan kemudian menjalankan waktu nyata, ada dua situasi dalam skenario ini.
Tapi tidak peduli metode mana yang digunakan, ide dan operasi berikut serupa, jadi kita akan mulai denganRestartRobotFungsi API yang diperluas ini digunakan sebagai contoh.
Ada dua cara untuk menggunakan fungsi RestartRobot:
Metode pertama tidak berguna dalam skenario kita, karena kebutuhan kita adalah memodifikasi sejumlah besar parameter waktu nyata secara batch. Jadi permasalahannya adalah konfigurasi parameter pasar riil sangat rumit, termasuk konfigurasi objek pertukaran, konfigurasi parameter strategi, pengaturan siklus K-line, dan lain-lain.
Jangan khawatir, kami akan membahasnya satu per satu.
Pada FMZ, jika Anda ingin mengubah konfigurasi parameter disk nyata, maka disk nyata tersebut harus dalam keadaan tidak berjalan. Sebab, hanya disk nyata yang tidak dalam kondisi berjalan yang dapat mengubah konfigurasi parameter. Disk nyata yang tidak beroperasi mungkin:
Jadi pertama-tama kita perlu mendapatkan pasar riil dari strategi yang ditentukan, dan pasar riil ini ada diBerhenti negaraatauBerhenti saat terjadi kesalahanstatus.
function main() {
var stopRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 4)
var errorRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 5)
var robotList = stopRobotList.concat(errorRobotList)
}
Dengan cara ini, kita telah memperoleh semua informasi disk sebenarnya yang perlu dimodifikasi. Selanjutnya, kita perlu memperoleh konfigurasi terperinci dari disk sebenarnya.
Misalnya, strategi waktu nyata yang parameternya perlu kita modifikasi adalah sebagai berikut (yaitu strategi yang ID strateginya adalah variabel strategyId):


Strategi ini memiliki 3 parameter, sebagai percobaan.
Ubah parameter strategi real-time, tetapi kita mungkin tidak ingin mengubah konfigurasi pertukaran strategi. Namun, untuk fungsi antarmuka API RestartRobot yang diperluas, tidak ada parameter yang ditentukan (cukup mulai perdagangan real-time sebagaimana adanya), atau semua konfigurasi parameter harus Ditentukan.
Artinya sebelum kita menggunakan fungsi RestartRobot untuk memulai disk sebenarnya, kita harus terlebih dahulu menggunakan fungsi antarmuka API yang diperluas GetRobotDetail untuk mendapatkan konfigurasi disk sebenarnya saat ini, dan kemudian mengganti parameter yang perlu dimodifikasi untuk merekonstruksi startup disk nyata (yaitu, memanggil Parameter yang akan digunakan saat RestartRobot) dan kemudian memulai ulang disk nyata.
Jadi selanjutnya kita menelusuri robotList dan mendapatkan konfigurasi parameter saat ini satu per satu. Dalam kode berikut/**/Bagian yang diberi komentar adalah informasi terperinci tentang transaksi sebenarnya, dan kami perlu memproses data ini selanjutnya.
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": "测试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\",\"币种列表\",\"英文逗号间隔\",\"BTC_USDT,ETH_USDT,EOS_USDT,LTC_USDT\"],[\"col\",\"宽度\",\"页面总宽度为12\",6],[\"htight\",\"高度\",\"单位px\",600],[\"$$$__cmd__$$$coverSymbol\",\"平仓\",\"平仓交易对\",\"\"]]",
"strategy_exchange_pairs": "[3600,[186193],[\"BTC_USD\"]]",
"strategy_id": 131242,
"strategy_last_modified": "2023-12-09 23:14:33",
"strategy_name": "测试1",
...
}
},
"error": null
}
}
*/
// 解析交易所配置数据
var exchangePairs = JSON.parse(robotDetail.data.result.robot.strategy_exchange_pairs)
// 拿到交易所对象索引、交易对,这些设置是不打算修改的
var arrExId = exchangePairs[1]
var arrSymbol = exchangePairs[2]
// 解析参数配置数据
var params = JSON.parse(robotDetail.data.result.robot.robot_args)
// 更新参数
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]]) // 构造策略参数,更新上新参数值
}
}
})
// 注意如果数据中有空格需要转码,否则请求的时候会报错
settings = {
"name": robotDetail.data.result.robot.name,
// 策略参数
"args": newParams,
// 策略ID,可以用GetStrategyList方法获取到
"strategy": robotDetail.data.result.robot.strategy_id,
// K线周期参数,60即为60秒
"period": exchangePairs[0],
// 指定在哪个托管者上运行,不写该属性就是自动分配运行
"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) // 测试
var retRestart = callFmzExtAPI(accessKey, secretKey, "RestartRobot", robotInfo.id, settings)
Log("retRestart:", retRestart)
})
}
Setelah menjalankan strategi modifikasi parameter batch ini, volume perdagangan saya sebenarnya adalah:
Parameter dimodifikasi sementara objek pertukaran yang dikonfigurasi, pasangan perdagangan, dan periode K-line tetap tidak berubah:
Halaman pasar riil otomatis berubah menjadi:

Dan mulai berlari. Karena kami menentukan parameter yang dimodifikasi dalam kode di atas:
// 更新参数
var dicParams = {
"pairs" : "AAA_BBB,CCC_DDD",
"col" : "999",
"htight" : "666"
}
Metode ini lebih praktis untuk memodifikasi parameter secara batch pada puluhan atau ratusan disk nyata. Dalam contoh ini, parameter dimodifikasi menjadi satu parameter yang terpadu. Tentu saja, Anda juga dapat menyesuaikan aturan modifikasi Anda sendiri dalam kode dan menentukan konfigurasi parameter yang berbeda untuk setiap akun riil. Atau tentukan objek pertukaran yang berbeda, pasangan perdagangan, dll.
Untuk platform FMZ, persyaratan ini dapat disesuaikan dan diterapkan secara fleksibel. Jika Anda memiliki persyaratan atau ide, silakan tinggalkan pesan dan kita akan membahas, meneliti, dan mempelajari solusi untuk masalah tersebut bersama-sama.