Sumber daya yang dimuat... Pemuatan...

Menggunakan API ekstensi FMZ untuk mencapai keuntungan dalam manajemen kontrol kelompok yang efisien dalam transaksi kuantitatif

Penulis:Penemu Kuantitas - Mimpi Kecil, Dibuat: 2023-11-19 20:57:18, Diperbarui: 2023-12-09 23:21:49

img

Dengan popularitas dan perkembangan perdagangan kuantitatif, investor seringkali perlu mengelola sejumlah besar akun real-time, yang menimbulkan tantangan besar untuk pengambilan keputusan, pemantauan, dan pelaksanaan perdagangan. Untuk meningkatkan efisiensi manajemen dan mengurangi kesulitan operasi, pedagang di FMZ dapat menggunakan API ekstensi FMZ untuk manajemen cluster. Artikel ini akan membahas keuntungan dari penggunaan API ekstensi FMZ dalam perdagangan kuantitatif dan cara mencapai manajemen cluster yang efisien.

Banyak pengguna yang memiliki server klien mereka sendiri yang perlu dikelola dan dikelola. FMZ menyediakan API ekstensi yang kuat, sehingga manajemen cluster melalui FMZ API ekstensi menjadi pilihan ideal.

Pengawasan Terpusat

Dengan FMZ's Extension API, Anda dapat memantau secara terpusat aktivitas perdagangan dan kondisi aset dari semua akun real-time.

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

Desain Parameter Strategi:

img

Desain Interaktif:

img

Perangkat ini berjalan pada:

img

Mengeksekusi satu tombol

Manajemen kontrol kelompok membuat transaksi yang dilakukan dengan satu tombol menjadi sangat sederhana. Anda dapat melakukan pembelian, penjualan, atau penarikan pada beberapa disk secara bersamaan tanpa perlu membuka disk yang berbeda untuk melakukan operasi. Ini tidak hanya meningkatkan efisiensi eksekusi tetapi juga mengurangi kemungkinan kesalahan operasi.

Setelah mendapatkan informasi daftar disk, kita dapat mengirim instruksi ke disk untuk melakukan serangkaian operasi yang telah ditetapkan. Misalnya: disk cleanup, disk pause protection, disk mode switch. Semua ini dapat dilakukan melalui API ekstensi FMZ.CommandRobotSaya tidak tahu apa yang terjadi.

Kami terus menulis kode, hanya menambahkan beberapa interaksi dan memperluas API pada fungsi utama.CommandRobot"Sudah tidak bisa lagi", katanya.

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

Kebijakan kontrol kelompok mengirim instruksi ke "Test 1 A" dan "Test 1 B".

img

img

Sinkronisasi Strategi

Dengan menggunakan API ekstensi FMZ, Anda dapat dengan mudah menerapkan parameter kebijakan modifikasi batch, batch start, stop disk. Karena isi artikel ini, kami akan membahas lebih lanjut tentang parameter piringan untuk kebijakan modifikasi massal di artikel berikutnya.

Pengucapan

Dalam perdagangan kuantitatif, dengan menggunakan API ekstensi FMZ untuk manajemen cluster, pedagang dapat memantau, mengeksekusi, dan menyesuaikan beberapa akun real-time secara lebih efisien. Manajemen terpusat ini tidak hanya meningkatkan efisiensi operasional, tetapi juga membantu menerapkan kontrol risiko dan sinkronisasi strategi yang lebih baik. Untuk pedagang yang mengelola sejumlah besar akun real-time, FMZ's Extensible API menyediakan alat yang kuat dan fleksibel untuk membuat transaksi kuantitatif menjadi lebih mudah dan terkontrol.


Lebih banyak