Преимущества использования расширенного API FMZ для эффективного управления контролем группы в количественной торговле

Автор:FMZ~Lydia, Создано: 2023-11-20 14:05:49, Обновлено: 2024-01-01 12:16:20

The Advantages of Using FMZ’s Extended API for Efficient Group Control Management in Quantitative Trading

С популяризацией и развитием количественной торговли инвесторам часто необходимо управлять большим количеством реальных счетов, что создает большие проблемы для принятия торговых решений, мониторинга и исполнения. Для повышения эффективности управления и снижения операционных трудностей трейдеры на FMZ могут использовать расширенный API FMZ для управления групповым контролем.

Многие пользователи имеют свои собственные живые учетные записи клиентов, которые нуждаются в управлении и обслуживании. Когда есть много живых учетных записей клиентов, для управления ими необходим более удобный способ (всего несколько десятков или сотни). FMZ предоставляет мощный расширенный API; использование этого для управления групповым контролем стало идеальным выбором.

Централизованное наблюдение

С помощью расширенного API FMZ вы можете централизованно отслеживать торговую деятельность и состояние активов всех живых счетов.

// Global variable
var isLogMsg = true   // Control whether the log is printed
var isDebug = false   // Debug mode
var arrIndexDesc = ["all", "running", "stop"]
var descRobotStatusCode = ["In idle", "Running", "Stopping", "Exited", "Stopped", "Strategy error"]
var dicRobotStatusCode = {
    "all" : -1,
    "running" : 1,
    "stop" : 4,
}

// Extended log function
function LogControl(...args) {
    if (isLogMsg) {
        Log(...args)
    }
}

// FMZ extended API call function
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 
}

// Obtain all live trading information of 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("Exceeded the maximum number of retries", 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("Failed to obtain live trading data")
    }
    
    var robotTbl = {"type": "table", "title": "live trading list", "cols": [], "rows": []}
    robotTbl.cols = ["live trading Id", "live trading name", "live trading status", "strategy name", "live trading profit"]

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

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

Конструкция параметров стратегии:

The Advantages of Using FMZ’s Extended API for Efficient Group Control Management in Quantitative Trading

Работает на живой торговле:

The Advantages of Using FMZ’s Extended API for Efficient Group Control Management in Quantitative Trading

Исполнение одним щелчком мыши

Управление групповым контролем делает очень удобным выполнение транзакций одним щелчком мыши. Вы можете покупать, продавать и закрывать позиции на нескольких реальных торговых счетах одновременно, не открывая каждый счет отдельно. Это не только улучшает эффективность выполнения, но и уменьшает вероятность операционных ошибок.

После получения списка реальных торговых счетов мы можем отправлять команды на эти счета и выполнять ряд предопределенных операций. Например: клиринг позиций на реальных счетах, приостановка защиты на реальных счетах, переключение режимов на реальных счетах. Все это может быть достигнуто с помощью расширенного API FMZ.CommandRobot.

Как мы продолжаем писать код, мы просто должны добавить некоторые взаимодействия и вызовы к расширенному интерфейсу APICommandRobotв нашей главной функции:

function main() {
    var robotStatusCode = dicRobotStatusCode[arrIndexDesc[robotStatus]]
    var robotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, robotStatusCode)
    if (!robotList) {
        Log("Failed to obtain live trading data")
    }
    
    var robotTbl = {"type": "table", "title": "live trading list", "cols": [], "rows": []}
    robotTbl.cols = ["live trading Id", "live trading name", "live trading status", "strategy name", "live trading profit"]

    _.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(), ", Waiting to receive interactive commands", "\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 = "Clearance"               // You can define the required message format
                    if (robotInfo.status != 1) {     // Only the "live" trading platform can receive commands.
                        return 
                    }
                    var ret = callFmzExtAPI(accessKey, secretKey, "CommandRobot", parseInt(robotInfo.id), strCmd)
                    LogControl("Send command to the live trading board with id: ", robotInfo.id, ":", strCmd, ", execution result:", ret)
                })
            }
        }
        Sleep(1000)
    }
}

The Advantages of Using FMZ’s Extended API for Efficient Group Control Management in Quantitative Trading

Групповая стратегия контроля отправляла инструкции на Test 1 A и Test 1 B.

The Advantages of Using FMZ’s Extended API for Efficient Group Control Management in Quantitative Trading The Advantages of Using FMZ’s Extended API for Efficient Group Control Management in Quantitative Trading

The Advantages of Using FMZ’s Extended API for Efficient Group Control Management in Quantitative Trading The Advantages of Using FMZ’s Extended API for Efficient Group Control Management in Quantitative Trading

Синхронизация стратегии

С расширенным API FMZ вы можете легко внедрять пакетные модификации параметров стратегии и запускать или останавливать прямую торговлю.

Резюме

В количественной торговле, используя расширенный API FMZ для управления групповым контролем, трейдеры могут более эффективно отслеживать, выполнять и корректировать несколько реальных счетов.

Для трейдеров, управляющих большим количеством реальных счетов, расширенный API FMZ предоставляет им мощный и гибкий инструмент, который делает количественную торговлю более удобной и управляемой.


Больше информации