FMZ의 확장 API를 사용하여 양적 거래에서 효율적인 클러크 컨트롤 관리를 이득

저자:작은 꿈, 창작: 2023-11-19 20:57:18, 업데이트: 2023-12-09 23:21:49

img

양적 거래의 보편화와 발전에 따라, 투자자는 종종 많은 현장 계정을 관리해야하며, 이는 거래 의사결정, 모니터링 및 실행에 큰 도전을 가져옵니다. 관리 효율성을 높이고 운영의 어려움을 줄이기 위해, FMZ에서 거래자는 FMZ의 확장 API를 사용하여 클러크 관리를 할 수 있습니다. 이 문서에서는 양적 거래에서 FMZ 확장 API를 사용하는 장점과 효율적인 클러크 관리를 달성하는 방법을 살펴볼 것입니다.

많은 사용자들이 자신의 클라이언트 디스크를 관리하고 유지보수를 필요로 하고 있으며, 클라이언트 디스크가 매우 많을 때 더 편리한 방법으로 관리해야 합니다. FMZ는 강력한 확장 API를 제공하며 FMZ의 확장 API를 통해 집단 제어 관리를 하는 것이 이상적인 선택입니다.

집중 감시

FMZ의 확장 API를 통해 모든 실제 계정의 거래 활동 및 자산 상태를 집중적으로 모니터링 할 수 있습니다. 각 계정의 보유 상태, 역사 거래 기록, 또는 실시간 계정의 수익 및 손실 상태를 모니터링하는 것이 가능합니다.

// 全局变量
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 
}

function main() {
    var robotStatusCode = dicRobotStatusCode[arrIndexDesc[robotStatus]]
    var robotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, robotStatusCode)
    if (!robotList) {
        Log("获取实盘数据失败")
    }
    
    var robotTbl = {"type": "table", "title": "实盘列表", "cols": [], "rows": []}
    robotTbl.cols = ["实盘Id", "实盘名称", "实盘状态", "策略名称", "实盘收益"]

    _.each(robotList, function(robotInfo) {
        robotTbl.rows.push([robotInfo.id, robotInfo.name, descRobotStatusCode[robotInfo.status], robotInfo.strategy_name, robotInfo.profit])
    })

    LogStatus(_D(), "`" + JSON.stringify(robotTbl) + "`")
}

전략적 매개 변수 설계:

img

인터랙티브 디자인:

img

실제 디스크 실행:

img

한 키 실행

클러스 컨트롤 관리는 하나의 키로 거래를 실행하는 것을 매우 간편하게 만듭니다. 여러 디스크를 하나씩 열지 않고 동시에 여러 디스크에 구매, 판매, 평준화 등의 작업을 수행 할 수 있습니다. 이것은 실행 효율성을 향상시킬뿐만 아니라 작업 오류의 가능성을 줄입니다.

디스크 목록 정보를 얻으면 디스크에 명령어를 전송하여 디스크 정지, 디스크 일시 보호, 디스크 모드 전환 등의 일련의 작업을 수행할 수 있습니다. 이 모든 것은 FMZ의 확장 API를 통해 가능합니다.CommandRobot이 글은

우리는 코드를 계속 작성하고 있습니다. 우리는 단지 주 함수에서 상호 작용을 추가하고 API를 확장합니다.CommandRobot이 글은

function main() {
    var robotStatusCode = dicRobotStatusCode[arrIndexDesc[robotStatus]]
    var robotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, robotStatusCode)
    if (!robotList) {
        Log("获取实盘数据失败")
    }
    
    var robotTbl = {"type": "table", "title": "实盘列表", "cols": [], "rows": []}
    robotTbl.cols = ["实盘Id", "实盘名称", "实盘状态", "策略名称", "实盘收益"]

    _.each(robotList, function(robotInfo) {
        robotTbl.rows.push([robotInfo.id, robotInfo.name, descRobotStatusCode[robotInfo.status], robotInfo.strategy_name, robotInfo.profit])
    })

    LogStatus(_D(), "`" + JSON.stringify(robotTbl) + "`")

    while(true) {
        LogStatus(_D(), ", 等待接收交互命令", "\n", "`" + JSON.stringify(robotTbl) + "`")

        var cmd = GetCommand()
        if (cmd) {
            var arrCmd = cmd.split(":")
            if (arrCmd.length == 1 && cmd == "coverAll") {
                _.each(robotList, function(robotInfo) {
                    var strCmd = "清仓"               // 可以定义所需的消息格式
                    if (robotInfo.status != 1) {     // 只有”活着“的实盘才能接收命令
                        return 
                    }
                    var ret = callFmzExtAPI(accessKey, secretKey, "CommandRobot", parseInt(robotInfo.id), strCmd)
                    LogControl("向id:", robotInfo.id, "的实盘发送命令:", strCmd, ", 执行结果:", ret)
                })
            }
        }
        Sleep(1000)
    }
}

img

그룹 컨트롤 정책은 "테스트 1A"와 "테스트 1B"에 명령어를 보내줍니다.

img

img

전략 동기화

FMZ의 확장 API를 사용하여 대량 변경 정책 매개 변수, 대량 시작 및 정지 디스크를 쉽게 구현할 수 있습니다. 이 글의 내용을 고려할 때, 대량 수정 전략의 실제 디스크 파라미터에 대한 자세한 내용은 다음 기사에서 시작됩니다.

마지막 말

양적 거래에서 FMZ의 확장 API를 사용하여 클러스 컨트롤 관리를 통해 거래자는 여러 실제 계정을 보다 효율적으로 모니터링, 실행 및 조정할 수 있습니다. 이러한 중앙 집중식 관리 방식은 운영 효율성을 향상시킬뿐만 아니라 위험 통제와 전략 동기화를 더 잘 구현하는 데 도움이됩니다. 많은 실제 계정을 관리하는 거래자에게 FMZ의 확장 API는 양량 거래가 더 쉽고 통제 가능하도록 강력하고 유연한 도구를 제공합니다.


더 많은