ボットのパラメータをバッチ変更するためにFMZ拡張APIを使用することを教える

作者: リン・ハーンリディア作成日:2023年12月11日 13:37:55 更新日:2024年1月2日 21:22:49

img

FMZでライブ取引のパラメータをバッチで変更するにはどうすればいいですか? ライブ取引の数が数十を超えて数百に達すると,ライブ取引を1つずつ手動で設定することは非常に不便になります.この時点で,これらの操作を完了するためにFMZ拡張APIを使用することができます. したがって,この記事では,ボットのグループ制御を探検し,パラメータの詳細を更新します.

前回の記事では,FMZ拡張 API を使用してすべてのライブトレードを監視し,ライブトレードをグループ制御し,ライブトレードにコマンドを送信する方法の問題を解決しました. そして,私たちはまだ前回の記事でエンカプセルしたインターフェースコールコードをベースとして使用し,ライブトレードのパラメータのバッチ変更を実現するためにコードを書くことを続けます.

パラメータ設定:

img

戦略コード:

// Global variable
var isLogMsg = true   // Controls whether logs are printed or not
var isDebug = false   // Debugging mode
var arrIndexDesc = ["all", "running", "stop"]
var descRobotStatusCode = ["Idle", "Running", "Stopping", "Exited", "Stopped", "There is an error in the strategy"]
var dicRobotStatusCode = {
    "all" : -1,
    "running" : 1,
    "stop" : 4,
}

// Extended logging functions
function LogControl(...args) {
    if (isLogMsg) {
        Log(...args)
    }
}

// FMZ extended API call functions
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)  // Control frequency
    return ret 
}

// Get information about all running bots for the specified strategy 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("Maximum number of retries exceeded", 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つのシナリオがあります このシナリオは2つのシナリオです

    1. ボットが作成されました すでに作成されたライブ取引では,FMZへの拡張 API インターフェースである RestartRobot 機能を使用して再起動することが自然です.
    1. ボットは作成されていません. ライブ取引は作成されていないため, ライブ取引のパラメータを変更する必要はありません. ライブ取引のバッチ作成が実行され,我々はFMZ拡張APIインターフェース - NewRobot機能を使用します.

操作は同じです. だから,この式を使います.RestartRobot拡張 API 機能を例として説明します.

RestartRobot 関数は2つの方法で使用されます.

    1. ライブ取引のパラメータではなく,ライブ取引IDのみを入力した設定 このアプローチは,ライブ取引が停止したときのパラメータ設定を変更せず,ライブ取引のみを再開します.
    1. ライブ・トレーディング 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である戦略):

img

img

この戦略は3つのパラメータをテストします

しかし,拡張 API インターフェース RestartRobot 機能では,いずれもパラメータが指定されていない (ちょうどライブ取引を開始している) またはすべてのパラメータ構成が指定されなければならない.

つまり,ライブ取引を開始するために RestartRobot 関数を使用する前に,Live取引の現在の設定を最初に取得するために拡張された API インターフェース GetRobotDetail 関数を使用し,その後修正する必要があるパラメータの一部を置き換えて,ライブ取引の開始のための設定パラメータを再構築します (すなわち,Live取引を呼び出すために使用されるパラメータ).

ロボットリストを横切って,現在のパラメータの設定を一つずつ取得します./**/このデータに対処する必要があります. 詳細は,これらのデータについて説明します.

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": "Test 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\",\"Currency list\",\"English comma spacing\",\"BTC_USDT,ETH_USDT,EOS_USDT,LTC_USDT\"],[\"col\",\"breadth\",\"Total width of the page is 12\",6],[\"htight\",\"height\",\"unit px\",600],[\"$$$__cmd__$$$coverSymbol\",\"close the position\",\"close out trading pairs\",\"\"]]",
                        "strategy_exchange_pairs": "[3600,[186193],[\"BTC_USD\"]]",
                        "strategy_id": 131242,
                        "strategy_last_modified": "2023-12-09 23:14:33",
                        "strategy_name": "Test 1",
                        ...
                    }
                },
                "error": null
            }
        }
        */

        // Parse the exchange configuration data
        var exchangePairs = JSON.parse(robotDetail.data.result.robot.strategy_exchange_pairs)

        // Get the exchange object index, trading pairs, these settings are not going to be changed
        var arrExId = exchangePairs[1]
        var arrSymbol = exchangePairs[2]

        // Parse parameter configuration data
        var params = JSON.parse(robotDetail.data.result.robot.robot_args)

        // Update parameters
        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]])  // Construct the strategy parameters and update the new parameter values
                }
            }
        })
        
        // Note that if there are spaces in the data you need to transcode it, otherwise the request will report an error
        settings = {
            "name": robotDetail.data.result.robot.name,
            // Strategy parameter
            "args": newParams,         
            // The strategy ID can be obtained by the GetStrategyList method.
            "strategy": robotDetail.data.result.robot.strategy_id,
            // K-period parameter, 60 means 60 seconds
            "period": exchangePairs[0],
            // Specifies which docker to run on; not writing this attribute means automatically assigning the run
            "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) // Test
        var retRestart = callFmzExtAPI(accessKey, secretKey, "RestartRobot", robotInfo.id, settings)
        Log("retRestart:", retRestart)
    })
}

バッチパラメータ変更戦略を実行した後,私のライブ取引:

  • 試験1A
  • テスト 1B

パラメータのバッチ変更は,設定された交換オブジェクト,取引ペアおよびKライン期間が変更されずに行われました:

自動で変更されました.

img

上記のコードで修正されたパラメータを指定したからです

        // Update parameters
        var dicParams = {
            "pairs" : "AAA_BBB,CCC_DDD",
            "col" : "999",
            "htight" : "666"
        }

エンド

この方法により,より便利です.例では,パラメータは均一に修正されます. もちろん,コードで独自の修正ルールをカスタマイズして,各ライブ取引の異なるパラメータ構成を指定することができます. または異なる交換オブジェクト,取引ペアなどを指定できます.

FMZのプラットフォームでは,これらの要件は柔軟で,達成するにはカスタマイズできます. 要求のアイデアがあればコメントを残すのも自由です. 私たちは議論し,研究し,お互いから学び,問題の解決策を見つけることができます.


もっと