Bagaimana saya dapat mengubah parameter perdagangan langsung dalam batch di FMZ? Ketika jumlah perdagangan langsung melebihi lusinan dan mencapai ratusan, akan sangat tidak nyaman untuk mengkonfigurasi perdagangan langsung satu per satu secara manual. Pada saat ini, kita dapat menggunakan FMZ diperluas API untuk menyelesaikan operasi ini. Jadi dalam artikel ini, kita akan mengeksplorasi kontrol kelompok bot, memperbarui beberapa rincian parameter.
Dalam artikel sebelumnya, kami menyelesaikan masalah bagaimana menggunakan FMZ diperluas API untuk memantau semua perdagangan hidup, kelompok kontrol perdagangan hidup, dan mengirim perintah ke perdagangan hidup. dan kita masih menggunakan kode panggilan antarmuka yang kita terkapas dalam artikel sebelumnya sebagai dasar, terus menulis kode untuk mewujudkan modifikasi batch dari parameter perdagangan hidup.
Pengaturan parameter:
Kode 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
}
Ketika kita perlu batch memodifikasi parameter perdagangan langsung dan kemudian menjalankan, ada 2 kasus untuk skenario ini untuk memulai dengan.
Tapi tidak peduli apa jenis metode, ide berikutnya serta operasi yang sama, jadi kita akan menggunakanRestartRobot
fungsi API diperpanjang sebagai contoh untuk menjelaskan.
Fungsi RestartRobot digunakan dengan dua cara:
Pendekatan pertama tidak berguna untuk skenario permintaan kita, karena permintaan kita sendiri adalah untuk memodifikasi sejumlah besar parameter perdagangan langsung secara massal. jadi pertanyaannya adalah, konfigurasi parameter perdagangan langsung sangat kompleks, ada konfigurasi objek pertukaran, konfigurasi parameter strategi, pengaturan periode K-line dan sebagainya.
Jangan khawatir, mari kita jelajahi mereka satu per satu.
Pada FMZ, jika Anda ingin memodifikasi konfigurasi parameter dari perdagangan langsung, maka harus tidak berjalan. Karena hanya perdagangan langsung yang tidak berjalan yang dapat memodifikasi konfigurasi parameternya.
Jadi kita perlu mendapatkan perdagangan hidup untuk strategi yang ditentukan pertama, dan perdagangan hidup ini dalamstatus berhentiataumemiliki kesalahan 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 informasi tentang perdagangan langsung yang kita butuhkan untuk mengubah konfigurasi, selanjutnya kita akan mendapatkan konfigurasi terperinci dari perdagangan langsung.
Misalnya, strategi perdagangan langsung yang perlu kita modifikasi parameter adalah sebagai berikut (yaitu, strategi yang strategi ID adalah variabel strategyId):
Strategi ini memiliki 3 parameter sebagai tes.
Mengubah parameter strategi untuk perdagangan langsung, tetapi mungkin kita tidak ingin memodifikasi strategi
Artinya, sebelum kita menggunakan fungsi RestartRobot untuk memulai perdagangan langsung, kita harus menggunakan fungsi antarmuka API yang diperluas GetRobotDetail untuk mendapatkan konfigurasi perdagangan langsung saat ini terlebih dahulu, dan kemudian kita mengganti bagian dari parameter yang perlu dimodifikasi, untuk membangun kembali parameter konfigurasi untuk memulai perdagangan langsung (yaitu, parameter yang akan digunakan untuk memanggil RestartRobot), dan kemudian memulai kembali perdagangan langsung.
Jadi, selanjutnya kita melintasi robotList, dan mendapatkan konfigurasi parameter saat ini satu per satu,/**/
Komentar bagian dari kode berikut adalah detail 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)
})
}
Setelah menjalankan strategi modifikasi parameter batch, perdagangan langsung saya:
Modifikasi batch parameter dilakukan dengan objek pertukaran yang dikonfigurasi, pasangan perdagangan dan periode K-line tidak berubah:
Itu diubah di halaman perdagangan langsung secara otomatis:
Dan mulai berjalan. karena kita menentukan parameter yang dimodifikasi dalam kode di atas:
// Update parameters
var dicParams = {
"pairs" : "AAA_BBB,CCC_DDD",
"col" : "999",
"htight" : "666"
}
Untuk puluhan, ratusan batch live trading modifikasi parameter, metode ini lebih nyaman. dalam contoh, parameter dimodifikasi menjadi seragam, tentu saja Anda dapat menyesuaikan aturan modifikasi Anda sendiri dalam kode untuk menentukan konfigurasi parameter yang berbeda untuk setiap live trading. atau menentukan objek pertukaran yang berbeda, pasangan perdagangan dan sebagainya.
Untuk platform FMZ, persyaratan ini fleksibel dan dapat disesuaikan untuk dicapai. Jangan ragu untuk meninggalkan komentar jika Anda memiliki ide persyaratan, kita dapat mendiskusikan, meneliti dan belajar satu sama lain, dan menemukan solusi untuk masalah.