SetChannelData
在频道上发布最新状态数据。该函数用于实盘间通信,可以将当前实盘的状态数据广播到频道上,供其他实盘订阅获取。
SetChannelData(data)示例
-
频道广播端示例 - 发布市场行情数据
javascriptfunction main() { var updateId = 0 var robotId = _G() // 获取当前实盘ID while(true) { if (!exchange.IO("status")) { Sleep(1000) continue } // 获取实际市场价格 var ticker = exchange.GetTicker("rb888") if (!ticker) { Sleep(5000) continue } // 准备当前频道状态数据 var channelState = { robotId: robotId, updateId: ++updateId, timestamp: Date.now(), symbol: "rb888", lastPrice: ticker.Last, volume: ticker.Volume, high: ticker.High, low: ticker.Low } // 在频道上发布最新状态(覆盖旧状态) SetChannelData(channelState) // 显示当前频道状态 LogStatus("频道广播端 [实盘ID: " + robotId + "]\n" + "更新ID: #" + channelState.updateId + "\n" + "时间: " + _D(channelState.timestamp) + "\n" + "交易对: " + channelState.symbol + "\n" + "最新价: $" + channelState.lastPrice.toFixed(2) + "\n" + "成交量: " + channelState.volume.toFixed(4) + "\n" + "最高价: $" + channelState.high.toFixed(2) + "\n" + "最低价: $" + channelState.low.toFixed(2)) Sleep(60000) // 每分钟更新一次频道状态 } }pythondef main(): updateId = 0 robotId = _G() # 获取当前实盘ID while True: if not exchange.IO("status"): Sleep(1000) continue # 获取实际市场价格 ticker = exchange.GetTicker("rb888") if not ticker: Sleep(5000) continue # 准备当前频道状态数据 channelState = { "robotId": robotId, "updateId": updateId + 1, "timestamp": time.time() * 1000, "symbol": "rb888", "lastPrice": ticker["Last"], "volume": ticker["Volume"], "high": ticker["High"], "low": ticker["Low"] } updateId += 1 # 在频道上发布最新状态(覆盖旧状态) SetChannelData(channelState) # 显示当前频道状态 LogStatus("频道广播端 [实盘ID: {}]\n".format(robotId) + "更新ID: #{}\n".format(channelState["updateId"]) + "时间: {}\n".format(_D(channelState["timestamp"])) + "交易对: {}\n".format(channelState["symbol"]) + "最新价: ${:.2f}\n".format(channelState["lastPrice"]) + "成交量: {:.4f}\n".format(channelState["volume"]) + "最高价: ${:.2f}\n".format(channelState["high"]) + "最低价: ${:.2f}".format(channelState["low"])) Sleep(60000) # 每分钟更新一次频道状态c++ -
跨平台发送示例 - 模拟外部平台(如TradingView)向优宽量化实盘发送数据
javascript// 此示例演示如何使用HttpQuery发送HTTP POST请求,模拟外部平台向优宽量化实盘发送数据 // 实际场景中,外部平台(如TradingView的Webhook告警URL、第三方交易系统等)会直接调用优宽量化API端点 function main() { let uuid = "6BC42A119B5DBFA2188A8279DA3B5C30" let robotId = 123456 // 目标实盘ID(需要接收数据的实盘) let baseUrl = "https://www.youquant.com" while (true) { // 准备要发送的数据(可以是JSON、文本或其他格式) let sendData = { "action": "buy", "symbol": "rb888", "price": 3500, "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请求,模拟外部平台向优宽量化实盘发送数据 # 实际场景中,外部平台(如TradingView的Webhook告警URL、第三方交易系统等)会直接调用优宽量化API端点 import json def main(): uuid = "6BC42A119B5DBFA2188A8279DA3B5C30" robotId = 123456 # 目标实盘ID(需要接收数据的实盘) baseUrl = "https://www.youquant.com" while True: # 准备要发送的数据(可以是JSON、文本或其他格式) sendData = { "action": "buy", "symbol": "rb888", "price": 3500, "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秒发送一次c++
返回值
| 类型 | 描述 |
空值 | 函数无返回值。 |
参数
| 名称 | 类型 | 必填 | 描述 |
data | object / array / string / number / bool / 空值 | 是 | 需要发布到频道的数据,可以是任何可以 |
参考
备注
SetChannelData()函数是非阻塞调用,调用后立即返回,不会等待数据传输完成。
每个实盘都有一个独立的频道,频道ID即为实盘ID(可通过_G()函数获取)。
频道上只保存最新的状态数据,每次调用SetChannelData()会覆盖之前发布的数据,而非追加历史消息。
频道数据可以跨实盘、跨托管者、跨服务器进行广播,多个实盘可以订阅同一个频道。
订阅端使用GetChannelData()函数订阅频道数据。
频道通信适用于实盘环境,回测系统中该功能可能受限。
传入的数据参数data在JSON序列化后的字节长度不得超过1024字节,超出限制可能导致数据发布失败。建议仅传输必要的状态信息,避免传输过大的数据对象。
发布的数据应根据硬件设备的内存和网络带宽合理使用,避免发布过大的数据对象。
SetChannelData()函数发布的数据除了可以被优宽量化平台内的其他实盘订阅,还支持跨平台数据发送功能。外部平台(如TradingView的Webhook告警、第三方交易系统、监控软件等)可以通过HTTP POST请求向指定的优宽量化实盘发送数据。
**跨平台发送数据的方式:**外部系统通过HTTP POST请求发送数据到优宽量化平台API端点:https://www.youquant.com/api/v1?method=pub&robot={robotId}&channel={uuid},其中robotId为目标实盘ID,uuid为32位字符的频道标识符。发送的数据在请求body中传递,可以是JSON格式、文本或其他格式。注意:必须先有实盘订阅该UUID频道,外部系统才能成功发送数据;广播的数据会发送到robotId实盘所在托管者下的所有实盘,同一托管者下订阅了该UUID频道的实盘都可以接收数据。