Обсуждение статьи "Создание бота для Telegram на языке MQL5" - страница 16
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Добрый день.
Спасибо за подробную статью. Очень помогла.
Столкнулся с тем, что WEB запрос не отрабатывался.
Выдает ошибку
2020.08.19 15:56:04.830 Moving Average Signal To Alert (RTSRIU0,M1) Error: URL does not allowed for WebRequest
После исследований оказалось что пропущен ?( вопрос) после /sendmessage?
Это уже исправлено было? Есть новая версия ?
Сам то я исправлю.
Делаю отправку текста в телеграм из индикатора. Но пришлось изменить POST на GET тип запроса.
Если отправляю с POST то возникает ошибка 400. Если отправляю из советника такой же код(но использу.ю не _WebRequest а WebRequest) то код работает в режиме POST. Подскажите куда стоит посмотреть, так как в методе GET у меня есть ограничение на длину запроса?
Ошибка и с GET тоже ошибка 400...
2020.08.21 08:52:20.138 testWININET GBPUSD,M1: Ошибка загрузки 'https://api.telegram.org/bot123123123:ываываыукаыва /sendMessage?chat_id=-123123123123123&parse_mode=HTML&text=Привет', код 400
Если отправляю через браузер запрос проходит.
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
#property indicator_chart_window
//#include <Wininet.mqh>
#include <Webrequest_dll.mqh>
#define telegramBaseURL "https://api.telegram.org"
//https://tlgrm.ru/docs/bots/api почитать как что отправлять
input string inpToken="11111212:вапвапапЫВВАEFfer";//Token
input string inpChat_id ="-3123123123123213";
bool inpParsMode =true;
int OnInit()
{
string data;
string url="https://api.telegram.org/bot" + inpToken + "/sendMessage?chat_id="+inpChat_id;
if(inpParsMode){
url = url + "&parse_mode=HTML";
}
// url = url + "&text= " + "<b>1114</b>";
// url = url + "&text= " + "<i>1114</i>";
url = url + "&text=" + "1118";
Print (url);
string cookie=NULL,headers;
char post[],result[];
int res=_WebRequest("GET",url,cookie,NULL,500,post,0,result,headers);
if(res==-1)
{
Print("Ошибка в WebRequest. Код ошибки =",GetLastError());
//--- возможно, URL отсутствует в списке, выводим сообщение о необходимости его добавления
MessageBox("Необходимо добавить адрес '"+url+"' в список разрешенных URL во вкладке 'Советники'","Ошибка",MB_ICONINFORMATION);
}
else
{
if(res==200)
{
//--- успешная загрузка
PrintFormat("Файл успешно загружен, размер %d байт.",ArraySize(result));
//PrintFormat("Заголовки сервера: %s",headers);
//--- сохраняем данные в файл
int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN);
if(filehandle!=INVALID_HANDLE)
{
//--- сохраняем содержимое массива result[] в файл
FileWriteArray(filehandle,result,0,ArraySize(result));
//--- закрываем файл
FileClose(filehandle);
}
else
Print("Ошибка в FileOpen. Код ошибки =",GetLastError());
}
else
PrintFormat("Ошибка загрузки '%s', код %d",url,res);
}
// ReadUrl(url,data);
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//---
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
Делаю отправку текста в телеграм из индикатора. Но пришлось изменить POST на GET тип запроса.
Вообще-то документация гласит:
Функция WebRequest() является синхронной, это означает, что она приостанавливает выполнение программы и ждет ответа от запрашиваемого сервера. Так как задержки при получении ответа на отправленный запрос могут быть большими, то функция запрещена для вызовов из индикаторов, поскольку индикаторы работают в едином потоке, общем для всех индикаторов и графиков на данном символе. Задержка выполнения индикатора на одном из графиков символа может привести к остановке обновления всех графиков по данному символу. Функцию можно вызывать только из экспертов и скриптов, так как они работают в собственном потоке выполнения. При вызове из индикатора
Вообще-то документация гласит:
У него отправка через dll, а так можно и в индикаторах
Проблема видимо с заголовками
Код состояния ответа "HTTP 400 Bad Request" указывает, что сервер не смог понять запрос из-за недействительного синтаксиса.
В закрытые каналы никак нельзя отправлять сообщения с помощью бота?
Если бот есть в канале и у него есть право отправлять сообщения, можно.
Если бот есть в канале и у него есть право отправлять сообщения, можно.
Бот добавлен в администраторы канала и есть право отправки сообщений. В публичный канал отправляет, но как только делаю закрытым , то начинает писать "Bad request". Там, как понимаю, нужно заместо ссылки на канал (для публичной версии) подставить ссылку на приватную версию канала...? Или как тут корректно все сделать?
Бот добавлен в администраторы канала и есть право отправки сообщений. В публичный канал отправляет, но как только делаю закрытым , то начинает писать "Bad request". Там, как понимаю, нужно заместо ссылки на канал (для публичной версии) подставить ссылку на приватную версию канала...? Или как тут корректно все сделать?