Categorías
Programación

Enviar mensajes a Telegram

Configuración y código NinjaScript para enviar mensajes de texto e imagénes a Telegram.

Desde un indicador, estrategia, Add-On y en general cualquier NinjaScript de NinjaTrader, se pueden enviar mensajes con texto y/o imágenes a Telegram.

Para lograr la comunicación entre Telegram y NinjaTrader hay que realizar dos tipos de acciones:

  1. Configuración en Telegram para crear un bot y un canal.
  2. Programación del código correspondiente en NinjaTrader.

Para este artículo voy a utilizar como caso práctico un indicador de NinjaTrader, de modo que cuando se haga doble clic sobre el panel del chart en el que está cargado el indicador, se envíe a Telegram un mensaje con un texto y otro mensaje con la captura de pantalla del chart.


Crear un bot en Telegram

El bot servirá para la comunicación entre Telegram y NinjaTrader.

Primero instalamos en el teléfono móvil la app Telegram, si no la tuviéramos ya instalada.

Ahora hay que crear el bot. Abrimos el browser en el móvil, y en la barra de direcciones escribimos : telegram.me/botfather

Instalar BotFather
Escribir en el browser del teléfono móvil la URL telegram.me/botfather

Esto abrirá Telegram y creará automáticamente un nuevo canal llamado BotFather desde el cuál podremos crear y gestionar nuestros bots. Entramos en el canal BotFather y escribimos /newbot.

A continuación el canal solicita un nombre para el bot (en el ejemplo he usado testbolsa01), y un usuario para el bot (he usado testbolsa01bot).

BotFather. Comando newbot

Tras introducir los datos anteriores, el canal me devuelve un mensaje que incluye un token o identificador único para el bot. Este token debe conservarse de forma segura y no compartirse. Más adelante lo utilizaremos en el código NinjaScript. Opcionalmente puedo comprobar que el bot se ha creado correctamente, ejecutando el comando /mybots que mostrará una lista con el bot.

Telegram Bot Token-ID para enviar mensajes a Telegram

Para establecer una comunicación básica con el bot y comprobar que está activo puedo abrir un navegador en cualquier dispositivo (pc, teléfono móvil o tablet) y escribir en su barra de direcciones: https://api.telegram.org/bot<TOKEN-ID>/getMe

Donde <TOKEN-ID> es el token del bot; con lo que siguiendo con el ejemplo habría que escribir: https://api.telegram.org/bot746195535:AAE80G12j0IMTb3AgjnzjvH64k28amzFIDc/getMe

Si el bot está operativo en la ventana del browser aparecerá un simple mensaje de éxito como el siguiente, con el parámetro ok = true.

Telegram Browser Success

Crear un channel en Telegram

Una vez creado el bot que servirá para enviar mensajes a Telegram, el siguiente paso es crear el canal de Telegram donde se publicarán los mensajes enviados.

Abrimos el menú de Telegram y seleccionamos Nuevo canal.

Telegram. Crear Nuevo Canal

Elijo arbitrariamente testbolsa02 como nombre para el canal. El canal debe ser público.

Telegram Nuevo Canal creado

Autorizar al bot como administrador

Ahora hay que autorizar al bot testbolsa01bot como administrador del canal testbolsa02.

Entramos en el canal testbolsa02 y pulsamos sobre el encabezado para abrir la configuración.

Configuración Canal para enviar mensajes a Telegram

Pulsamos en Miembros/Administradores y por último en Añadir administrador.

Telegram. Añadir Administrador

Pulsamos en la lupa para abrir la búsqueda y escribimos testbolsa01bot. Y lo elegimos para añadirlo a los administradores del canal.

Telegram Buscar Administrador

Nos aseguramos de que tenga los siguientes permisos. Y pulsamos en el tick de Aceptar.

Permisos Administrador Telegram

Y con esto finalizamos la configuración en Telegram.


Importar librerías en NinjaTrader

Existe un proyecto opensource para enviar mensajes desde aplicaciones .NET a Telegram que se encuentra en este repositorio de GitHub. Aquí el lector encontrará documentación detallada sobre Telegram y la comunicación con .NET.

Pero en resumen y para el objetivo que estamos persiguiendo, sólo necesitamos conseguir dos ficheros DLL:

  • Telegram.Bot.dll
  • Newtonsoft.Json.dll

La versión más reciente de los ficheros se puede obtener clonando el repositorio de GitHub y compilando la solución en VisualStudio. Pero para facilitar la tarea también se pueden descargar directamente desde los links que facilito al final del artículo, aunque con el riesgo de que los ficheros estén desactualizados.

Una vez conseguidas las 2 DLL’s, hay que copiarlas en el directorio \Documents\NinjaTrader 8\bin\Custom.

Después arrancamos NinjaTrader, abrimos el NinjaScript Editor, clic derecho para abrir el menú contextual, clic en References…, pulsamos en add y añadimos las 2 DLL’s anteriores.

