使用 WV 插件 SDK¶
为了支持用户数据检索、交易执行、事件处理等功能,WebView 插件(客户端)必须与 cTrader 应用程序(主机)建立可靠的通信。 WebView 插件 SDK 促进了与 cTrader 的这些交互,本指南解释了客户端与主机之间的通信管道。
SDK 安装 ¶
WebView 插件 SDK 可作为 npm 包 使用。 要安装 SDK,请在终端窗口中导航到您的项目目录,然后运行以下命令:
npm install @spotware-web-team/sdk
客户端-主机同步 ¶
注意
相关协议可作为参考 消息。
在交换任何消息之前,必须建立通信通道。 典型操作包括:
-
在通信开始时,会进行存活事件交换,客户端和主机都会发送一个事件。
-
主机发送一个注册事件(
payloadType = 2000)。 示例:window.dispatchEvent(new MessageEvent('message-from-host', { data: {"clientMsgId": "152cf2d4-bfb6-4426-a303-9243b6a0daf4", "payload": {}, "payloadType": 2000} })) -
WebView 插件发送一个确认事件(
payloadType = 2001)。 示例:window.dispatchEvent(new MessageEvent('message-to-host', { data: {"clientMsgId": "152cf2d4-bfb6-4426-a303-9243b6a0daf4", "payload": {}, "payloadType": 2001} })) -
对于每个新的确认事件,都会发送一个新的注册事件以确保同步,即使插件重新初始化。
注意
如果任何一方未能接收到相应的存活事件,插件将不会挂载。 为了避免循环,插件必须仅发送一次确认事件并跟踪消息流。
警告
发送多个确认事件会触发重复的注册事件,可能导致意外的循环。
请求 ¶
一旦同步完成,插件可以通过调用与主机内部通信的 SDK 方法 与 cTrader 服务进行交互。
-
插件调用一个 SDK 方法。 例如,它可以请求用户的 账户信息。
-
WebView 插件发送一个请求。 示例:
{ "payloadType": 2100, "payload": { "payloadType": 175, "clientMsgId": "asd1-asd1" }, "clientMsgId": "asd2-asd2" }在内部,它设置了两个
clientMsgId字段(内部和外部):- 内部字段用于标识有效载荷中的特定请求,并由 cTrader 用于将该请求与其对应的响应和任何相关事件进行匹配。
- 外部字段(与内部字段一起使用时)跟踪客户端和主机之间的整体消息流。
-
主机监听请求:
window.addEventListener('message-to-host', function (event) {})
响应 ¶
-
主机分派响应:
window.dispatchEvent(new MessageEvent('message-from-host', { data }))每个响应都包含原始的
clientMsgId,以将其与请求关联。 响应基于以下结构:payloadType: 2101 clientMsgId: "<same-id-as-request>"实时或多个响应使用以下方式生成新事件:
payloadType: 2102 clientMsgId: "<same-id-as-request>" -
客户端监听响应:
window.addEventListener('message-from-host', function (event) {})
事件和订阅 ¶
WebView 插件可以订阅实时数据,例如 报价、交易更新、执行事件 等。
-
通过发送请求订阅报价数据:
{ "payloadType": 2100, // indicates a request "payload": { "payloadType": 601, "symbolId": ["EURUSD_ID"], "clientMsgId": "quote-sub-123" }, "clientMsgId": "asd2-asd2" // outer message ID } -
订阅触发主机发送定期响应:
{ "payloadType": 2102, // indicates an event "payload": { "payloadType": 3, // mapped to QUOTE_EVENT "payload": { "ask": 85274, "bid": 85271, "depth": [], "high": 85340, "low": 84932, "sessionClose": 85133, "symbolId": 9, "tickbar": [], "timestamp": 1750162811236, "trendbar": [] }, "clientMsgId": "asd1-asd1" // inner message ID }, "clientMsgId": "asd2-asd2" // outer message ID }
深度链接 ¶
插件可以通过发送以下请求要求 cTrader 打开一个深度链接(内部URL):
payloadType: 2103
clientMsgId: "<client-msg-id>"
然后插件会监听响应:
payloadType: 2104
clientMsgId: "<same-id-as-request>"
WebView 插件可以实现一个支持的深度链接,如下所示:
// Open EURUSD symbol overview
const openEURUSDInfo = useCallback(() => {
const url = baseUrl ? ${baseUrl}symbols/EURUSD/info : 'symbols/EURUSD/info';
openUrl(url);
}, [baseUrl, openUrl]);
消息摘要 ¶
下表总结了协议消息。
| 类型 | 负载类型 | 初始化 | 用例 |
|---|---|---|---|
| 生命周期/握手 | 2000(注册事件),2001(确认事件) | 需要初始化插件通信。 主机发送注册事件,插件响应确认事件。 | 通道设置、挂载、通信准备。 |
| 事件(单向) | 2102 | 服务器发起。 事件在没有客户端请求的情况下发送。 主机生成一个 clientMsgId;cTrader 后端包含另一个。 | 市场报价、交易执行更新、价格通知。 |
| 内部导航请求 | 2103 (OpenInternalUrlReq), 2104 (OpenInternalUrlRes) | 插件发起的请求,用于在 cTrader 应用内导航。 主机处理并通过配对的响应进行确认。 | 打开交易品种的概览,打开交易品种的订单界面。 |
| 请求/响应 | 2100 (req), 2101 (res) | 由插件发起。 用于单响应操作。 响应中重用了内部和外部 clientMsgId。 | 获取账户、交易品种或交易信息。 |
| 请求/多事件 | 2100(请求),然后多个 2102(事件) | 一个请求触发一系列相关事件。 事件重用原始的 clientMsgId(内部),主机生成新的事件 ID。 | 下订单,订阅命令后的更新。 |
| 错误响应 | 2500 (PublicErrorRes) | 主机或 cTrader 使用此响应报告处理请求的任何失败。 包括外部和内部 clientMsgId。 | 无效的有效载荷、未经授权的访问、格式错误的 SDK 请求。 |
错误处理 ¶
警告
常见的错误原因包括未知或未注册的插件、无效的请求格式以及服务器端验证失败。
如果出现问题,主机会发出结构化的错误响应:
payloadType: 2500
clientMsgId: <original-id>
{
"payloadType": 2500,
"clientMsgId": "<original-id>",
"error": "InvalidPayload"
}
SDK 会处理错误并将其呈现给插件创建者。