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

 

Los errores son muy claros y exactamente lo que indican.

El compilador le advierte de que no puede encontrar el archivo de inclusión.

El archivo de inclusión contiene las funciones que faltan, por lo que se generan errores adicionales.

Tienes que asegurarte de que el fichero telegram.mqh existe en la carpeta files.

Empieza por ahí ya que hay más errores que parecen estar relacionados con otros problemas de código.
 

¿Es posible hacerlo desde indicador personalizado en lugar de asesor experto?

 
Franky Frentiono Nangoy:

¿Es posible hacerlo desde un indicador personalizado en lugar de desde un asesor experto?

Si intenta llamar a la función WebRequest desde un indicador, GetLastError() devolverá el error 4014 - "Function is not allowed for call".

Para ello, es necesario rehacer el proyecto para trabajar con Wininet.dll desde los indicadores.

Documentation on MQL5: Common Functions / WebRequest
Documentation on MQL5: Common Functions / WebRequest
  • www.mql5.com
Common Functions / WebRequest - Reference on algorithmic/automated trading language for MetaTrader 5
 
Andrey Voytenko:

Si intenta llamar a la función WebRequest desde un indicador, GetLastError() devolverá el error 4014 - "Función no permitida para llamada".

Para ello, es necesario rehacer el proyecto para trabajar con Wininet.dll de indicadores.


gracias, le echaré un vistazo

 

buscar en el

<Telegram.mqh>
{ 
   "ok":true,
   "result":[ 
      { 
         "update_id":349778698,
         "message":{ 
            "message_id":2,
            "from":{ 
               "id":198289825,
               "first_name":"Andriy",
               "last_name":"Voitenko",
               "username":"avaticks"
            },
            "chat":{ 
               "id":198289825,
               "first_name":"Andriy",
               "last_name":"Voitenko",
               "username":"avaticks",
               "type":"private"
            },
            "date":1459775817,
            "text":"\/start"
         }
      }
   ]
}
 

Aimak:

Les agradecería que me ayudaran a encontrar el error. Gracias de antemano.

Cambia tu canal a modo público. O utiliza el chatID (no el nombre del canal) para comunicarte con tu canal privado.

 
Aimak:

El canal es público y obtengo el mismo resultado utilizando el nombre o el ID del canal. Ver captura de pantalla

¿Utilizas la última versión de Telegram.mqh y Jason.mqh?

 

Estimado Andrey,

muchas gracias por tu trabajo. He instalado sus archivos y configurado un experto que hace lo siguiente:

1) el experto envía mensajes al bot cada x minutos (sólo para la prueba) ,

2) leo el mensaje en telegram y hago click en "open trade" en el teclado del cliente de telegram,

3) el metatrader abre el comercio (si es posible).

Todo funciona bien, pero después de un tiempo el bot ya no es accesible; para hacer que funcione de nuevo tengo que despertarlo pulsando algún comando en el menú del teclado (por ejemplo gráficos o /start o cuenta info....). El metatrader dice "bad request:chat not found" pero si vuelvo a despertar al bot funciona perfectamente durante una hora o más pero luego se para.

He creado el bot como has sugerido (con botFather). ¿Cómo puedo solucionar este problema?

Gracias de nuevo

Archivos adjuntos:
error.gif  26 kb
 

Gracias por el interesante artículo. Hay un error en el código (se puede ver en la captura de pantalla):

Error al enviar una foto, título

