Mengajarkan Anda menggunakan FMZ Extension API untuk mengubah parameter disk secara massal

Penulis:Mimpi kecil, Dibuat: 2023-12-09 20:39:41, Diperbarui: 2023-12-12 21:43:48

img

Bagaimana cara mengubah parameter disk secara massal di FMZ? Ketika jumlah disk lebih dari beberapa lusin dan mencapai ratusan, sangat tidak nyaman untuk memelihara jika satu per satu disk dikonfigurasi secara manual. Saat ini Anda dapat menggunakan API ekstensi FMZ untuk melakukan operasi ini.

Pada artikel sebelumnya, kami telah membahas bagaimana menggunakan FMZ untuk memantau semua hardisk, kelompok hardisk, dan mengirim instruksi ke hardisk. Kami masih menggunakan kode panggilan antarmuka yang kami bungkus sebelumnya sebagai dasar, dan terus menulis kode untuk mencapai perubahan batch parameter hardisk.

Peraturan parameter:

img

Kode 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 
}

Pertama-tama mengenal fungsi RestartRobot dari FMZ Extension API

Ketika kita perlu mengubah parameter disk secara massal dan kemudian menjalankan disk, skenario ini memiliki dua situasi pertama.

  • 1. Disk nyata sudah dibuat Untuk hardisk yang sudah dibuat, restart secara alami adalah menggunakan FMZ's extended API interface plugin RestartRobot function.
  • 2, belum dibuat Untuk tidak membuat cakram, tidak ada lagi konsep mengubah parameter cakram, dan itu adalah bagian dari pembuatan cakram dalam jumlah besar, yang saat ini digunakan oleh fungsi NewRobot, sebuah antarmuka API ekstensi FMZ.

Tapi entah bagaimana, ide dan tindakan selanjutnya sangat berbeda.RestartRobotFungsi API ekstensi ini digunakan sebagai contoh penjelasan.

Fungsi RestartRobot dapat digunakan dalam dua cara:

  • 1, hanya mengirim ID disk, tidak mengirim konfigurasi parameter disk. Cara ini menyimpan konfigurasi parameter pada saat disk berhenti tidak berubah, hanya memulai kembali disk.
  • 2, Mengirim ID disk dan juga mengirim konfigurasi parameter disk. Dengan cara ini, disk boot akan berjalan dengan konfigurasi parameter baru.

Cara pertama tidak berguna untuk skenario permintaan kami, karena kebutuhan kami sendiri adalah untuk mengubah sejumlah besar parameter disk. Jadi masalahnya, konfigurasi parameter disk sangat rumit, dengan konfigurasi objek bursa, konfigurasi parameter strategi, pengaturan siklus K-line, dll.

Jangan khawatir, kami akan mencari tahu satu per satu.

Mendapatkan informasi disk yang ingin dioperasikan

Pada FMZ, jika ingin mengubah konfigurasi parameter dari sebuah disk, maka disk tersebut harus berada dalam keadaan tidak berjalan. Karena hanya disk yang tidak dalam keadaan berjalan yang dapat mengubah konfigurasi parameter.

  • Taktiknya berhenti.
  • Taktiknya salah, hentikan.

Jadi pertama kita harus mendapatkan cakram yang memiliki kebijakan tertentu, dan cakram ini berada diKeadaan berhentiAtauKesalahan berhentiSaya tidak tahu apa yang terjadi.

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

Dengan begitu kita mendapatkan semua informasi disk yang perlu diubah, dan selanjutnya kita akan mendapatkan detail konfigurasi disk.

Mengubah parameter konfigurasi disk

Sebagai contoh, kita perlu mengubah kebijakan real disk parameter sebagai berikut ((yaitu kebijakan ID untuk variabel strategiId):

img

img

Strategi ini memiliki tiga parameter, yang digunakan sebagai percobaan.

Mengubah parameter kebijakan disk, tetapi mungkin kita tidak ingin mengubah konfigurasi bursa kebijakan, tetapi untuk fungsi RestartRobot untuk memperluas antarmuka API, tidak ada parameter yang ditentukan (yang tidak berfungsi hanya memulai disk), atau semua konfigurasi parameter harus ditentukan.

Ini berarti bahwa selanjutnya sebelum kita menggunakan fungsi RestartRobot untuk memulai disk, kita harus menggunakan extended API interface GetRobotDetail untuk mengakses konfigurasi disk saat ini, dan kemudian kita mengganti bagian parameter yang ingin diubah, mengkonstruksi kembali parameter konfigurasi disk startup (yaitu parameter yang akan digunakan saat memanggil RestartRobot), dan kemudian memulai kembali disk.

Jadi selanjutnya kita pergi ke robotList dan mengambil konfigurasi parameter saat ini satu per satu, dalam kode berikut./**/Bagian komentar adalah informasi detail dari cakram nyata, dan selanjutnya kita perlu memproses data tersebut.

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)
    })
}

Setelah menjalankan strategi ini untuk mengubah parameter secara massal, saya dapat melihat:

  • Uji 1A
  • Percobaan 1B

Perubahan pada parameter yang tidak berubah pada obyek, pasangan, dan siklus K-line yang dikonfigurasi:

Pada halaman desktop, perubahan otomatis dilakukan untuk:

img

Jika Anda ingin mengubahnya, Anda harus mengklik tombol yang ada di atas dan mulai menjalankan.

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

Penghentian

Untuk puluhan, bahkan ratusan disk, metode ini lebih mudah digunakan. Dalam contoh ini, modifikasi menjadi parameter seragam, tentu saja Anda juga dapat menyesuaikan aturan modifikasi Anda sendiri dalam kode, menetapkan konfigurasi parameter yang berbeda untuk setiap disk.

Untuk platform FMZ, semua kebutuhan ini dapat disesuaikan secara fleksibel, dan jika ada ide tentang kebutuhan, silakan tinggalkan komentar, kami akan membahas, mempelajari, dan mempelajari solusi bersama.


Lebih banyak

Allez-zAda puluhan, ratusan, dan banyak uang untuk menyewa.

Mimpi kecilAda beberapa yang menggunakan FMZ Extension API untuk membungkus produk, dan ada banyak hard disk.