输入/搜索内容
内置函数
Global
Log
Market
Trade
Account
Futures
Exchange
IO
Network
Storage
_G
DBExec
SetChannelData
GetChannelData
Threads
TA
Talib
OS
结构体
内置变量与常量
通用约定
交易所

订阅指定实盘的频道数据。该函数用于实盘间通信,可以获取其他实盘通过SetChannelData()函数发布的最新状态数据。

GetChannelData(channelId)

示例

  • 每5秒读取另一个实盘频道发布的最新价。

    javascript
    function main() { var channelId = "632799" // 发布数据的实盘ID while (true) { var state = GetChannelData(channelId) // 非阻塞调用:首次调用或对方还没有发布时为null if (state) { Log(state.symbol, "最新价", state.last) } Sleep(5000) } }
    python
    def main(): channelId = "632799" # 发布数据的实盘ID while True: state = GetChannelData(channelId) # 非阻塞调用:首次调用或对方还没有发布时为None if state: Log(state["symbol"], "最新价", state["last"]) Sleep(5000)
    rust
    fn main() { let channelId = "632799"; // 发布数据的实盘ID loop { // Rust 读取指定实盘的频道用 GetChannelDataOf;首次调用或对方还没有发布时为null let state = GetChannelDataOf(channelId); if !state.is_null() { Log!(state["symbol"].clone(), "最新价", state["last"].clone()); } Sleep(5000); } }
  • 频道订阅端示例 - 订阅两个实盘的频道数据

    javascript
    function main() { // 需要订阅的两个频道ID(根据实际情况修改) var channelId1 = "632799" // 频道1的实盘ID var channelId2 = "632800" // 频道2的实盘ID while(true) { // 订阅频道1的当前状态 var state1 = GetChannelData(channelId1) // 订阅频道2的当前状态 var state2 = GetChannelData(channelId2) // 构建状态显示 var statusMsg = "频道订阅端 - 当前订阅状态\n\n" // 显示频道1状态 statusMsg += "═══ 频道1 [" + channelId1 + "] ═══\n" if (state1 !== null) { statusMsg += "更新ID: #" + state1.updateId + "\n" statusMsg += "时间: " + _D(state1.timestamp) + "\n" statusMsg += "交易对: " + state1.symbol + "\n" statusMsg += "最新价: $" + state1.lastPrice.toFixed(2) + "\n" statusMsg += "成交量: " + state1.volume.toFixed(4) + "\n" } else { statusMsg += "状态: 等待中... (首次调用返回 null)\n" } statusMsg += "\n" // 显示频道2状态 statusMsg += "═══ 频道2 [" + channelId2 + "] ═══\n" if (state2 !== null) { statusMsg += "更新ID: #" + state2.updateId + "\n" statusMsg += "时间: " + _D(state2.timestamp) + "\n" statusMsg += "交易对: " + state2.symbol + "\n" statusMsg += "最新价: $" + state2.lastPrice.toFixed(2) + "\n" statusMsg += "成交量: " + state2.volume.toFixed(4) + "\n" } else { statusMsg += "状态: 等待中... (首次调用返回 null)\n" } LogStatus(statusMsg) Sleep(5000) // 每5秒订阅一次频道 } }
    python
    def main(): # 需要订阅的两个频道ID(根据实际情况修改) channelId1 = "632799" # 频道1的实盘ID channelId2 = "632800" # 频道2的实盘ID while True: # 订阅频道1的当前状态 state1 = GetChannelData(channelId1) # 订阅频道2的当前状态 state2 = GetChannelData(channelId2) # 构建状态显示 statusMsg = "频道订阅端 - 当前订阅状态\n\n" # 显示频道1状态 statusMsg += "═══ 频道1 [{}] ═══\n".format(channelId1) if state1 is not None: statusMsg += "更新ID: #{}\n".format(state1["updateId"]) statusMsg += "时间: {}\n".format(_D(state1["timestamp"] / 1000)) statusMsg += "交易对: {}\n".format(state1["symbol"]) statusMsg += "最新价: ${:.2f}\n".format(state1["lastPrice"]) statusMsg += "成交量: {:.4f}\n".format(state1["volume"]) else: statusMsg += "状态: 等待中... (首次调用返回 None)\n" statusMsg += "\n" # 显示频道2状态 statusMsg += "═══ 频道2 [{}] ═══\n".format(channelId2) if state2 is not None: statusMsg += "更新ID: #{}\n".format(state2["updateId"]) statusMsg += "时间: {}\n".format(_D(state2["timestamp"] / 1000)) statusMsg += "交易对: {}\n".format(state2["symbol"]) statusMsg += "最新价: ${:.2f}\n".format(state2["lastPrice"]) statusMsg += "成交量: {:.4f}\n".format(state2["volume"]) else: statusMsg += "状态: 等待中... (首次调用返回 None)\n" LogStatus(statusMsg) Sleep(5000) # 每5秒订阅一次频道
    rust
    fn main() { // 需要订阅的两个频道ID(根据实际情况修改) // Rust 中读取指定频道使用 GetChannelDataOf(channelId);无参的 GetChannelData() 读取本实盘自身的频道 let channelIds = ["632799", "632800"]; // 频道1、频道2的实盘ID loop { // 构建状态显示 let mut statusMsg = String::from("频道订阅端 - 当前订阅状态\n\n"); for (i, channelId) in channelIds.iter().enumerate() { // 订阅频道的当前状态 let state = GetChannelDataOf(*channelId); statusMsg += &format!("═══ 频道{} [{}] ═══\n", i + 1, channelId); if !state.is_null() { statusMsg += &format!("更新ID: #{}\n", state["updateId"].as_i64().unwrap_or(0)); statusMsg += &format!("时间: {}\n", _D(state["timestamp"].as_i64().unwrap_or(0))); statusMsg += &format!("交易对: {}\n", state["symbol"].as_str().unwrap_or("")); statusMsg += &format!("最新价: ${:.2}\n", state["lastPrice"].as_f64().unwrap_or(0.0)); statusMsg += &format!("成交量: {:.4}\n", state["volume"].as_f64().unwrap_or(0.0)); } else { statusMsg += "状态: 等待中... (首次调用返回 null)\n"; } statusMsg += "\n"; } LogStatus!(statusMsg); Sleep(5000); // 每5秒订阅一次频道 } }
  • 跨平台订阅示例 - 使用UUID订阅外部系统发送的数据

    javascript
    function main() { // 使用32位UUID作为频道标识符 let uuid = "6BC42A119B5DBFA2188A8279DA3B5C30" while (true) { // 订阅UUID频道的数据 let data = GetChannelData(uuid) if (data !== null) { Log("Received cross-platform data:", data) } else { Log("Waiting for data... (first call returns null)") } Sleep(10000) // 每10秒检查一次 } }
    python
    def main(): # 使用32位UUID作为频道标识符 uuid = "6BC42A119B5DBFA2188A8279DA3B5C30" while True: # 订阅UUID频道的数据 data = GetChannelData(uuid) if data is not None: Log("Received cross-platform data:", data) else: Log("Waiting for data... (first call returns None)") Sleep(10000) # 每10秒检查一次
    rust
    fn main() { // 使用32位UUID作为频道标识符,Rust 中读取指定频道使用 GetChannelDataOf() let uuid = "6BC42A119B5DBFA2188A8279DA3B5C30"; loop { // 订阅UUID频道的数据 let data = GetChannelDataOf(uuid); if !data.is_null() { Log!("Received cross-platform data:", data); } else { Log!("Waiting for data... (first call returns null)"); } Sleep(10000); // 每10秒检查一次 } }

返回值

类型描述

object / array / string / number / bool / 空值

返回订阅频道的最新状态数据。首次调用返回null,需要重试。数据结构由广播端发布的数据决定。

参数

名称类型必填描述

channelId

string / number

是

频道标识:其它实盘的实盘ID(实盘间通信,实盘ID可以用_G()获取),或32位UUID(订阅外部系统通过HTTP API发送到平台的数据)。

参考

备注

GetChannelData()函数是非阻塞调用,调用后立即返回,不会等待数据接收完成。

首次调用GetChannelData()函数时会返回null,需要重试等待频道数据同步完成。

每次调用获取的都是频道上的最新状态数据,不是历史消息队列。

一个实盘可以同时订阅多个不同实盘的频道,只需多次调用GetChannelData()并传入不同的实盘ID。

每个实盘最多订阅10个不同的频道(实盘ID频道与UUID频道合计),第一次读取某个频道即为订阅该频道。超过上限时该次调用返回空值,并记录一条错误日志channel subscriber exceed limit,策略不会中止。

当前实盘也可以订阅自己的频道,即robotId参数可以是当前实盘ID。

频道数据可以跨实盘、跨托管者、跨服务器进行传输。

广播端使用SetChannelData()函数发布频道数据。

Rust中读取指定频道使用GetChannelDataOf(channelId),无参的GetChannelData()读取本实盘自身的频道。

频道通信适用于实盘环境,回测系统中该功能可能受限。

GetChannelData()函数支持跨平台订阅功能。使用32位UUID作为频道标识符时,可以接收来自FMZ平台外部系统通过HTTP API发送的数据。外部系统需要指定实盘ID和UUID才能发送数据,同一托管者下的所有实盘都可以订阅到该UUID频道的数据,不同托管者的实盘无法订阅。