Necesita correcciones en el método SendPhoto de la clase CCustomBot. Sugiero esta opción:

   int SendPhoto(const string _channel_name,
                 const string _local_path,
                 string &_photo_id,
                 const string _caption=NULL,
                 const bool _common_flag=false,
                 const int _timeout=10000)
     {
      //---
      // const long _chat_id
      //---
      
      if(m_token==NULL)
         return(ERR_TOKEN_ISEMPTY);

      string name=StringTrim(_channel_name);
      if(StringGetCharacter(name,0)!='@')
         name="@"+name;
      
      
      ResetLastError();
      //--- copia el archivo en el buffer de memoria
      if(!FileIsExist(_local_path,_common_flag))
         return(ERR_FILE_NOT_EXIST);

      //---
      int flags=FILE_READ|FILE_BIN|FILE_SHARE_WRITE|FILE_SHARE_READ;
      if(_common_flag)
         flags|=FILE_COMMON;

      //---
      int file=FileOpen(_local_path,flags);
      if(file<0)
         return(_LastError);

      //---
      int file_size=(int)FileSize(file);
      uchar photo[];
      ArrayResize(photo,file_size);
      FileReadArray(file,photo,0,file_size);
      FileClose(file);

      //--- create boundary: (data -> base64 -> 1024 bytes -> md5)
      uchar base64[];
      uchar key[];
      CryptEncode(CRYPT_BASE64,photo,key,base64);
      //---
      uchar temp[1024]={0};
      ArrayCopy(temp,base64,0,0,1024);
      //---
      uchar md5[];
      CryptEncode(CRYPT_HASH_MD5,temp,key,md5);
      //---
      string hash=NULL;
      int total=ArraySize(md5);
      for(int i=0;i<total;i++)
         hash+=StringFormat("%02X",md5[i]);
      hash=StringSubstr(hash,0,16);
      //---

      //--- WebRequest
      uchar result[];
      string result_headers;

      string url=StringFormat("%s/bot%s/sendPhoto",TELEGRAM_BASE_URL,m_token);

      string part1="Content-Type: multipart/form-data; boundary="+hash+"\r\n";
      part1+="\r\n";

      //--- añadir chart_id
      part1+="--"+hash+"\r\n";
      part1+="Content-Disposition: form-data; name=\"chat_id\"\r\n";
      part1+="\r\n";
      part1+=name; //IntegerToString(_chat_id);
      part1+="\r\n";

      //--- añadir pie de foto
      if(_caption!=NULL)
        {
         part1+="--"+hash+"\r\n";
         part1+="Content-Disposition: form-data; name=\"caption\"\r\n";
         //part1+="Content-Type: text/plain\r\n";
         //part1+="Content-Transfer-Encoding: quoted-printable\r\n";
         part1+="\r\n";
         //part1+=UrlEncode(_caption);
         part1+=_caption;
         part1+="\r\n";
        }

      //--- añadir imagen
      part1+="--"+hash+"\r\n";
      part1+="Content-Disposition: form-data; name=\"photo\"; filename=\"lampash.gif\"\r\n";
      part1+="\r\n";

      //--- 1
      uchar array1[];
      int size1=StringLen(part1);
      StringToCharArray(part1,array1,0,size1);

      //--- 2
      //foto
      int size2=ArraySize(photo);

      //---
      string part3="\r\n--"+hash+"--\r\n";
      int size3=StringLen(part3);
      uchar array3[];
      StringToCharArray(part3,array3,0,size3);

      //---
      uchar data[];
      ArrayResize(data,size1+size2+size3);
      ArrayCopy(data,array1,0);
      ArrayCopy(data,photo,size1);
      ArrayCopy(data,array3,size1+size2);

      //---
      string headers="Content-Type: multipart/form-data; boundary="+hash+"\r\n";
      int res=WebRequest("POST",url,headers,_timeout,data,result,result_headers);
      if(res==200)//OK
        {
         //--- borrar lista de materiales
         int start_index=0;
         int size=ArraySize(result);
         for(int i=0; i<fmin(size,8); i++)
           {
            if(result[i]==0xef || result[i]==0xbb || result[i]==0xbf)
               start_index=i+1;
            else
               break;
           }

         //---
         string out=CharArrayToString(result,start_index,WHOLE_ARRAY,CP_UTF8);

         //--- resultado del análisis
         CJAVal js(NULL,jtUNDEF);
         bool done=js.Deserialize(out);
         if(!done)
            return(ERR_JSON_PARSING);

         //--- obtener descripción del error
         bool ok=js["ok"].ToBool();
         if(!ok)
            return(ERR_JSON_NOT_OK);

         total=ArraySize(js["result"]["photo"].m_e);
         for(int i=0; i<total; i++)
           {
            CJAVal image=js["result"]["photo"].m_e[i];

            long image_size=image["file_size"].ToInt();
            if(image_size<=file_size)
               _photo_id=image["file_id"].ToStr();
           }

         return(0);
        }
      else
        {
         if(res==-1)
           {
            string out=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8);
            //Imprimir(fuera);
            return(_LastError);
           }
         else
           {
            if(res>=100 && res<=511)
              {
               string out=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8);
               //Imprimir(fuera);
               return(ERR_HTTP_ERROR_FIRST+res);
              }
            return(res);
           }
        }
      //--- 
      return(0);
     }
 
Andrey Emelyanov:

Gracias por el interesante artículo. Hay un error en el código (se puede ver en la captura de pantalla):

Necesita correcciones en el método SendPhoto de la clase CCustomBot. Sugiero esta opción:

Gracias por su mensaje. Sin embargo, tu variante corregida sólo funciona con caracteres latinos.

Lógicamente, deberías convertir la cadena en un array con codificación UTF-8 y sustituirla como caption en el cuerpo de la petición.

Mi variante está en el archivo adjunto.

Archivos adjuntos:
Telegram.mqh  64 kb