SetChannelData

在频道上发布最新状态数据。该函数用于实盘间通信,可以将当前实盘的状态数据广播到频道上,供其他实盘订阅获取。

函数无返回值。 空值

SetChannelData(data)

需要发布到频道的数据,可以是任何可以JSON序列化的数据结构,通常为包含实盘状态信息的对象。 data true object / array / string / number / bool / 空值

function main() {
    var updateId = 0
    var robotId = _G()  // 获取当前实盘ID

    while(true) {
        // 获取实际市场价格
        var ticker = exchange.GetTicker("BTC_USDT")
        if (!ticker) {
            Sleep(5000)
            continue
        }

        // 准备当前频道状态数据
        var channelState = {
            robotId: robotId,
            updateId: ++updateId,
            timestamp: Date.now(),
            symbol: "BTC_USDT",
            lastPrice: ticker.Last,
            volume: ticker.Volume,
            high: ticker.High,
            low: ticker.Low
        }

        // 在频道上发布最新状态(覆盖旧状态)
        SetChannelData(channelState)

        // 显示当前频道状态
        LogStatus("Channel Broadcaster [Bot ID: " + robotId + "]\n" +
                  "Update ID: #" + channelState.updateId + "\n" +
                  "Time: " + _D(channelState.timestamp) + "\n" +
                  "Symbol: " + channelState.symbol + "\n" +
                  "Last Price: $" + channelState.lastPrice.toFixed(2) + "\n" +
                  "Volume: " + channelState.volume.toFixed(4) + "\n" +
                  "High: $" + channelState.high.toFixed(2) + "\n" +
                  "Low: $" + channelState.low.toFixed(2))

        Sleep(60000)  // 每分钟更新一次频道状态
    }
}```
```python
def main():
    updateId = 0
    robotId = _G()  # 获取当前实盘ID

    while True:
        # 获取实际市场价格
        ticker = exchange.GetTicker("BTC_USDT")
        if not ticker:
            Sleep(5000)
            continue

        # 准备当前频道状态数据
        channelState = {
            "robotId": robotId,
            "updateId": updateId + 1,
            "timestamp": time.time() * 1000,
            "symbol": "BTC_USDT",
            "lastPrice": ticker["Last"],
            "volume": ticker["Volume"],
            "high": ticker["High"],
            "low": ticker["Low"]
        }
        updateId += 1

        # 在频道上发布最新状态(覆盖旧状态)
        SetChannelData(channelState)

        # 显示当前频道状态
        LogStatus("Channel Broadcaster [Bot ID: {}]\n".format(robotId) +
                  "Update ID: #{}\n".format(channelState["updateId"]) +
                  "Time: {}\n".format(_D(channelState["timestamp"])) +
                  "Symbol: {}\n".format(channelState["symbol"]) +
                  "Last Price: ${:.2f}\n".format(channelState["lastPrice"]) +
                  "Volume: {:.4f}\n".format(channelState["volume"]) +
                  "High: ${:.2f}\n".format(channelState["high"]) +
                  "Low: ${:.2f}".format(channelState["low"]))

        Sleep(60000)  # 每分钟更新一次频道状态```
```cpp

频道广播端示例 - 发布BTC价格行情数据

// 此示例演示如何使用HttpQuery发送HTTP POST请求,模拟外部平台向FMZ实盘发送数据
// 实际场景中,外部平台(如TradingView的Webhook告警URL、第三方交易系统等)会直接调用FMZ API端点

function main() {
    let uuid = "6BC42A119B5DBFA2188A8279DA3B5C30"
    let robotId = 123456  // 目标实盘ID(需要接收数据的实盘)
    let baseUrl = "https://www.fmz.com"

    while (true) {
        // 准备要发送的数据(可以是JSON、文本或其他格式)
        let sendData = {
            "action": "buy",
            "symbol": "BTC_USDT",
            "price": 50000,
            "timestamp": Date.now()
        }

        // 构造HTTP POST请求
        let options = {
            method: "POST",
            body: JSON.stringify(sendData)  // body可以是JSON字符串、普通文本等
        }
        let url = `${baseUrl}/api/v1?method=pub&robot=${robotId}&channel=${uuid}`

        // 发送数据
        let ret = HttpQuery(url, options)
        Log("Simulated external platform sending data, result:", ret)

        Sleep(10000)  // 每10秒发送一次
    }
}```
```python
# 此示例演示如何使用HttpQuery发送HTTP POST请求,模拟外部平台向FMZ实盘发送数据
# 实际场景中,外部平台(如TradingView的Webhook告警URL、第三方交易系统等)会直接调用FMZ API端点

import json

def main():
    uuid = "6BC42A119B5DBFA2188A8279DA3B5C30"
    robotId = 123456  # 目标实盘ID(需要接收数据的实盘)
    baseUrl = "https://www.fmz.com"

    while True:
        # 准备要发送的数据(可以是JSON、文本或其他格式)
        sendData = {
            "action": "buy",
            "symbol": "BTC_USDT",
            "price": 50000,
            "timestamp": time.time() * 1000
        }

        # 构造HTTP POST请求
        options = {
            "method": "POST",
            "body": json.dumps(sendData)  # body可以是JSON字符串、普通文本等
        }
        url = "{}/api/v1?method=pub&robot={}&channel={}".format(baseUrl, robotId, uuid)

        # 发送数据
        ret = HttpQuery(url, options)
        Log("Simulated external platform sending data, result:", ret)

        Sleep(10000)  # 每10秒发送一次```
```cpp

跨平台发送示例 - 模拟外部平台(如TradingView)向FMZ实盘发送数据

SetChannelData()函数是非阻塞调用,调用后立即返回,不会等待数据传输完成。 每个实盘都有一个独立的频道,频道ID即为实盘ID(可通过_G()函数获取)。 频道上只保存最新的状态数据,每次调用SetChannelData()会覆盖之前发布的数据,而非追加历史消息。 频道数据可以跨实盘、跨托管者、跨服务器进行广播,多个实盘可以订阅同一个频道。 订阅端使用GetChannelData()函数订阅频道数据。 频道通信适用于实盘环境,回测系统中该功能可能受限。 传入的数据参数data在JSON序列化后的字节长度不得超过1024字节,超出限制可能导致数据发布失败。建议仅传输必要的状态信息,避免传输过大的数据对象。 发布的数据应根据硬件设备的内存和网络带宽合理使用,避免发布过大的数据对象。 SetChannelData()函数发布的数据除了可以被FMZ平台内的其他实盘订阅外,还支持跨平台数据发送功能。外部平台(如TradingView的Webhook告警、第三方交易系统、监控软件等)可以通过HTTP POST请求向指定的FMZ实盘发送数据。 跨平台发送数据的方式:外部系统通过HTTP POST请求发送数据到FMZ平台API端点:https://www.fmz.com/api/v1?method=pub&robot={robotId}&channel={uuid},其中robotId为目标实盘ID,uuid为32位字符的频道标识符。发送的数据在请求body中传递,可以是JSON格式、文本或其他格式。注意:必须先有实盘订阅该UUID频道,外部系统才能成功发送数据;广播的数据会发送到robotId实盘所在托管者下的所有实盘,同一托管者下订阅了该UUID频道的实盘都可以接收数据。

{@fun/Global/GetChannelData GetChannelData} {@fun/Global/G _G}