Código de la estrategia en NinjaTrader

Desde el NinjaScript Editor creamos una estrategia nueva y añadimos las siguientes constantes y variables globales. Observar que el nombre del canal debe ir prefijado con una arroba.

Variables globales para enviar mensajes a Telegram

Dentro del método OnStateChange, en el State.DataLoaded creamos un objeto de tipo TelegramBotClient que usaremos para la comunicación con el bot de Telegram. Al método constructor hay que pasarle el token del bot que nos facilitó BotFather.

En el State.Historical obtenemos la referencia al Chart y nos subscribimos al evento de pulsación del mouse en el panel en que se cargue el indicador. La referencia al Chart hay que conseguirla desde un Dispatcher para no provocar excepciones de seguridad por intentar acceder a objetos propiedad del hilo UI principal. En el State.Terminated nos desubscribimos del evento para liberar los recursos asociados.

OnStateChange para enviar mensajes a Telegram

Método manejador del evento MouseMove

Dentro de este método programamos el comportamiento para cuando el usuario haga doble clic sobre el panel en el cuál está cargado el indicador.

Primero se comprueba que el usuario ha hecho doble clic. Después se obtiene una captura de pantalla de todo el chart. Esa captura se codifica y se graba a un Stream que se enviará a continuación a Telegram en modo asíncrono.

NinjaScript MouseDown para enviar mensajes a Telegram

Envío asíncrono a Telegram

Es necesario crear un método asíncrono para la comunicación con Telegram. Desde ese método asíncrono enviamos el Stream anterior que contiene la captura de pantalla. También aprovechamos para enviar un mensaje de texto.

Enviar mensajes a Telegram

Compilamos el código y ya está la solución finalizada. Cargamos el indicador en un chart y al hacer doble clic sobre su panel se deberían enviar los dos mensajes (texto + imagen) al canal de Telegram.


Descargas

Fichero comprimido con las dos DLL’s y el código fuente del indicador.

8 respuestas a «Enviar mensajes a Telegram»

Hola, he seguido tus pasos y en output1 del ninja me aparece el siguiente mensaje y no se envia nada al grupo de telegram:
Screenshot submitted to Telegram…
Telegram.Bot.Exceptions.ChatNotFoundException: chat not found
at Telegram.Bot.TelegramBotClient.d__54`1.MoveNext()
— End of stack trace from previous location where exception was thrown —
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at NinjaTrader.NinjaScript.Indicators.Utilities.Zi8ScreenSnapShot.d__2.MoveNext()

Hola Andreu, según parece hay un problema en Telegram con el canal, que no lo encuentra. Asegúrate bien de todos los pasos al configurar el bot y el canal en Telegram, la arroba delante del nombre, de que el canal sea público (si es privado no funciona), que el bot está autorizado como administrador, etc. Te aseguro que la solución funciona porque la utilizo en mis sistemas, y me llegan al instante tanto los mensajes de texto como las capturas de imagen del chart. Saludos

saludos.. muchas gracias por su colaboracion
tengo un dilema ya hice todo lo que puso en el tutorial pero cuando compilo me sale error CS0101 en linea 31 col 14 y no hallo el error me prodia ayudar con eso

Hola Jair, la línea 31 es la cabecera de la declaración de la clase: public class Zi8ScreenSnapShot : Indicator
No hay lugar para ningún error.
El fichero .zip es para NinjaTrader 8 y se debe importar, sin descomprimir, desde Tools / Import / Ninjascript Add-On.
Este proceso de import genera un indicador llamado Zi8ScreenSnapShot. Comprueba si el mensaje de error que te aparece en el log es de este script. Posiblemente sea de otro indicador o estrategia que tengas en tu librería.
Saludos

saludos de nuevo alguna recomendación porque ya hice lo que me recomendó pero me sale una advertencia «estos archivos de ninjascript fue realizado desde una versión anterior incompatible de ninja trader» y tengo una versión reciente de ninja8 64bits

Mi versión es la 8.0.21.0 64-bits (es del 25 de febrero de 2020). Pero me extraña que la versión sea el problema.
Prueba a borrar el indicador siguiendo estos pasos:

  1. Abre el editor de código desde New/NinjaScript Editor.
  2. En el NinjaScript Explorer abre la carpeta Indicators/Utilities.
  3. Haz clic derecho sobre el indicador Zi8ScreenSnapShot y pulsa en Remove.
  4. Por último pulsa en el botón Compile en la barra de botones del NinjaScript Editor.

De este modo el indicador ya no existirá en la librería y si te aparece algún error en la compilación será debido a otro indicador o estrategia. En una de las columnas del log del Editor te informará del nombre del NinjaScript (indicador, estrategia, Add-On, etc) que causa el error.
Saludos

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

  Acepto la política de privacidad