Sumber dimuat naik... memuat...

Menggunakan API FMZ yang diperluaskan untuk mencapai kelebihan pengurusan kawalan kumpulan yang cekap dalam transaksi kuantitatif

Penulis:Pencipta Kuantiti - Impian Kecil, Dicipta: 2023-11-19 20:57:18, Dikemas kini: 2023-12-09 23:21:49

img

Dengan populariti dan perkembangan dagangan kuantitatif, pelabur biasanya perlu menguruskan banyak akaun sebenar, yang membawa cabaran besar kepada membuat keputusan dagangan, pemantauan dan pelaksanaan. Untuk meningkatkan kecekapan pengurusan dan mengurangkan kesukaran operasi, pedagang di FMZ boleh menggunakan API lanjutan FMZ untuk pengurusan kumpulan. Artikel ini akan membincangkan kelebihan menggunakan API lanjutan FMZ dalam dagangan kuantitatif dan bagaimana untuk mencapai pengurusan kumpulan yang cekap.

Ramai pengguna mempunyai cakera maya pelanggan mereka sendiri yang memerlukan penyelenggaraan penyelenggaraan, apabila cakera maya pelanggan sangat banyak, mereka memerlukan cara yang lebih mudah untuk menguruskan penyelenggaraan (sekurang-kurangnya sepuluh cakera maya, lebih banyak daripada seratus cakera maya). FMZ menyediakan API penyelenggaraan yang kuat, yang menjadi pilihan yang ideal untuk pengurusan kawalan kumpulan melalui API penyelenggaraan FMZ.

Pengawasan Terpusat

Dengan API FMZ yang diperluaskan, anda boleh memantau aktiviti dagangan dan keadaan aset semua akaun sebenar secara terpusat. Sama ada dengan memeriksa status pegangan setiap akaun, rekod sejarah dagangan, atau memantau keadaan keuntungan dan kerugian akaun secara langsung.

// 全局变量
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) + "`")
}

Perancangan Parameter Strategi:

img

Reka bentuk interaktif:

img

Perkhidmatan:

img

Pelaksanaan satu kekunci

Pengendalian kumpulan membuat pelaksanaan dagangan dengan satu butang menjadi sangat mudah. Anda boleh melakukan operasi membeli, menjual, atau menyelaraskan pada beberapa cakera pada masa yang sama tanpa perlu membuka cakera yang berbeza untuk melakukan operasi secara individu. Ini bukan sahaja meningkatkan kecekapan pelaksanaan tetapi juga mengurangkan kemungkinan kesalahan operasi.

Setelah mendapatkan maklumat senarai cakera sebenar, kita boleh menghantar arahan ke cakera sebenar untuk melakukan pelbagai operasi yang ditetapkan. Contohnya: pembersihan cakera sebenar, perlindungan pendirian cakera sebenar, beralih mod cakera sebenar. Semua ini boleh dilakukan melalui API lanjutan FMZ.CommandRobotPerkembangan.

Kami terus menulis kod, hanya menambah beberapa interaksi dan memperluaskan API pada fungsi utama.CommandRobotPermintaan:

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

Kaedah kawalan kumpulan menghantar arahan kepada "Uji 1 A" dan "Uji 1 B".

img

img

Sinkronisasi Strategi

Dengan menggunakan API lanjutan FMZ, anda boleh dengan mudah melaksanakan parameter dasar pengubahsuaian jumlah, permulaan dan penghentian jumlah. Mengingat kandungan artikel ini, mengenai parameter cakera sebenar untuk strategi pengubahsuaian kuantiti, kami akan mulakan artikel kami yang seterusnya.

Perkataan akhir

Dalam dagangan kuantitatif, pengendalian kawalan kumpulan dilakukan dengan menggunakan API lanjutan FMZ, yang membolehkan peniaga memantau, melaksanakan dan menyesuaikan beberapa akaun sebenar dengan lebih cekap. Pengendalian terpusat ini bukan sahaja meningkatkan kecekapan operasi tetapi juga membantu melaksanakan kawalan risiko dan sinkronisasi strategi yang lebih baik. Bagi peniaga yang menguruskan banyak akaun sebenar, FMZ's Extensible API menyediakan alat yang kuat dan fleksibel untuk membuat transaksi kuantitatif menjadi lebih mudah dan terkawal.


Lebih lanjut