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

FMZの拡張APIを使用して定量取引における効率的なグループ制御管理を実現する

作成日:: 2023-11-19 20:57:18, 更新日:: 2025-05-16 16:49:59
comments   0
hits   954

FMZの拡張APIを使用して定量取引における効率的なグループ制御管理を実現する

定量取引の普及と発展に伴い、投資家は通常、多数の実口座を管理する必要があり、取引の意思決定、監視、実行に大きな課題が生じています。管理効率を向上させ、運用上の困難さを軽減するために、FMZ のトレーダーはグループ制御管理に FMZ の拡張 API を使用できます。この記事では、定量取引で FMZ 拡張 API を使用する利点と、効率的なグループ制御管理を実現する方法について説明します。

多くのユーザーは、管理および保守が必要な独自のクライアント アカウントを持っています。クライアント アカウントの数が多い場合は、より便利な管理および保守の方法が必要です (少なくとも 12 個、最大で数百個のアカウント)。 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 
}

function main() {
    var robotStatusCode = dicRobotStatusCode[arrIndexDesc[robotStatus]]
    var robotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, robotStatusCode)
    if (!robotList) {
        Log("获取实盘数据失败")
    }
    
    var robotTbl = {"type": "table", "title": "实盘列表", "cols": [], "rows": []}
    robotTbl.cols = ["实盘Id", "实盘名称", "实盘状态", "策略名称", "实盘收益"]

    _.each(robotList, function(robotInfo) {
        robotTbl.rows.push([robotInfo.id, robotInfo.name, descRobotStatusCode[robotInfo.status], robotInfo.strategy_name, robotInfo.profit])
    })

    LogStatus(_D(), "`" + JSON.stringify(robotTbl) + "`")
}

戦略パラメータ設計:

FMZの拡張APIを使用して定量取引における効率的なグループ制御管理を実現する

インタラクションデザイン:

FMZの拡張APIを使用して定量取引における効率的なグループ制御管理を実現する

実際のディスク操作:

FMZの拡張APIを使用して定量取引における効率的なグループ制御管理を実現する

ワンクリック実行

グループ制御管理により、ワンクリックでトランザクションを簡単に実行できます。異なる実際の注文を 1 つずつ開くことなく、複数の実際の注文に対して同時に購入、販売、ポジションのクローズなどの操作を行うことができます。これにより、実行効率が向上するだけでなく、操作エラーの可能性も低減されます。

リアルタイムリスト情報を取得した後、リアルタイム市場に指示を送信して、一連の所定の操作を実行できます。たとえば、リアルタイムの清算、リアルタイムの停止保護、リアルタイムのモード切り替えなどです。これらはFMZ APIを通じて拡張できるCommandRobot成し遂げる。

コードを書き続け、いくつかのインタラクションを追加し、メイン関数のAPIインターフェースを拡張するだけです。CommandRobot呼び出し:

function main() {
    var robotStatusCode = dicRobotStatusCode[arrIndexDesc[robotStatus]]
    var robotList = getAllRobotByIdAndStatus(accessKey, secretKey, strategyId, robotStatusCode)
    if (!robotList) {
        Log("获取实盘数据失败")
    }
    
    var robotTbl = {"type": "table", "title": "实盘列表", "cols": [], "rows": []}
    robotTbl.cols = ["实盘Id", "实盘名称", "实盘状态", "策略名称", "实盘收益"]

    _.each(robotList, function(robotInfo) {
        robotTbl.rows.push([robotInfo.id, robotInfo.name, descRobotStatusCode[robotInfo.status], robotInfo.strategy_name, robotInfo.profit])
    })

    LogStatus(_D(), "`" + JSON.stringify(robotTbl) + "`")

    while(true) {
        LogStatus(_D(), ", 等待接收交互命令", "\n", "`" + JSON.stringify(robotTbl) + "`")

        var cmd = GetCommand()
        if (cmd) {
            var arrCmd = cmd.split(":")
            if (arrCmd.length == 1 && cmd == "coverAll") {
                _.each(robotList, function(robotInfo) {
                    var strCmd = "清仓"               // 可以定义所需的消息格式
                    if (robotInfo.status != 1) {     // 只有”活着“的实盘才能接收命令
                        return 
                    }
                    var ret = callFmzExtAPI(accessKey, secretKey, "CommandRobot", parseInt(robotInfo.id), strCmd)
                    LogControl("向id:", robotInfo.id, "的实盘发送命令:", strCmd, ", 执行结果:", ret)
                })
            }
        }
        Sleep(1000)
    }
}

FMZの拡張APIを使用して定量取引における効率的なグループ制御管理を実現する

次に、グループ制御戦略は「テスト 1 A」と「テスト 1 B」に指示を送信しました。

FMZの拡張APIを使用して定量取引における効率的なグループ制御管理を実現する

FMZの拡張APIを使用して定量取引における効率的なグループ制御管理を実現する

ポリシーの同期

FMZ の拡張 API を使用すると、戦略パラメータを一括で簡単に変更し、実際の取引を一括で開始および停止できます。 記事が長いため、戦略パラメータを一括変更して開始する方法については、次の記事で詳しく説明します。

結論

定量取引では、グループ制御管理用の FMZ の拡張 API を使用することで、トレーダーは複数の実際のアカウントをより効率的に監視、実行、調整できます。この集中管理アプローチは、運用効率を向上させるだけでなく、リスク管理と戦略の同期をより適切に実装するのにも役立ちます。 多数のリアル口座を管理するトレーダーにとって、FMZ の拡張 API は強力で柔軟なツールを提供し、定量取引をより便利で制御しやすくします。