Comment puis-je modifier les paramètres des transactions en direct en lot sur FMZ? Lorsque le nombre de transactions en direct dépasse des dizaines et atteint des centaines, il serait très gênant de configurer manuellement les transactions en direct une par une. À ce stade, nous pouvons utiliser l'API étendue FMZ pour effectuer ces opérations. Dans cet article, nous explorerons le contrôle de groupe du bot, mettre à jour certains détails des paramètres.
Dans l'article précédent, nous avons résolu le problème de la façon d'utiliser l'API étendue FMZ pour surveiller toutes les transactions en direct, contrôler les transactions en direct et envoyer des commandes aux transactions en direct.
Paramètres définis:
Code de stratégie:
// 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
}
Lorsque nous avons besoin de modifier les paramètres du trading en direct et de l'exécuter, il y a 2 cas pour ce scénario pour commencer.
Mais peu importe le type de méthode, l'idée suivante ainsi que l'opération sont similaires, donc nous allons utiliser leRestartRobot
L'extension de la fonction API est un exemple à expliquer.
La fonction RestartRobot est utilisée de deux façons:
La première approche n'est pas utile pour notre scénario de demande, parce que notre propre demande est de modifier un grand nombre de paramètres de la négociation en direct en vrac.
Ne vous inquiétez pas, explorons-les un par un.
Sur FMZ, si vous souhaitez modifier la configuration des paramètres d'un trading en direct, alors il doit être non-exécuté. Parce que seul un trading en direct qui n'est pas en cours peut avoir sa configuration de paramètres modifiée. Un trading en direct qui n'est pas en cours d'exécution peut être en:
Donc, nous avons besoin d'obtenir les transactions en direct pour la stratégie spécifiée d'abord, et ces transactions en direct sont dans unétat arrêtéouIl y a une erreur à arrêter.
function main() {
var stopRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 4)
var errorRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 5)
var robotList = stopRobotList.concat(errorRobotList)
}
Cela nous donne toutes les informations sur le commerce en direct que nous avons besoin de changer la configuration de, ensuite, nous allons obtenir la configuration détaillée du commerce en direct.
Par exemple, la stratégie de trading en direct pour laquelle nous devons modifier les paramètres est la suivante (c'est-à-dire la stratégie dont l'ID de stratégie est la variable strategyId):
La stratégie comporte 3 paramètres comme test.
Modifier les paramètres de la stratégie pour le trading en direct, mais peut-être que nous ne voulons pas modifier la configuration de l'échange de la stratégie, mais pour la fonction RestartRobot de l'interface API étendue, soit aucun paramètre n'est spécifié (comme c'est juste démarrer le trading en direct) ou toutes les configurations de paramètres doivent être spécifiées.
Autrement dit, avant d'utiliser la fonction RestartRobot pour démarrer le trading en direct, nous devons utiliser la fonction GetRobotDetail de l'interface API étendue pour obtenir d'abord la configuration actuelle du trading en direct, puis nous remplaçons la partie des paramètres qui doivent être modifiés, pour reconstruire les paramètres de configuration pour le début du trading en direct (c'est-à-dire les paramètres qui seront utilisés pour appeler RestartRobot), puis redémarrer le trading en direct.
Donc, ensuite, nous traversons robotList, et obtenir la configuration de paramètres actuels un par un, le/**/
Commentaire partie du code suivant sont les détails de négociation en direct, nous devons traiter avec ces données.
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)
})
}
Après avoir exécuté la stratégie de modification des paramètres de lot, mon trading en direct:
La modification par lots des paramètres a été effectuée avec les objets d'échange configurés, les paires de négociation et les périodes de ligne K inchangés:
Il a été modifié sur la page de trading en direct automatiquement:
Parce que nous avons spécifié les paramètres modifiés dans le code ci-dessus:
// Update parameters
var dicParams = {
"pairs" : "AAA_BBB,CCC_DDD",
"col" : "999",
"htight" : "666"
}
Pour des dizaines, des centaines de lots de négociation en direct modifient les paramètres, cette méthode est plus pratique. Dans l'exemple, les paramètres sont modifiés à un uniforme, bien sûr, vous pouvez personnaliser vos propres règles de modification dans le code pour spécifier différentes configurations de paramètres pour chaque négociation en direct. Ou spécifier différents objets d'échange, paires de négociation et ainsi de suite.
Pour la plateforme FMZ, ces exigences sont flexibles et personnalisables à atteindre. N'hésitez pas à laisser un commentaire si vous avez des idées d'exigences, nous pouvons discuter, rechercher et apprendre les uns des autres, et trouver la solution au problème.