Primer ejemplo

Esta entrada va a desarrollar el típico programa de “Hola mundo” aunque deteniéndonos en cosas básicas de Visual Studio, para quienes no tengan ninguna base. El resultado va a ser un programa simple que muestra el precio del símbolo que le indiquemos.

Manos a la obra.

Para que funcione, Visual Chart debe estar arrancado y conectado al tiempo real pues Visual Chart es el servidor COM que nos va a proveer de la información y debe estar “listo” para atender peticiones. Así pues, arrancamos Visual Chart y nos conectamos al tiempo real.

Ahora abrimos Visual Studio. Seleccionamos la opción “Archivo -> Nuevo proyecto”

Nueva aplicación

Escogemos la plantilla de C# (quien esté más cómodo con VB .NET, puede escogerlo: los pasos son muy similares). Seleccionamos “Aplicación de Windows Forms” y como nombre, le ponemos “EjemploTiempoReal”. Pulsamos “Aceptar”.

Ya tenemos el proyecto. Seleccionamos la ventana “Form1.cs” en el Explorador de Soluciones.

Renombrar Form1

Elegimos la opción “Cambiar nombre” del menú contextual de dicho elemento (o pulsamos F2 estando el elemento seleccionado) y le ponemos como nombre “TiempoRealForm.cs”. Aparecerá un diálogo para indicarnos si queremos cambiar también el nombre de las clases. Le indicamos que sí. El cambio de nombre no es imprescindible pero usar variables/clases… con nombres descriptivos es muy útil.

Si seleccionamos “Depurar -> Iniciar depuración” (o pulsamos F5) se ejecutará nuestra aplicación. Ahora mismo es una simple ventana con el título “Form1”. Cerramos la ventana para continuar.

En nuestro Visual Studio, hacemos clic sobre la ventana y echamos un ojo a la ventana de propiedades (pulsar Alt+Enter si no estuviese visible).

Propiedades

Podéis probar a cambiar algunas de las propiedades y ver cómo afecta a la ventana (ejecutando la aplicación). Una que queremos cambiar es la que pone “Text”, que es el título de la ventana. En lugar de “Form1”, le ponemos “Ejemplo Tiempo Real”. El resto lo podemos dejar como está.

Ahora llegamos a un punto muy importante: indicarle a Visual Studio que queremos comunicarnos con Visual Chart, concretamente con el módulo que nos da acceso al tiempo real.

Seleccionamos el proyecto y hacemos clic en la opción “Agregar referencia” del menú contextual.

Agregar referencia

En la ventana de agregar referencias, buscamos “VisualChart Real Time Library 1.0”, la marcamos y pulsamos “Aceptar”

Agregar referencia

En el Explorador de Soluciones, seleccionamos “VCRealTimeLib” dentro de “References”. En la ventana de propiedades (pulsar Alt+Enter si no la tenéis visible), ponemos la opción “Incrustar tipos de interoperabilidad” a “False”. Esto último es muy importante o tendremos luego problemas de compilación.

Ahora seleccionamos “TiempoRealForm.cs” en el Explorador de Soluciones y elegimos la opción “Ver código” del menú contextual.

Aquí es donde comienza la parte dura de la programación. Dentro de nuestra clase, vamos a crear un campo del tipo VCRT_RealTimeClass, que es el tipo que nos ofrece Visual Chart para acceder al tiempo real.

   VCRealTimeLib.VCRT_RealTimeClass _tiempoReal;

Dentro del constructor de la clase creamos el objeto:

   _tiempoReal = new VCRealTimeLib.VCRT_RealTimeClass;

Volvemos al diseñador de nuestra ventana (doble clic en “TiempoRealForm.cs” en el Explorador de Soluciones) y, con nuestra ventana seleccionada, vamos a la ventana de propiedades.

Propiedades (Eventos)

Hacemos clic en el rayo para ver los eventos disponibles en la ventana. Buscamos el evento “FormClosed” y hacemos doble clic en la parte derecha. Esto creará un evento que se ejecuta cuando se cierra la ventana.

Dicho evento lo usaremos para tareas de limpieza: para informarle a Visual Chart de que ya no vamos a usar el objeto anteriormente creado.

private void TiempoRealForm_FormClosed(object sender, FormClosedEventArgs e)
{
   Marshal.ReleaseComObject(_tiempoReal);
}

En la ventana “Cuadro de herramientas” disponemos de distintos controles que podemos usar en nuestra aplicación.

Cuadro de herramientas (Vista de diseño)Vamos a insertar:

  • Un Label (es un texto sin más). En las propiedades le ponemos como Name “LabelSimbolo” y como Text, “&Símbolo”.
  • Un TextBox (un cuadro de texto) con el nombre “TextBoxSimbolo” y la propiedad Anchor en “Left Top Right”.
  • Un Button (obviamente, es un botón) con el nombre “ButtonEmpezar”, la propiedad Text con “&Empezar” y el Anchor a “Top Right”.
  • Un Label con el nombre “LabelUltimo” y como Text, “&Último”.
  • Un TextBox con el nombre “TextBoxUltimo” y la propiedad Anchor en “Left Top Right”. Le ponemos la propiedad “ReadOnly” a True pues no queremos escribir en él sino mostrar el valor del símbolo del otro TextBox.

La idea es la siguiente: se escribe un código de símbolo de Visual Chart (tipo 010072MFXI), se pulsa en “Empezar” y en el segundo cuadro de texto se mostrará el valor del último tick de dicho símbolo.

