¿Bibliotecas de gráficos Java adecuadas para gráficos de acciones en tiempo real?

Estoy en el proceso de planificación de una aplicación basada en Java que se utiliza para la transmisión en vivo/comercio de gráficos bursátiles/forex, etc. Sin embargo, no estoy seguro de qué biblioteca de gráficos es la adecuada para el trabajo.

Básicamente, la funcionalidad de gráficos debe ser la misma que en cualquier software comercial, como:

  • Gráficos de velas y/o gráficos de barras OHLC, gráficos de líneas
  • Superponerlos con otros gráficos (también conocido como trazar un promedio móvil o similar sobre el gráfico de velas japonesas)
  • El usuario debe poder agregar líneas u otros objetos al gráfico
  • Mostrar 2 gráficos, por ejemplo, para mostrar el volumen debajo del gráfico principal
  • Ampliar el gráfico**
  • Desplazamiento/panorámica horizontal**
  • Ajuste automático del eje Y durante el desplazamiento/panorámica
  • Actualización del gráfico cuando llegan nuevos datos (ocurre en intervalos aleatorios de ms), que no solo incluye un nuevo punto de datos de OHLC que se agregará, sino también para actualizar el último punto de datos de OHLC si llegan nuevos datos antes de que el período de tiempo indique un nuevo dato punto**
  • interacción con el gráfico, como resaltar un objeto al que apunta el mouse***
  • devolviendo coordenadas, que se pueden usar para obtener la información de los puntos de datos, o directamente obtener su información (datos OHLC, marca de tiempo)

** también se puede hacer creando un nuevo gráfico cada vez que se realiza una acción del usuario en lugar de dejar que la biblioteca de gráficos haga el trabajo; sin embargo, solo es viable si es rápido; consulte los requisitos de rendimiento.

*** Agradable pero no obligatorio.

Para que quede claro, no estoy buscando una biblioteca mágica que lo haga todo por mí. No tengo ningún problema con escribir código para obtener mi conjunto completo de funciones. Sin embargo, algunas funciones solo pueden implementarse de manera confiable mediante la propia biblioteca (como la transformación de las coordenadas del gráfico con un clic del mouse en los puntos de datos correctos, ya que esas coordenadas dependen del tamaño de las etiquetas x e y, lo que significa que la estimación sería un mal enfoque). ), otras características, cuando se agregan, aún deben ser lo suficientemente rápidas. Dependiendo de la biblioteca, esto puede no ser posible.

El rendimiento es un factor clave. Ya he hecho la mayor parte de esta codificación en python, usando matplotlib. Sin embargo, cuantas más velas hay en el gráfico, más lento se vuelve, hasta el punto en que el uso de múltiples gráficos con suficientes datos en cada gráfico hace que las actualizaciones en intervalos de milisegundos sean imposibles en tiempo real, a pesar de los largos esfuerzos para optimizar el código. Además, ese código está restringido a un núcleo (gracias a python GIL), sin importar cuántos gráficos. Entonces, es comprensible que esté buscando desesperadamente una solución rápida y cambié a Java. Entonces, digamos que tener 10 gráficos abiertos al mismo tiempo, con unos pocos cientos de puntos de datos OHLC, todas las actualizaciones a la vez no deberían causar un impacto importante en el rendimiento, apenas perceptible para el ojo humano. Esto es algo que se puede hacer usando java, como muestran varios proyectos comerciales (clientes Java de Oanda y Dukascopy, por ejemplo).

La pregunta es, ¿qué biblioteca está lista para la tarea? jFreeChart? ¿JavaFX trazando directamente? ¿Otras opciones?

¿Alguien sabe qué bibliotecas utilizan los proyectos comerciales?

Respuestas (2)

Cartas de Vaadin

Si desea una solución de aplicación web escrita en Java puro pero renderizada automáticamente en un navegador web con tecnologías de estándares web HTML5 , le sugiero que consulte Vaadin Framework (de código abierto, sin costo) más el complemento Vaadin Charts ( comercial).

El complemento Vaadin Charts es un envoltorio de Java (que se invoca en el lado del servidor) que envuelve la biblioteca HighCharts integrada en JavaScript (que se usa en el lado del cliente para representar el gráfico, pero de forma transparente para el programador de Java). Entonces, casi todo lo que HighCharts puede hacer a través de JavaScript también lo puede hacer Vaadin Charts a través de llamadas Java. Y

Con Vaadin Charts, obtiene lo mejor de ambos mundos: (a) toda la potencia de Java y sus muchas bibliotecas, JDBC , escritura estática, velocidad, confiabilidad y demás, junto con (b) dibujo de alto rendimiento del gráfico dentro el navegador localmente usando JavaScript.

No sé si Vaadin Charts satisface todas sus necesidades, pero proporciona gráficos de velas japonesas y gráficos OHLC .

Vaadin tiene soporte incorporado para la tecnología Push , por lo que sus gráficos se pueden actualizar automáticamente en el navegador web sin la promoción del usuario.

Con el enfoque de JavaScript, como contenido web en su aplicación Java, puede agregar LightningChart JS . Se ha creado con WebGL y el rendimiento es mucho más rápido en comparación con Java u otros gráficos de JavaScript. LightningChart puede representar hasta 100 millones de puntos de datos en tiempo real.

Se admite el zoom rápido, el desplazamiento, la panorámica, etc., y OHLC, montañas, series de líneas, etc. de forma natural.

Ejemplo comercial (datos estáticos) Tabla de negociación

Hay muchos ejemplos interactivos en tiempo real aquí