Discusión sobre el artículo "Cómo crear un bot para Telegram en el lenguaje MQL5" - página 51

 
Valeriy Yastremskiy #:

Sí, no lo entiendo, no sé, tampoco puedo enviar a bot por nombre, sólo por ID. ¿Cómo te lo envías a ti mismo? O mejor dicho, ¿cómo metes tu id en el carrito? Yo solo lo consigo al bot.

Consigo cualquier ID a través del bot Get My ID

 
Andrey Kaunov #:

Obtengo cualquier documento de identidad a través del bot Get My ID.

Sí, confundí mi ID y el bot. Enviamos a nosotros mismos en un mensaje privado de nuestro propio bot))))

Del artículo de Andrei

Hay que tener en cuenta que en estos ejemplos pasamos el chat_id como destinatario del mensaje. No podemos saberlo de antemano para enviar un mensaje al usuario hasta que él/ella empiece a chatear con el bot primero. Tampoco hay forma de contactar con el usuario por su número de teléfono móvil o @nombredeusuario. Esto se hace, obviamente, por motivos de seguridad, para que los bots no envíen spam. Pero los bots pueden publicar mensajes en el canal dirigiéndose al usuario por su nombre utilizando la segunda opción SendMessage.

[Eliminado]  

Hola,

Estoy tratando de añadir un nuevo idioma al archivo de búsqueda, pero tengo estos parámetros hexadecimales que no entiendo el significado:

TLanguage languages[6]=
{
   {"English","\xF1EC\xF1E7","en"},
   {"Русский","\xF1F7\xF1FA","ru"},
   {"中文",    "\xF1E8\xF1F3","zh"},
   {"Español","\xF1EA\xF1F8","es"},
   {"Deutsch","\xF1E9\xF1EA","de"},
   {"日本語",   "\xF1EF\xF1F5","ja"}
};

¿Qué es eso de \xF1EC\xF1E7 en el inglés, por ejemplo, y cómo convertirlo para obtener pt flag?

 

Tuve algún fallo la semana pasada - la función de leer la cola de mensajes de Telegram dejó de funcionar. Es decir, los mensajes salientes se envían como antes, tanto texto como capturas de pantalla, pero la función GetUpdates() no devuelve nada, la cola de chat está siempre vacía.

¿Alguien se ha encontrado con un fallo así? ¿Cuál puede ser la razón?

 
¡Hola!
Muchas gracias por este tipo de trabajo!!!!
¿Podría decirme cómo cambiar la fuente, el fondo y el color del texto?
Gracias
 
lbgraf #:
¡Hola!
Muchas gracias por este tipo de trabajo!!!!
¿Podría decirme cómo cambiar la fuente, el fondo y el color del texto?
Gracias

Todas las etiquetas están descritas en los documentos sobre la API de Telegram.

 

hola chicos,

He completado el código para enviar el mensaje de telegrama a mt5 pero estoy teniendo un pequeño error, al enviar comando de cierre de muchos comandos de cierre al mismo tiempo, sólo puede enviar una orden pero no muchas órdenes.

¿Alguien me puede ayudar a ver donde me estoy equivocando?