Hacemos doble clic en el botón y aparecerá un nuevo método en el código que se ejecuta cuando se hace clic en el botón. Rellenamos con el código:

private void ButtonEmpezar_Click(object sender, EventArgs e)
{
   // Pedimos tiempo real del símbolo indicado en el cuadro de texto
   _tiempoReal.RequestSymbolFeed(TextBoxSimbolo.Text);
}

Esto hace que el texto que haya escrito en TextBoxSimbolo (el código del símbolo) se pase al método RequestSymbolFeed. Con esto le pedimos a Visual Chart que nos informe de los ticks del símbolo indicado.

Falta un último añadido para que todo funcione: un método que se ejecute cuando ocurra un tick.

En el constructor, después de crear el objeto de tiempo real, añadimos esta línea:

   _tiempoReal.OnNewTicks += _tiempoReal_OnNewTicks;

Y creamos un método con ese nombre:

private void _tiempoReal_OnNewTicks(ref Array ArrayTicks)
{
   foreach (VCRealTimeLib.VCRT_Tick tick in ArrayTicks)
   {
      if (tick.Field == VCRealTimeLib.enumVCRTField.VCRT_Field_Last)
      {
         MethodInvoker action = delegate
         {
            TextBoxUltimo.Text = tick.Value.ToString();
         };
         TextBoxUltimo.BeginInvoke(action);
      }
   }
}

Lo que hacemos aquí es recorrer todos los ticks que llegan y, si es el campo último, ponemos su valor en el segundo cuadro de texto. .

Si ejecutamos el programa, escribimos “010072MFXI” y pulsamos “Empezar”, veremos como en el segundo cuadro de texto, aparece el precio del último y se irá actualizando igual que en Visual Chart.

Aplicación

Y esto es todo, que no es poco si somos nuevos en esto de la programación. Como suele suceder con programas tipo “Hola mundo”, el programa tiene muchas carencias: no gestiona errores, no le indica a Visual Chart cuando no necesita más el tiempo real, etc. Esto solo sirve a fines educativos, nunca para ser usado tal cual.

Si esto os sabe a poco, mirad lo que hay en “tick.Field”. Aparte del último tenéis muchísimos otros campos: volumen, mínimo movimiento, bid, ask, etc. Aquí hemos puesto el último en un cuadro de texto pero con algunos cambios podríamos generar una tabla con varios símbolos y distintos campos, como la que muestra Visual Chart. Y a partir de ahí, lo que queramos hacer con los valores de las tablas: enviarnos alertas al correo, ponerlos en una hoja de Excel, hacer promedios del tipo que queramos… nuestra imaginación pone el límite.

Actualización: A raíz de algunos comentarios en el foro X-Trader y los aquí hechos por Jaime, añado alguna información relevante para que los ejemplos funcionen:

  • Visual Chart debe ejecutarse como adminitrador (botón derecho sobre el acceso directo de Visual Chart y elegir la opción «Ejecutar como administrador»).
  • Si se está trabajando con Visual Studio, también debe haberse ejecutado como administrador.
  • En las propiedades del proyecto, tanto en la configuración Debug como en la Release hay que cambiar el Destino de la plataforma (en el apartado de Compilación) de “AnyCPU” a “x86″. Esto evita problemas en sistemas operativos de 64 bits.

Archivo Zip Descargar C# EjemploTiempoReal.zip.

Archivo Zip Descargar VB .NET EjemploTiempoReal_vb.zip.

Si te ha gustado la entrada, considera hacer una donación Donar. ¿Por qué donar?

Esta entrada fue publicada en Código fuente, Programación, Visual Chart y etiquetada . Guarda el enlace permanente.

5 respuestas a Primer ejemplo

  1. Pingback: Marco de trabajo | SpeakerTrading

  2. Pingback: Búsqueda de símbolos | SpeakerTrading

  3. Jaime dijo:

    Muy buen artículo!
    He estado probando, y no consigo hacerlo funcionar la librería VCRealtime. Agrego la referencia COM, cambio las propiedades, y:

    Additional information: Retrieving the COM class factory for component with CLSID {57026346-553D-4F1C-8476-D208ECF4DECF} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

    He probado directamente a bajarme el Inter.VCRealTimeLib.dll de tu STMT y tampoco. ¿Te encontraste con un error similar?

    He comprobado que las CLSID de las dll de VisualChart no son esas.

    Gracias!

  4. Hola Jaime, aquí tienes algunas posibilidades por las que te puede estar dando el error,

    • Visual Chart debe estar ejecutándose para que funcione. Es el primer COM que veo que funciona así pero hay que ejecutar el programa para que funcione. Para usar funciones de tiempo real, hay que conectarse al servidor de tiempo real. Esto hace que algo pensado para automatización (el COM) no puede realmente automatizarse porque tienes que ejecutar Visual Chart y conectar al tiempo real manualmente.
    • Prueba a ejecutar primero (antes que la aplicación del artículo) Visual Chart. Hazlo con la opción del menú contextual «Ejecutar como administrador».
    • No hay que descargarse nada de VCRealTimeLib.dll. Cuando agregas la referencia, este archivo se genera automáticamente.
    • En las propiedades del proyecto, tanto en la configuración Debug como en la Release hay que cambiar el Destino de la plataforma (en el apartado de Compilación) de «AnyCPU» a «x86». Esto evita problemas en sistemas operativos de 64 bits.
    • Recuerda poner la opción de Incrustar tipos de interoperabilidad a False, como se comenta en el artículo.

    Compruébalas a ver si alguna soluciona el problema.

Deja un comentario