Saltar a contenido

Usar SDK de plugins WV

Para permitir la recuperación de datos de usuario, la ejecución de operaciones, la gestión de eventos, etc., un plugin de WebView (cliente) debe establecer una comunicación fiable con la aplicación de cTrader (host). El SDK de plugins de WebView facilita estas interacciones con cTrader. En esta guía se explica el proceso de comunicación entre cliente y host.

Instalación del SDK

El SDK de plugins WebView está disponible como paquete npm. Para instalar el SDK, navegue hasta el directorio de su proyecto en una ventana del terminal y ejecute este comando:

npm install @spotware-web-team/sdk

Sincronización cliente-host

Nota

Los protocolos pertinentes están disponibles como mensajes de referencia.

Antes de proceder a intercambiar mensajes, debe establecer un canal de comunicación. Las operaciones típicas incluyen:

  1. Al inicio de la comunicación, se produce un intercambio de eventos activos en el que tanto el cliente como el host envían un evento.

  2. El host envía un evento de registro (payloadType = 2000). Ejemplo:

    window.dispatchEvent(new MessageEvent('message-from-host', { data: {"clientMsgId": "152cf2d4-bfb6-4426-a303-9243b6a0daf4", "payload": {}, "payloadType": 2000} }))
    
  3. El plugin de WebView envía un evento de confirmación (payloadType = 2001). Ejemplo:

    window.dispatchEvent(new MessageEvent('message-to-host', { data: {"clientMsgId": "152cf2d4-bfb6-4426-a303-9243b6a0daf4", "payload": {}, "payloadType": 2001} }))
    
  4. Para cada nuevo evento de confirmación, se envía un nuevo evento de registro para garantizar la sincronización, aunque se reinicialice el plugin.

    Nota

    Si alguna de las partes no recibe el evento activo correspondiente, el plugin no se montará. Para evitar bucles, el plugin debe enviar el evento de confirmación solo una vez y llevar un seguimiento del flujo de mensajes.

    Advertencia

    El envío de múltiples eventos de confirmación activa eventos de registro repetidos, que pueden dar lugar a un bucle no deseado.

Solicitudes

Una vez completada la sincronización, el plugin puede interactuar con los servicios de cTrader llamando a métodos SDK que se comunican internamente con el host.

  1. El plugin llama a un método SDK. Por ejemplo, puede solicitar la información de la cuenta de un usuario.

  2. El plugin de WebView envía una solicitud. Ejemplo:

    {
      "payloadType": 2100,
      "payload": {
        "payloadType": 175,
        "clientMsgId": "asd1-asd1"
      },
      "clientMsgId": "asd2-asd2"
    }
    

    Internamente, establece dos campos clientMsgId (interno y externo):

    • El interno identifica la solicitud específica dentro de la carga útil y cTrader lo utiliza para emparejar esa solicitud con su respuesta correspondiente, así como con eventos relacionados.
    • El externo (cuando se usa junto con el interno) lleva el seguimiento del flujo general de mensajes entre cliente y host.
  3. El host escucha las solicitudes:

    window.addEventListener('message-to-host', function (event) {})
    

Nota

Todos los métodos SDK para enviar solicitudes y recibir respuestas están disponibles como mensajes del servidor de referencia, mientras que los detalles sobre los campos repetidos dentro de las solicitudes y respuestas se proporcionan como modelos.

Respuestas

  1. El host envía una respuesta:

    window.dispatchEvent(new MessageEvent('message-from-host', { data }))
    

    Cada respuesta incluye el clientMsgId original para vincularlo con la solicitud. La respuesta se basa en esta estructura:

    payloadType: 2101 
    clientMsgId: "<same-id-as-request>"
    

    Las respuestas en tiempo real o múltiples generan nuevos eventos mediante:

    payloadType: 2102
    clientMsgId: "<same-id-as-request>"
    
  2. El cliente escucha la respuesta:

    window.addEventListener('message-from-host', function (event) {})
    

Eventos y suscripciones

Los plugins de WebView pueden suscribirse a datos en tiempo real como cotizaciones, actualizaciones de operaciones, eventos de ejecución y más.

  1. Suscríbase a datos de cotización mediante una solicitud:

    {
      "payloadType": 2100, // indicates a request
      "payload": {
        "payloadType": 601,
        "symbolId": ["EURUSD_ID"],
        "clientMsgId": "quote-sub-123"
      },
      "clientMsgId": "asd2-asd2" // outer message ID
    }
    
  2. La suscripción activa el envío periódico de respuestas por parte del host:

    {
      "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
    }
    

Enlaces profundos

Un plugin puede solicitar a cTrader que abra un enlace profundo (URL interna) mediante esta solicitud:

payloadType: 2103
clientMsgId: "<client-msg-id>"

El plugin luego escucha para conocer la respuesta:

payloadType: 2104
clientMsgId: "<same-id-as-request>"

Los plugins de WebView pueden implementar un enlace profundo compatible como se demuestra a continuación:

// Open EURUSD symbol overview
  const openEURUSDInfo = useCallback(() => {
      const url = baseUrl ? ${baseUrl}symbols/EURUSD/info : 'symbols/EURUSD/info';
      openUrl(url);
  }, [baseUrl, openUrl]);

Resumen de mensajes

La tabla a continuación resume los mensajes del protocolo.

Tipo Tipos de carga útil Iniciación Casos de uso
Ciclo de vida/protocolo de enlace 2000 (evento de registro),2001 (evento de confirmación) Requerido para inicializar la comunicación del plugin. El host envía un evento de registro, el plugin responde con un evento de confirmación. Configuración del canal, montaje, preparación para la comunicación.
Evento (unidireccional) 2102 Iniciado por el servidor. Eventos enviados sin solicitud previa del cliente. El host genera un clientMsgId; el backend de cTrader incluye otro. Cotizaciones de mercado, actualizaciones de ejecución de operaciones, notificaciones de precio.
Solicitud de navegación interna 2103 (OpenInternalUrlReq), 2104 (OpenInternalUrlRes) Solicitud iniciada por el plugin para navegar dentro de la aplicación de cTrader. El host procesa y confirma mediante respuesta emparejada. Abrir la página general de un símbolo, abrir la pantalla de órdenes de un símbolo.
Solicitud/respuesta 2100 (req), 2101 (res) Iniciado por el plugin. Usado para operaciones de respuesta única. Tanto el clientMsgId interno como el externo se reutilizan en la respuesta. Obtener información de una cuenta, símbolo u operación.
Solicitud/múltiples eventos 2100 (solicitud), luego múltiples 2102 (eventos) Una solicitud desencadena un flujo de eventos relacionados. Los eventos reutilizan el clientMsgId original (interno), y el host genera nuevos identificadores de evento. Colocar una orden, suscribirse a actualizaciones después de un comando.
Respuesta de error 2500 (PublicErrorRes) El host o cTrader lo utiliza para informar de cualquier fallo al procesar una solicitud. Incluye clientMsgId externo e interno. Carga útil no válida, acceso no autorizado, solicitud SDK mal formada.

Manejo de errores

Advertencia

Las razones comunes de errores incluyen plugins desconocidos o no registrados, formatos de solicitud no válidos y fallos de validación del lado del servidor.

Si algo sale mal, el host emite una respuesta de error estructurada:

payloadType: 2500 
clientMsgId: <original-id>
{
  "payloadType": 2500,
  "clientMsgId": "<original-id>",
  "error": "InvalidPayload"
}

El SDK maneja el error y lo muestra al creador del plugin.