//--- ahora procesa la lista de posiciones cerradas
   max_time = 0;
   double day_profit = 0;
   bool is_closed = false;
   int totalhis = hist_position.PositionsTotal();
   for(int i = 0; i < totalhis; i++) {
      //---
      pos_symbol = PositionGetSymbol(i); // Obtener el nombre del símbolo
      digits = (int)SymbolInfoInteger(pos_symbol, SYMBOL_DIGITS); // Obtener el número de dígitos del precio
      //--- Seleccione una posición cerrada por su índice en la lista
      if(hist_position.SelectByIndex(i)) {
         ulong    ticket            = hist_position.Ticket();
         datetime time_open         = hist_position.TimeOpen();
         ulong    time_open_msc     = hist_position.TimeOpenMsc();
         datetime time_close        = hist_position.TimeClose();
         ulong    time_close_msc    = hist_position.TimeCloseMsc();
         long     type              = hist_position.PositionType();
         string   type_desc         = hist_position.TypeDescription();
         long     magic             = hist_position.Magic();
         long     pos_id            = hist_position.Identifier();
         double   volume            = hist_position.Volume();
         double   price_open        = hist_position.PriceOpen();
         double   price_sl          = hist_position.StopLoss();
         double   price_tp          = hist_position.TakeProfit();
         double   price_close       = hist_position.PriceClose();
         double   commission        = hist_position.Commission();
         double   swap              = hist_position.Swap();
         double   profit            = hist_position.Profit();
         string   symbol            = hist_position.Symbol();
         string   open_comment      = hist_position.OpenComment();
         string   close_comment     = hist_position.CloseComment();
         string   open_reason_desc  = hist_position.OpenReasonDescription();
         string   close_reason_desc = hist_position.CloseReasonDescription();
         string   deal_tickets      = hist_position.DealTickets(",");
         //---
         int      deals_count       = HistoryDealsTotal();   // de la posición seleccionada
         int      orders_count      = HistoryOrdersTotal();  // de la posición seleccionada
         
         if(TimeToString(TimeCurrent(), TIME_DATE) == TimeToString(time_close, TIME_DATE)) {
            day_profit += profit + swap + commission;
         }
         if(time_close <= _closed_last_time) continue;
         //is_closed = true;
         string msg = StringFormat
                      (
                         "ACCOUNT: { #%s } \n" +
                         "------------ { CLOSE } -----------\n" +
                         "CLOSE ORDER - %s %s\n" +
                         "Time (GTM+0): %s\n" +
                         "------------ { CLOSE } -----------\n" +
                         "Volume: %s\n" +
                         "Open Price: %s\n" +
                         "Close Price: %s\n" +
                         "Gain/Loss: %s USD\n" +
                         "---TOTAL PROFIT TODAY---\n" +
                         "%s USD\n",
                         IntegerToString(login),
                         symbol,
                         PositionTypeToString(type),
                         TimeToString(time_close, TIME_DATE | TIME_SECONDS),
                         DoubleToString(volume, 2),
                         DoubleToString(price_open, digits),
                         DoubleToString(price_close, digits),
                         DoubleToString(profit, 2),
                         DoubleToString(day_profit, 2)
                      );
         
         int res = bot.SendMessage(InpChannelName, msg);
         if(res != 0)
            Print("Error: ", GetErrorDescription(res));
         max_time = MathMax(max_time, time_close);
      }
      _closed_last_time = MathMax(max_time, _closed_last_time);
   }
 
Bui Huy Dat #:

hola chicos,

He completado el código para el envío de mensajes de telegrama a mt5 pero estoy teniendo un pequeño error, al enviar comando de cierre de muchos comandos de cierre al mismo tiempo, sólo puede enviar una orden, pero no muchas órdenes.

¿Alguien me puede ayudar a ver donde me estoy equivocando?

Código con formato incorrecto eliminado por el moderador. @Bui Huy Dat Por favor EDITA tu post y usa el botón CODE cuando insertes código.

Si usted está sirviendo a muchos usuarios a través del bot hay un límite de 30 interacciones por segundo, creo.

 
Lorentzos Roussos #:

Si usted está sirviendo a muchos usuarios a través del bot hay un límite de 30 interacciones por segundo, creo.

Yo sólo lo uso personalmente y sólo para enviar cada cuenta mt5 a telegram.
pero al abrir o cerrar el comando al mismo tiempo, sólo puede enviar un mensaje a telegram

 
Bui Huy Dat #:

Yo sólo lo uso personalmente y sólo para enviar cada cuenta mt5 a telegram.
pero al abrir o cerrar el comando al mismo tiempo, sólo puede enviar un mensaje a telegram

No había código cuando contesté , veo que se puede sustituir el bot.SendMessage por una función que añada el mensaje a una lista de ráfagas . También podrías seguir creciendo el mensaje y enviarlo fuera del bucle pero ahí chocarías con limitaciones de caracteres.

Un breve esquema podría ser así :

  1. Tienes un array de cadenas llamado "Bandeja de salida".
  2. Un intervalo de tiempo dentro del cual procesas el Outbox, así que "OnTimer()" (puede que ya lo estés usando si también estás leyendo de telegram)
  3. Entonces impones -tú mismo- un límite de milisegundos entre cada mensaje no con la función Sleep() sino recordando cuándo se envió el último mensaje.
  4. Puedes usar GetTickCount() para sondear los milisegundos y almacenar los últimos ms que dejó el mensaje y restarlo de los ms actuales para obtener la distancia en tiempo.Hay una muy muy muy rara ocasión aquí que el tiempo final es < que el tiempo de inicio en cuyo caso haces esto : (UINT_MAX-start_time+end_time)
  5. Si la distancia en milisegundos desde el último mensaje es mayor que el límite en milisegundos que has impuesto, entonces envías el siguiente mensaje desde la bandeja de salida.
  6. En lugar de llamar a bot.SendMessage en el bucle ahora llamas a Outbox.add_message_for_sending o algo así.
  7. Con una modificación que también almacene los ids de chat también podrías almacenar a dónde va el mensaje y esa sería la solución para múltiples usuarios.