在频道上发布最新状态数据。该函数用于实盘间通信,可以将当前实盘的状态数据广播到频道上,供其他实盘订阅获取。
函数无返回值。 空值
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}