FMZ에서 실시간 거래의 매개 변수를 어떻게 변경할 수 있습니까? 라이브 거래의 수가 수십 개 이상이고 수백 개에 도달하면 라이브 거래를 하나씩 수동으로 구성하는 것이 매우 불편합니다. 이 시점에서 우리는 이러한 작업을 완료하기 위해 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가지 경우로 시작됩니다.
하지만 어떤 방법이든, 다음 아이디어와 연산은 비슷합니다.RestartRobot
확장된 API 기능을 예로 설명합니다.
RestartRobot 함수는 두 가지 방법으로 사용됩니다.
첫 번째 접근법은 우리의 수요 시나리오에 유용하지 않습니다. 우리의 요구는 대량으로 라이브 거래의 많은 수의 매개 변수를 수정하기 때문입니다. 그래서 질문은 라이브 거래의 매개 변수 구성이 매우 복잡합니다. 교환 객체 구성, 전략 매개 변수 구성, 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 함수를 사용하기 전에, 우리는 라이브 거래의 현재 구성을 얻기 위해 확장 된 API 인터페이스 GetRobotDetail 함수를 사용해야합니다. 그리고 우리는 라이브 거래의 시작을위한 구성 매개 변수를 재구성하기 위해 수정해야하는 매개 변수의 일부를 교체합니다. 라이브 거래 (즉, RestartRobot를 호출하는 데 사용되는 매개 변수), 그리고 라이브 거래를 다시 시작합니다.
그럼 다음으로 robotList를 거쳐서 현재 파라미터 구성을 하나씩 얻습니다./**/
다음 코드의 코멘트 부분은 실시간 거래 세부 정보입니다. 우리는 이 데이터를 처리해야 합니다.
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 플랫폼의 경우, 이러한 요구 사항은 달성하기 위해 유연하고 사용자 정의 할 수 있습니다. 당신은 어떤 요구 사항 아이디어를 가지고 있다면 댓글을 남겨 자유롭게, 우리는 토론, 연구하고 서로 배울 수 있습니다, 그리고 문제의 해결책을 찾을 수 있습니다.