FMZでライブ取引のパラメータをバッチで変更するにはどうすればいいですか? ライブ取引の数が数十を超えて数百に達すると,ライブ取引を1つずつ手動で設定することは非常に不便になります.この時点で,これらの操作を完了するためにFMZ拡張APIを使用することができます. したがって,この記事では,ボットのグループ制御を探検し,パラメータの詳細を更新します.
前回の記事では,FMZ拡張 API を使用してすべてのライブトレードを監視し,ライブトレードをグループ制御し,ライブトレードにコマンドを送信する方法の問題を解決しました. そして,私たちはまだ前回の記事でエンカプセルしたインターフェースコールコードをベースとして使用し,ライブトレードのパラメータのバッチ変更を実現するためにコードを書くことを続けます.
パラメータ設定:
戦略コード:
// 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
}
2つのシナリオがあります このシナリオは2つのシナリオです
操作は同じです. だから,この式を使います.RestartRobot
拡張 API 機能を例として説明します.
RestartRobot 関数は2つの方法で使用されます.
最初のアプローチは,私たちの需要シナリオに有用ではありません. なぜなら,私たちの要求は,大量にライブ取引のパラメータを大量に修正することです. ですから,問題は,ライブ取引のパラメータの構成が非常に複雑です. 交換オブジェクトの構成,戦略パラメータの構成,K線期間の設定などがあります.
心配するな ひとつずつ調べよう
FMZでは,ライブトレーディングのパラメータ構成を変更したい場合は,実行していない状態でなければならない.実行していないライブトレーディングのみがパラメータ構成を変更できるため,実行状態でないライブトレーディングは,次の状態にある可能性があります.
これらのライブトレードは,停止状態または停止するエラーがあります..
function main() {
var stopRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 4)
var errorRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 5)
var robotList = stopRobotList.concat(errorRobotList)
}
詳細な設定を得ます. 詳細な設定は,このビデオで説明します.
例えば,パラメータを修正する必要があるライブ取引戦略は以下の通りです (つまり,戦略IDが変数 strategyIdである戦略):
この戦略は3つのパラメータをテストします
しかし,拡張 API インターフェース RestartRobot 機能では,いずれもパラメータが指定されていない (ちょうどライブ取引を開始している) またはすべてのパラメータ構成が指定されなければならない.
つまり,ライブ取引を開始するために RestartRobot 関数を使用する前に,Live取引の現在の設定を最初に取得するために拡張された API インターフェース GetRobotDetail 関数を使用し,その後修正する必要があるパラメータの一部を置き換えて,ライブ取引の開始のための設定パラメータを再構築します (すなわち,Live取引を呼び出すために使用されるパラメータ).
ロボットリストを横切って,現在のパラメータの設定を一つずつ取得します./**/
このデータに対処する必要があります. 詳細は,これらのデータについて説明します.
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)
})
}
バッチパラメータ変更戦略を実行した後,私のライブ取引:
パラメータのバッチ変更は,設定された交換オブジェクト,取引ペアおよびKライン期間が変更されずに行われました:
自動で変更されました.
上記のコードで修正されたパラメータを指定したからです
// Update parameters
var dicParams = {
"pairs" : "AAA_BBB,CCC_DDD",
"col" : "999",
"htight" : "666"
}
この方法により,より便利です.例では,パラメータは均一に修正されます. もちろん,コードで独自の修正ルールをカスタマイズして,各ライブ取引の異なるパラメータ構成を指定することができます. または異なる交換オブジェクト,取引ペアなどを指定できます.
FMZのプラットフォームでは,これらの要件は柔軟で,達成するにはカスタマイズできます. 要求のアイデアがあればコメントを残すのも自由です. 私たちは議論し,研究し,お互いから学び,問題の解決策を見つけることができます.