Diskussion zum Artikel "Die Erstellung des Bots für Telegram in der Sprache MQL5" - Seite 6

 

Die Fehlermeldungen sind eindeutig und geben genau das an, was sie besagen.

Der Compiler warnt Sie, dass er die Include-Datei nicht finden kann.

Die Include-Datei enthält die fehlenden Funktionen, weshalb zusätzliche Fehler erzeugt werden.

Sie müssen sicherstellen, dass die Datei telegram.mqh im Ordner files vorhanden ist.

Beginnen Sie dort, da es weitere Fehler gibt, die mit anderen Codeproblemen zusammenzuhängen scheinen.
 

Ist es möglich, es von benutzerdefinierten Indikator anstelle von Expert Advisor zu machen?

 
Franky Frentiono Nangoy:

Ist es möglich, es von einem benutzerdefinierten Indikator anstelle eines Expertenberaters zu machen?

Wenn Sie versuchen, die Funktion WebRequest von einem Indikator aus aufzurufen, wird GetLastError() den Fehler 4014 zurückgeben - "Funktion ist für den Aufruf nicht zugelassen".

Um dies zu tun, müssen Sie das Projekt neu erstellen, um mit Wininet.dll von Indikatorenzu arbeiten .

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:

Wenn Sie versuchen, die Funktion WebRequest von einem Indikator aus aufzurufen, gibt GetLastError() den Fehler 4014 zurück - "Funktion ist für den Aufruf nicht zugelassen".

Um dies zu tun, müssen Sie das Projekt neu erstellen, um mit Wininet.dll von Indikatorenzu arbeiten .


Vielen Dank, ich werde es mir ansehen.

 

Blick in die

<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:

Ich wäre Ihnen dankbar, wenn Sie mir helfen könnten, den Fehler zu finden. Vielen Dank im Voraus.

Schalten Sie Ihren Channel in den öffentlichen Modus. Oder verwenden Sie die chatID (nicht den Kanalnamen) für die Kommunikation mit Ihrem privaten Kanal.

 
Aimak:

Der Kanal ist öffentlich und ich erhalte das gleiche Ergebnis, wenn ich den Kanalnamen oder die ID verwende. Siehe Bildschirmfoto

Verwenden Sie die neueste Version von Telegram.mqh und Jason.mqh?

 

Lieber Andrey,

vielen Dank für deine Arbeit. Ich habe deine Dateien installiert und einen Experten konfiguriert, der folgendes tut:

1) der Experte sendet Nachrichten an den Bot alle x Minuten (nur zum Test) ,

2) Ich lese die Nachricht auf Telegram und klicke auf der Tastatur des Telegram-Clients auf "open trade",

3) der Metatrader öffnet den Handel (wenn möglich).

Alles funktioniert gut, aber nach einer Weile ist der Bot nicht mehr erreichbar; um ihn wieder zum Laufen zu bringen, muss ich ihn mit einem Befehl aus dem Tastaturmenü aufwecken (z.B. Charts oder /start oder account info....). Der Metatrader sagt "bad request:chat not found", aber wenn ich den Bot wieder aufwecke, funktioniert er für eine Stunde oder länger perfekt, aber dann hört er auf.

Ich habe den Bot so erstellt, wie Sie es vorgeschlagen haben (mit botFather). Wie kann ich dieses Problem lösen?

Nochmals vielen Dank

Dateien:
error.gif  26 kb
 

Vielen Dank für den interessanten Artikel. Es gibt einen Fehler im Code (Sie können es auf dem Bildschirmfoto sehen):

Fehler beim Senden eines Fotos, Titel

Muss in der SendPhoto-Methode der CCustomBot-Klasse behoben werden. Ich schlage diese Option vor:

   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();
      //--- Datei in Speicherpuffer kopieren
      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);

      //--- Grenze erstellen: (Daten -> 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";

      //--- chart_id hinzufügen
      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";

      //--- Beschriftung hinzufügen
      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";
        }

      //--- Bild hinzufügen
      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
        {
         //--- Stückliste löschen
         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);

         //--- Ergebnis parsen
         CJAVal js(NULL,jtUNDEF);
         bool done=js.Deserialize(out);
         if(!done)
            return(ERR_JSON_PARSING);

         //--- Fehlerbeschreibung erhalten
         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);
            //Drucken(out);
            return(_LastError);
           }
         else
           {
            if(res>=100 && res<=511)
              {
               string out=CharArrayToString(result,0,WHOLE_ARRAY,CP_UTF8);
               //Drucken(out);
               return(ERR_HTTP_ERROR_FIRST+res);
              }
            return(res);
           }
        }
      //--- 
      return(0);
     }
 
Andrey Emelyanov:

Vielen Dank für den interessanten Artikel. Es gibt einen Fehler im Code (Sie können es auf dem Bildschirmfoto sehen):

Muss in der SendPhoto-Methode der CCustomBot-Klasse behoben werden. Ich schlage diese Option vor:

Vielen Dank für Ihre Nachricht. Allerdings funktioniert Ihre korrigierte Variante nur mit lateinischen Zeichen.

Logischerweise sollten Sie die Zeichenkette in ein UTF-8 kodiertes Array konvertieren und es als Beschriftung in den Request Body einfügen.

Meine Variante befindet sich im Anhang.

Dateien:
Telegram.mqh  64 kb