avatar of 发明者量化-小小梦 发明者量化-小小梦
フォロー ダイレクトメッセージ
4
フォロー
1271
フォロワー

FMZ拡張APIを使用してリアルタイムパラメータを一括変更する方法を説明します

作成日:: 2023-12-09 20:39:41, 更新日:: 2025-05-16 17:00:20
comments   2
hits   1004

FMZ拡張APIを使用してリアルタイムパラメータを一括変更する方法を説明します

FMZ でリアルタイム パラメータを一括変更するにはどうすればよいでしょうか?実ディスクの数が数十を超え、数百に達すると、実ディスクを 1 つずつ手動で構成すると、メンテナンスが非常に不便になります。現時点では、FMZ の拡張 API を使用してこれらの操作を完了できます。この記事では、グループ制御とパラメータの更新について詳しく説明します。

前回の記事では、FMZ の拡張 API を使用して、すべての実ディスクを監視し、実ディスクをグループ制御し、実ディスクに指示を送信する方法を解決しました。前回の記事でカプセル化したインターフェース呼び出しコードをベースとして、リアルタイムパラメータの一括変更を実現するためのコードを書き続けます。

パラメータ設定:

FMZ拡張APIを使用してリアルタイムパラメータを一括変更する方法を説明します

戦略コード:

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

まず、FMZ拡張APIのRestartRobot関数を理解しましょう。

リアルタイム パラメータをバッチで変更してからリアルタイムで実行する必要がある場合、このシナリオには 2 つの状況があります。

  • 1. 本当のオファーが作られました 作成された実際のディスクを再起動するには、当然、FMZ の拡張 API インターフェイスである RestartRobot 関数が使用されます。
  • 2. 本当の市場はまだ形成されていない 実ディスクが作成されていない場合、実ディスクパラメータを「変更する」という概念はありません。実ディスクのバッチ作成操作に属します。このとき、FMZ - NewRobot 関数の拡張 API インターフェイスが使用されます。

しかし、どの方法を使用しても、以下の考え方と操作は似ているので、まずはRestartRobotこの拡張 API 関数は例として使用されます。

RestartRobot 関数を使用するには 2 つの方法があります。

  • 1. 実ディスク ID のみが渡され、実ディスクのパラメータ構成は渡されません。 この方法では、実ディスクが停止しているときのパラメータ設定は変更されず、実ディスクのみが再起動されます。
  • 2. 実ディスクのIDとパラメータ設定を入力します。 このメソッドは、新しいパラメータ設定で実際のディスク操作を開始します。

最初の方法は、多数のリアルタイム パラメータをバッチで変更する必要があるため、このシナリオには役に立ちません。そこで問題となるのは、実際の市場のパラメータ設定が、交換オブジェクト設定、戦略パラメータ設定、K ライン サイクル設定など、非常に複雑であることです。

心配しないでください。一つずつ説明していきます。

操作したい本当の情報を取得する

FMZ では、実ディスクのパラメータ設定を変更する場合、実ディスクは非実行状態である必要があります。実行状態ではない実ディスクのみがパラメータ構成を変更できるためです。動作していない実際のディスクは次のようなものである可能性があります。

  • 戦略は停止しました。
  • 戦略に何か問題があります。やめてください。

まず、特定の戦略の実際の市場を把握する必要があります。これらの実際の市場は停止状態またはエラー時に停止状態。

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

このようにして、変更する必要がある実ディスク情報をすべて取得しました。次に、実ディスクの詳細な構成を取得する必要があります。

実際のディスク構成パラメータを変更する

たとえば、パラメータを変更する必要があるリアルタイム戦略は次のとおりです (つまり、戦略 ID が strategyId 変数である戦略)。

FMZ拡張APIを使用してリアルタイムパラメータを一括変更する方法を説明します

FMZ拡張APIを使用してリアルタイムパラメータを一括変更する方法を説明します

この戦略には、実験として 3 つのパラメーターがあります。

リアルタイム戦略パラメータを変更しますが、戦略の交換構成を変更したくない場合があります。ただし、拡張APIインターフェイスRestartRobot関数では、パラメータが指定されていない(そのままリアルタイム取引を開始する)か、すべてのパラメータ設定を指定する必要があります。

つまり、RestartRobot関数を使用して実ディスクを起動する前に、まず拡張APIインターフェイスGetRobotDetail関数を使用して実ディスクの現在の構成を取得し、次に変更する必要があるパラメータを置き換えて、実ディスクを再構築する必要があります。実ディスクを起動し(つまり、RestartRobot 時に使用するパラメータを呼び出し)、実ディスクを再起動します。

次にrobotListを走査して、現在のパラメータ設定を1つずつ取得します。次のコードでは/**/コメント部分は実際の取引の詳細情報であり、次にこのデータを処理する必要があります。

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

このバッチ パラメータ変更戦略を実行した後、実際の取引量は次のようになります。

  • テスト1A
  • テスト1B

設定された交換オブジェクト、取引ペア、および K ライン期間は変更されないまま、パラメータが変更されます。

実際のマーケットページは自動的に次のように変わります。

FMZ拡張APIを使用してリアルタイムパラメータを一括変更する方法を説明します

そして走り始めます。上記のコードでは変更されたパラメータを指定したため、

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

END

この方法は、数十または数百の実際のディスクのパラメータを一括変更する場合に便利です。この例では、パラメータは統一されたものに変更されています。もちろん、コード内で独自の変更ルールをカスタマイズし、実際のアカウントごとに異なるパラメータ構成を指定することもできます。または、異なる交換オブジェクト、取引ペアなどを指定します。

FMZ プラットフォームでは、これらの要件を柔軟にカスタマイズして実装できます。要件やアイデアがある場合は、メッセージを残してください。一緒に問題の解決策について話し合い、調査し、学習します。