Mengajar anda menggunakan FMZ Extension API untuk mengubahsuai parameter cakera sebenar secara besar-besaran

Penulis:Mimpi kecil, Dicipta: 2023-12-09 20:39:41, Dikemas kini: 2023-12-12 21:43:48

img

Bagaimana untuk mengubahsuai parameter cakera sebenar secara besar-besaran di FMZ? Apabila bilangan cakera sebenar melebihi puluhan, apabila mencapai ratusan, sangat tidak mudah untuk mengekalkan jika satu cakera sebenar disusun secara manual. Pada masa ini, anda boleh menggunakan API lanjutan FMZ untuk menyelesaikan operasi ini.

Dalam artikel sebelumnya, kami telah menyelesaikan bagaimana menggunakan FMZ untuk memantau semua cakera, cakera kumpulan, dan menghantar arahan kepada cakera.

Seting parameter:

img

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 
}

Fungsi RestartRobot untuk API FMZ

Apabila kita perlu mengubahsuai parameter cakera sebenar secara besar-besaran dan kemudian menjalankan cakera sebenar, terdapat dua keadaan pertama.

  • 1, cakera nyata telah dicipta Untuk cakera sebenar yang telah dicipta, memulakan semula secara semula jadi adalah dengan menggunakan API API FMZ yang diperluaskan.
  • 2, cakera sebenar belum dicipta Untuk tidak mencipta cakera sebenar, tidak ada lagi konsep pembaikan parameter cakera sebenar, dan ia adalah untuk menjalankan cakera sebenar yang dibuat secara besar-besaran, yang pada masa ini menggunakan fungsi NewRobot yang digunakan oleh FMZ.

Tetapi dengan cara yang sama, idea dan tindakan seterusnya adalah sama, jadi kita akan menggunakan cara yang sama.RestartRobotFungsi API pelanjutan ini digunakan sebagai contoh penjelasan.

Terdapat dua cara untuk menggunakan fungsi RestartRobot:

  • 1, hanya menghantar ID cakera sebenar, tidak menghantar konfigurasi parameter cakera sebenar. Cara ini mengekalkan konfigurasi parameter pada masa pendirian cakera sebenar tidak berubah, hanya memulakan semula cakera sebenar.
  • 2, menghantar ID cakera sebenar, juga menghantar konfigurasi parameter cakera sebenar. Dengan cara ini, pemasangan parameter baru akan memulakan cakera sebenar.

Cara pertama tidak berfungsi untuk senario permintaan kami, kerana keperluan kami sendiri adalah untuk mengubahsuai banyak parameter cakera sebenar. Oleh itu, masalah muncul, konfigurasi parameter cakera sebenar sangat rumit, dengan konfigurasi objek pertukaran, konfigurasi parameter strategi, tetapan kitaran K-line, dan sebagainya.

Jangan risau, kami akan menyiasat secara terperinci.

Dapatkan maklumat cakera sebenar untuk dioperasikan

Pada FMZ, jika anda ingin mengubah konfigurasi parameter cakera sebenar, cakera ini mestilah berada dalam keadaan tidak berjalan. Kerana hanya cakera yang tidak berada dalam keadaan berjalan yang boleh mengubah konfigurasi parameter.

  • Strategi berhenti.
  • Strategi yang salah, hentikan.

Jadi pertama, kita perlu mendapatkan cakera sebenar yang mempunyai strategi tertentu, dan cakera sebenar ini terletak di mana-mana.Status hentiatauKesilapan berhentiPerkataan ini tidak boleh diterima.

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

Dengan cara ini, kita mendapat semua maklumat cakera yang perlu diubahsuai, dan seterusnya kita akan mendapat maklumat terperinci mengenai cakera tersebut.

Mengubah parameter konfigurasi cakera

Sebagai contoh, kita perlu mengubah dasar rak sebenar parameter seperti berikut (iaitu dasar ID untuk strategiId):

img

img

Strategi ini mempunyai tiga parameter untuk diuji.

Mengubah parameter dasar cakera sebenar, tetapi mungkin kita tidak mahu mengubah konfigurasi bursa dasar, tetapi untuk fungsi RestartRobot yang menggunakan antarmuka API yang diperluaskan, sama ada tidak menetapkan sebarang parameter (yang tidak berfungsi hanya memulakan cakera sebenar), atau semua konfigurasi parameter mesti ditetapkan.

Ini bermaksud bahawa sebelum kita memulakan cakera dengan fungsi RestartRobot, kita mesti menggunakan fungsi GetRobotDetail API untuk mendapatkan konfigurasi semasa cakera, dan kemudian kita menggantikan bahagian parameter yang perlu diubah, menyusun semula parameter konfigurasi cakera (iaitu parameter yang akan digunakan ketika memanggil RestartRobot) dan mulakan semula cakera.

Jadi seterusnya kita pergi ke robotList, dan mengambil satu persatu parameter yang ada sekarang, dalam kod berikut./**/Bahagian komen adalah maklumat terperinci mengenai cakera sebenar, dan seterusnya kita perlu memproses data ini.

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 ini untuk mengubah parameter secara besar-besaran, cakera maya saya:

  • Ujian 1A
  • Ujian 1B

Parameter telah diubah apabila objek pertukaran, pasangan dagangan, dan kitaran K baris yang dikonfigurasikan tidak berubah:

Laman web ini akan berubah secara automatik untuk:

img

Jika anda ingin mengubahnya, anda perlu mengklik pada halaman ini dan mulakannya.

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

END

Untuk parameter pengubahsuaian kuantiti berpuluh-puluh, beratus-ratus cakera sebenar, kaedah ini agak mudah digunakan. Dalam contoh ini, pembaikan menjadi parameter seragam. Sudah tentu, anda juga boleh menyesuaikan peraturan pengubahsuaian anda sendiri dalam kod, menetapkan konfigurasi parameter yang berbeza untuk setiap cakera sebenar; atau menetapkan objek pertukaran yang berbeza, rakan niaga, dan sebagainya.

Untuk platform FMZ, semua keperluan ini boleh disesuaikan secara fleksibel, ada idea untuk apa yang diperlukan, kami mengalu-alukan anda untuk menulis dan kami akan meneroka, mengkaji, dan mempelajari penyelesaian bersama.


Lebih lanjut

Allez-zPuluhan, beratus-ratus cakera sebenar, sewa bulan adalah wang yang banyak.

Mimpi kecilTerdapat beberapa produk yang menggunakan FMZ Extension API Packaging, dan terdapat banyak cakera fizikal.