avatar of 发明者量化-小小梦 发明者量化-小小梦
fokus pada mesej peribadi
4
fokus pada
1271
Pengikut

Ajar anda cara menggunakan API lanjutan FMZ untuk mengubah suai parameter masa nyata secara kelompok

Dicipta dalam: 2023-12-09 20:39:41, dikemas kini pada: 2025-05-16 17:00:20
comments   2
hits   1004

Ajar anda cara menggunakan API lanjutan FMZ untuk mengubah suai parameter masa nyata secara kelompok

Bagaimana untuk mengubah suai parameter masa nyata dalam kelompok pada FMZ? Apabila bilangan cakera sebenar melebihi berpuluh-puluh malah mencecah ratusan, adalah sangat menyusahkan untuk dikekalkan jika anda mengkonfigurasi cakera sebenar secara manual satu demi satu. Pada masa ini, anda boleh menggunakan API lanjutan FMZ untuk menyelesaikan operasi ini. Dalam artikel ini, mari kita terokai beberapa butiran tentang kawalan kumpulan dan mengemas kini parameter.

Dalam artikel sebelumnya, kami menyelesaikan cara menggunakan API lanjutan FMZ untuk memantau semua cakera sebenar, mengawal kumpulan cakera sebenar dan menghantar arahan ke cakera sebenar. Kami masih menggunakan kod panggilan antara muka yang terkandung dalam artikel sebelumnya sebagai asas dan terus menulis kod untuk merealisasikan pengubahsuaian kelompok parameter masa nyata.

Tetapan parameter:

Ajar anda cara menggunakan API lanjutan FMZ untuk mengubah suai parameter masa nyata secara kelompok

Kod strategi:

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

Mula-mula, mari kita fahami fungsi RestartRobot API sambungan FMZ.

Apabila kita perlu mengubah suai parameter masa nyata dalam kelompok dan kemudian menjalankan masa nyata, terdapat dua situasi dalam senario ini.

  • 1. Tawaran sebenar telah dibuat Untuk cakera sebenar yang telah dicipta, memulakan semula secara semula jadi menggunakan antara muka API lanjutan FMZ - fungsi RestartRobot.
  • 2. Pasaran sebenar belum dicipta lagi Jika tiada cakera sebenar dicipta, tiada konsep “mengubah suai” parameter cakera sebenar Ia tergolong dalam penciptaan kumpulan operasi cakera sebenar Pada masa ini, antara muka API lanjutan FMZ - NewRobot digunakan.

Tetapi tidak kira kaedah yang digunakan, idea dan operasi berikut adalah serupa, jadi kita akan mulakanRestartRobotFungsi API lanjutan ini digunakan sebagai contoh.

Terdapat dua cara untuk menggunakan fungsi RestartRobot:

  • 1. Hanya ID cakera sebenar dihantar masuk, dan konfigurasi parameter cakera sebenar tidak dihantar masuk. Kaedah ini mengekalkan konfigurasi parameter apabila cakera sebenar dihentikan tidak berubah, dan hanya memulakan semula cakera sebenar.
  • 2. Masukkan ID cakera sebenar dan konfigurasi parameter cakera sebenar. Kaedah ini memulakan operasi cakera sebenar dengan konfigurasi parameter baharu.

Kaedah pertama tidak berguna kepada senario kami, kerana keperluan kami adalah untuk mengubah suai sejumlah besar parameter masa nyata dalam kelompok. Jadi masalahnya ialah konfigurasi parameter pasaran sebenar adalah sangat rumit, termasuk konfigurasi objek pertukaran, konfigurasi parameter strategi, tetapan kitaran K-line, dll.

Jangan risau, kami akan meneroka mereka satu persatu.

Dapatkan maklumat sebenar yang anda mahu kendalikan

Pada FMZ, jika anda ingin mengubah suai konfigurasi parameter cakera sebenar, maka cakera sebenar mestilah dalam keadaan tidak berjalan. Kerana hanya cakera sebenar yang tidak dalam keadaan berjalan boleh mengubah suai konfigurasi parameter. Cakera sebenar yang tidak beroperasi mungkin:

  • Strategi berhenti.
  • Ada yang tak kena dengan strategi, berhenti.

Jadi mula-mula kita perlu mendapatkan pasaran sebenar strategi yang ditentukan, dan pasaran sebenar ini masukKeadaan berhentiatauBerhenti atas kesilapanstatus.

function main() {
    var stopRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 4)
    var errorRobotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, 5)
    var robotList = stopRobotList.concat(errorRobotList)
}

Dengan cara ini, kami telah memperoleh semua maklumat cakera sebenar yang perlu diubah suai Seterusnya, kami perlu mendapatkan konfigurasi terperinci cakera sebenar.

Ubah suai parameter konfigurasi cakera sebenar

Contohnya, strategi masa nyata yang parameternya perlu kita ubah suai adalah seperti berikut (iaitu strategi yang ID strateginya ialah pembolehubah strategyId):

