Utilizar o SDK de plugins WV¶
Para suportar a recuperação de dados do utilizador, a execução de negociações, a gestão de eventos e mais, um plugin WebView (cliente) deve estabelecer uma comunicação fiável com a aplicação cTrader (host). O SDK de plugins WebView facilita estas interações com o cTrader, e este guia explica o pipeline de comunicação entre o cliente e o anfitrião.
Instalação do SDK ¶
O SDK de plugins WebView está disponível como um pacote npm. Para instalar o SDK, aceda ao diretório do seu projeto numa janela de terminal e execute este comando:
npm install @spotware-web-team/sdk
Sincronização cliente-anfitrião¶
Nota
Os protocolos relevantes estão disponíveis como referência mensagens.
Para que qualquer mensagem possa ser trocada, deve ser estabelecido um canal de comunicação. As operações típicas incluem:
-
No início da comunicação, ocorre uma troca de eventos ativa, onde tanto o cliente como o anfitrião enviam um evento.
-
O anfitrião envia um evento de registo (
payloadType = 2000). Exemplo:window.dispatchEvent(new MessageEvent('message-from-host', { data: {"clientMsgId": "152cf2d4-bfb6-4426-a303-9243b6a0daf4", "payload": {}, "payloadType": 2000} })) -
O plugin WebView envia um evento de confirmação (
payloadType = 2001). Exemplo:window.dispatchEvent(new MessageEvent('message-to-host', { data: {"clientMsgId": "152cf2d4-bfb6-4426-a303-9243b6a0daf4", "payload": {}, "payloadType": 2001} })) -
Para cada novo evento de confirmação, é enviado um novo evento de registo para assegurar a sincronização, mesmo que o plugin reinicialize.
Nota
Se qualquer uma das partes não receber o evento ativo correspondente, o plugin não será montado. Para evitar loops, o plugin deve enviar o evento de confirmação apenas uma vez e monitorizar o fluxo de mensagens.
Aviso
O envio de múltiplos eventos de confirmação desencadeia eventos de registo repetidos, o que pode resultar num loop não intencional.
Pedidos ¶
Após a conclusão da sincronização, o plugin pode interagir com os serviços cTrader chamando métodos SDK que comunicam internamente com o anfitrião.
-
O plugin executa um método SDK. Por exemplo, pode solicitar informações da conta de um utilizador.
-
O plugin WebView envia um pedido. Exemplo:
{ "payloadType": 2100, "payload": { "payloadType": 175, "clientMsgId": "asd1-asd1" }, "clientMsgId": "asd2-asd2" }Internamente, define dois campos
clientMsgId(interno e externo):- O campo interno identifica o pedido específico dentro do payload e é usado pelo cTrader para corresponder esse pedido com a sua resposta correspondente e quaisquer eventos relacionados.
- O campo externo (quando usado junto com o interno) monitoriza o fluxo geral de mensagens entre o cliente e o anfitrião.
-
O anfitrião escuta os pedidos:
window.addEventListener('message-to-host', function (event) {})
Nota
Todos os métodos SDK para enviar pedidos e receber respostas estão disponíveis como referência mensagens do servidor, enquanto os detalhes sobre os campos repetidos dentro dos pedidos e respostas são fornecidos como modelos.
Respostas ¶
-
O anfitrião envia uma resposta:
window.dispatchEvent(new MessageEvent('message-from-host', { data }))Cada resposta inclui o
clientMsgIdoriginal para a ligar ao pedido. A resposta é baseada na estrutura seguinte:payloadType: 2101 clientMsgId: "<same-id-as-request>"Respostas em tempo real ou múltiplas geram novos eventos usando:
payloadType: 2102 clientMsgId: "<same-id-as-request>" -
O cliente escuta a resposta:
window.addEventListener('message-from-host', function (event) {})
Eventos e subscrições ¶
Os plugins WebView podem subscrever dados em tempo real como cotações, atualizações de negociações, eventos de execução e mais.
-
Subscreva dados de cotação enviando um pedido:
{ "payloadType": 2100, // indicates a request "payload": { "payloadType": 601, "symbolId": ["EURUSD_ID"], "clientMsgId": "quote-sub-123" }, "clientMsgId": "asd2-asd2" // outer message ID } -
A subscrição faz com que o anfitrião envie respostas periódicas:
{ "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 }
Deeplinks ¶
Um plugin pode pedir ao cTrader para abrir um deeplink (URL interno) enviando este pedido:
payloadType: 2103
clientMsgId: "<client-msg-id>"
Em seguida, o plugin aguarda por uma resposta:
payloadType: 2104
clientMsgId: "<same-id-as-request>"
Os plugins WebView podem implementar um deeplink suportado como demonstrado abaixo:
// Open EURUSD symbol overview
const openEURUSDInfo = useCallback(() => {
const url = baseUrl ? ${baseUrl}symbols/EURUSD/info : 'symbols/EURUSD/info';
openUrl(url);
}, [baseUrl, openUrl]);
Resumo das mensagens ¶
A tabela abaixo resume as mensagens do protocolo.
| Tipo | Tipos de payload | Iniciação | Casos de uso |
|---|---|---|---|
| Ciclo de vida/handshake | 2000 (evento de registo),2001 (evento de confirmação) | Necessário para inicializar a comunicação do plugin. O anfitrião envia um evento de registo, o plugin responde com um evento de confirmação. | Configuração do canal, montagem, prontidão da comunicação. |
| Evento (unidirecional) | 2102 | Iniciado pelo servidor. Eventos enviados sem um pedido prévio do cliente. O anfitrião gera um clientMsgId; o backend do cTrader inclui outro. | Cotações de mercado, atualizações de execução de negociações, notificações de preço. |
| Pedido de navegação interna | 2103 (OpenInternalUrlReq), 2104 (OpenInternalUrlRes) | Pedido iniciado pelo plugin para navegar dentro da aplicação cTrader. O anfitrião processa e confirma através de resposta emparelhada. | Abrir visão geral de um símbolo, abrir ecrã de ordem para um símbolo. |
| Pedido/resposta | 2100 (req), 2101 (res) | Iniciado pelo plugin. Usado para operações de resposta única. Tanto o clientMsgId interno como o externo são reutilizados na resposta. | Obter informações de conta, símbolo ou negociação. |
| Pedido/multievento | 2100 (req), depois múltiplos 2102 (eventos) | Um pedido desencadeia um fluxo de eventos relacionados. Os eventos reutilizam o clientMsgId original (interno), e são gerados novos ID de evento pelo anfitrião. | Colocar uma ordem, subscrever atualizações após um comando. |
| Resposta de erro | 2500 (PublicErrorRes) | Utilizada pelo anfitrião ou pelo cTrader para reportar qualquer falha no processamento de um pedido. Inclui clientMsgId externo e interno. | Payload inválido, acesso não autorizado, pedido SDK formado inoorretamente. |
Gestão de erros ¶
Aviso
Razões comuns para erros incluem plugin desconhecido ou não registado, formato de pedido inválido e falha de validação do lado do servidor.
Se ocorrer um erro, o anfitrião emite uma resposta de erro estruturada:
payloadType: 2500
clientMsgId: <original-id>
{
"payloadType": 2500,
"clientMsgId": "<original-id>",
"error": "InvalidPayload"
}
O SDK processa o erro e apresenta-o ao criador do plugin.