Ajar anda cara menggunakan API lanjutan FMZ untuk mengubah suai parameter masa nyata secara kelompok

Ajar anda cara menggunakan API lanjutan FMZ untuk mengubah suai parameter masa nyata secara kelompok

Strategi ini mempunyai 3 parameter, sebagai percubaan.

Ubah suai parameter strategi masa nyata, tetapi kami mungkin tidak mahu mengubah suai konfigurasi pertukaran strategi Walau bagaimanapun, untuk antara muka API lanjutan fungsi RestartRobot, sama ada tiada parameter dinyatakan (hanya mulakan dagangan masa nyata sebagaimana adanya), atau. semua konfigurasi parameter mestilah Tentukan.

Ini bermakna sebelum kita menggunakan fungsi RestartRobot untuk memulakan cakera sebenar, kita mesti menggunakan antara muka API lanjutan GetRobotDetail dahulu untuk mendapatkan konfigurasi semasa cakera sebenar, dan kemudian menggantikan parameter yang perlu diubah suai untuk membina semula permulaan cakera sebenar (iaitu, panggil Parameter untuk digunakan apabila RestartRobot) dan kemudian mulakan semula cakera sebenar.

Jadi seterusnya kita merentasi robotList dan mendapatkan konfigurasi parameter semasa satu demi satu dalam kod berikut/**/Bahagian yang dikomen ialah maklumat terperinci transaksi sebenar, dan kami perlu memproses data ini seterusnya.

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": "测试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\",\"币种列表\",\"英文逗号间隔\",\"BTC_USDT,ETH_USDT,EOS_USDT,LTC_USDT\"],[\"col\",\"宽度\",\"页面总宽度为12\",6],[\"htight\",\"高度\",\"单位px\",600],[\"$$$__cmd__$$$coverSymbol\",\"平仓\",\"平仓交易对\",\"\"]]",
                        "strategy_exchange_pairs": "[3600,[186193],[\"BTC_USD\"]]",
                        "strategy_id": 131242,
                        "strategy_last_modified": "2023-12-09 23:14:33",
                        "strategy_name": "测试1",
                        ...
                    }
                },
                "error": null
            }
        }
        */

        // 解析交易所配置数据
        var exchangePairs = JSON.parse(robotDetail.data.result.robot.strategy_exchange_pairs)

        // 拿到交易所对象索引、交易对,这些设置是不打算修改的
        var arrExId = exchangePairs[1]
        var arrSymbol = exchangePairs[2]

        // 解析参数配置数据
        var params = JSON.parse(robotDetail.data.result.robot.robot_args)

        // 更新参数
        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]])  // 构造策略参数,更新上新参数值
                }
            }
        })
        
        // 注意如果数据中有空格需要转码,否则请求的时候会报错
        settings = {
            "name": robotDetail.data.result.robot.name,
            // 策略参数
            "args": newParams,         
            // 策略ID,可以用GetStrategyList方法获取到
            "strategy": robotDetail.data.result.robot.strategy_id,
            // K线周期参数,60即为60秒
            "period": exchangePairs[0],
            // 指定在哪个托管者上运行,不写该属性就是自动分配运行
            "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) // 测试
        var retRestart = callFmzExtAPI(accessKey, secretKey, "RestartRobot", robotInfo.id, settings)
        Log("retRestart:", retRestart)
    })
}

Selepas menjalankan strategi pengubahsuaian parameter kelompok ini, volum dagangan sebenar saya ialah:

  • Ujian 1A
  • Ujian 1B

Parameter diubah suai manakala objek pertukaran yang dikonfigurasikan, pasangan dagangan dan tempoh K-line kekal tidak berubah:

Halaman pasaran sebenar berubah secara automatik kepada:

Ajar anda cara menggunakan API lanjutan FMZ untuk mengubah suai parameter masa nyata secara kelompok

Dan mula berlari. Kerana kami menentukan parameter yang diubah suai dalam kod di atas:

        // 更新参数
        var dicParams = {
            "pairs" : "AAA_BBB,CCC_DDD",
            "col" : "999",
            "htight" : "666"
        }

END

Kaedah ini lebih mudah untuk kumpulan mengubah suai parameter berpuluh-puluh atau beratus-ratus cakera sebenar. Dalam contoh ini, parameter diubah suai kepada yang bersatu Sudah tentu, anda juga boleh menyesuaikan peraturan pengubahsuaian anda sendiri dalam kod dan menentukan konfigurasi parameter yang berbeza untuk setiap akaun sebenar. Atau tentukan objek pertukaran yang berbeza, pasangan dagangan, dsb.

Untuk platform FMZ, keperluan ini boleh disesuaikan dan dilaksanakan secara fleksibel Jika anda mempunyai sebarang keperluan atau idea, sila tinggalkan mesej dan kami akan membincangkan, menyelidik dan mempelajari penyelesaian masalah bersama-sama.