Обсуждение статьи "Создание бота для Telegram на языке MQL5" - страница 17

 
Nicholas Martins:

Спасибо, что поделились этим кодом!

У меня только есть небольшая проблема, один из моих брокеров имеет строчную букву в некоторых символах, таких как EURUSDm, GBPUSDm, XAUUSDm...s

Вы пробовали просто отправить без буквы m

или лучше вот это

#include <Telegram.mqh>
input sring InpChannel;
input string InpToken;
void OnStart()
    {
        bot.Token(InpToken);
        string msg = "This currency pair/symbol is called: "+Symbol();
        bot.sendmessage(InpChannel, msg);
    }
 
Roman Zhitnik:

Скорее всего ошибка в том, что апишка телеграма блокируется роскомнадзором. Столкнулся с ней же. Попробуйте ВПН и все

Спасибо Роман!

 


//--- input parameters
input string InpChannelName="";//Channel Name
input string InpToken="";//Token

//--- global variables
CCustomBot bot;
int macd_handle;
datetime time_signal=0;
bool checked;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   time_signal=0;

   bot.Token(InpToken);

#ifdef __MQL5__   
   macd_handle=iMACD(NULL,0,12,26,9,PRICE_CLOSE);
   if(macd_handle==INVALID_HANDLE)
     {
      Print("Invalid iMACD handle");
      return(INIT_FAILED);
     }
//--- add the indicator to the chart
   int total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   ChartIndicatorAdd(0,total,macd_handle);
#endif   

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   if(reason==REASON_PARAMETERS ||
      reason==REASON_RECOMPILE ||
      reason==REASON_ACCOUNT)
     {
      checked=false;
     }

//--- delete the indicator
#ifdef __MQL5__ 
   int total=(int)ChartGetInteger(0,CHART_WINDOWS_TOTAL);
   for(int subwin=total-1; subwin>=0; subwin--)
     {
      int amount=ChartIndicatorsTotal(0,subwin);
      for(int i=amount-1; i>=0; i--)
        {
         string name=ChartIndicatorName(0,subwin,i);
         if(StringFind(name,"MACD",0)==0)
            ChartIndicatorDelete(0,subwin,name);
        }
     }
#endif
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
/*
//+------------------------------------------------------------------+
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
  {
   if(id==CHARTEVENT_KEYDOWN && 
      lparam=='Q')
     {
      bot.SendMessage(InpChannelName,"\x2611");
      bot.SendMessage(InpChannelName,"\x2705\x2705\x2705");
     }
  }
*/
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

   if(!checked)
     {
      if(StringLen(InpChannelName)==0)
        {
         Print("Error: Channel name is empty");
         Sleep(10000);
         return;
        }

      int result=bot.GetMe();
      if(result==0)
        {
         Print("Bot name: ",bot.Name());
         checked=true;
        }
      else
        {
         Print("Error: ",GetErrorDescription(result));
         Sleep(10000);
         return;
        }
     }

//--- get time
   datetime time[1];
   if(CopyTime(NULL,0,0,1,time)!=1)
      return;

//--- check the signal on each bar
   if(time_signal!=time[0])
     {
      //--- first calc
      if(time_signal==0)
        {
         time_signal=time[0];
         return;
        }

      double macd[2]={};
      double signal[2]={};

#ifdef __MQL4__
      for(int i=0;i<=1;i++)
        {
         macd[i]  = iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_MAIN,i);
         signal[i]= iMACD(NULL,0,12,26,9,PRICE_CLOSE,MODE_SIGNAL,i);
        }
#endif

#ifdef __MQL5__
      if(CopyBuffer(macd_handle,0,1,2,macd)!=2)
         return;
      if(CopyBuffer(macd_handle,1,1,2,signal)!=2)
         return;
#endif

      time_signal=time[0];

      //--- Send signal BUY
      if(macd[1]>signal[1] && 
         macd[0]<=signal[0] && 
         macd[0]<0.0)
        {
         string msg=StringFormat("Name: MACD Signal\xF4E3\nSymbol: %s\nTimeframe: %s\nType: Buy\nPrice: %s\nTime: %s",
                                 _Symbol,
                                 StringSubstr(EnumToString((ENUM_TIMEFRAMES)_Period),7),
                                 DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_ASK),_Digits),
                                 TimeToString(time[0]));
         int res=bot.SendMessage(InpChannelName,msg);
         if(res!=0)
            Print("Error: ",GetErrorDescription(res));
        }

      //--- Send signal SELL
      if(macd[1]<signal[1] && 
         macd[0]>=signal[0] && 
         macd[0]>0.0)
        {
         string msg=StringFormat("Name: MACD Signal\xF4E3\nSymbol: %s\nTimeframe: %s\nType: Sell\nPrice: %s\nTime: %s",
                                 _Symbol,
                                 StringSubstr(EnumToString((ENUM_TIMEFRAMES)_Period),7),
                                 DoubleToString(SymbolInfoDouble(_Symbol,SYMBOL_BID),_Digits),
                                 TimeToString(time[0]));
         int res=bot.SendMessage(InpChannelName,msg);
         if(res!=0)
            Print("Error: ",GetErrorDescription(res));
        }
     }
  }
//+------------------------------------------------------------------+

НАЗВАНИЕ ИНДИКАТОРА  ( MACD Colored Histogram) ,  ТАКОЙ ВОПРОС КАК СДЕЛАТЬ СИГНАЛ С ЭТИМ ИНДИКАТОРОМ 

Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
Документация по MQL5: Константы, перечисления и структуры / Константы графиков / Свойства графиков
  • www.mql5.com
Признак отрисовки ценового графика. Если установлено значение false, то отключается отрисовка любых атрибутов ценового графика и устраняются все отступы по краям графика: шкалы времени и цены, строка быстрой навигации, метки событий Календаря, значки сделок, тултипы индикаторов и баров, подокна индикаторов, гистограммы объёмов и т.д...
 
Andrey Voytenko:

Спасибо за положительный отзыв. Но функция WebRequest() не может быть выполнена в тестере стратегий.


Уважаемый Андрей,

спасибо за вашу замечательную статью!

Поскольку функция WebRequest() не работает в тестере стратегий, есть ли способ получать уведомления с помощью ботов при выполнении тестера стратегий?

Спасибо

 
Jefferson Metha:

Вы пробовали просто отправить без m

или лучше вот это

//+------------------------------------------------------------------+
string CTelebot::TradeSymbol(string txt)
  {
   string symbol;
   if(SymbolFind(txt))
     {
      symbol = txt;
      return symbol;
     }
   if(SymbolFind(txt + suffix))
     {
      symbol = txt + suffix;
      return symbol;
     }
   if(SymbolFind(GetSymbolDescription(txt)))
      return GetSymbolDescription(txt);
   else
      // символ = SymbolGet(txt);
      symbol = "EMPTY";
   return symbol;
  }
//--------------------------------------------------+



У меня небольшая проблема, ребята Как мне получить имя канала / группы, используя chat.m_id

 
Andrey Voytenko:

Пожалуйста, исправьте строку 117:

Уважаемый Андрей,

Ваша работа впечатляет! И задания выполнены также хорошо.


У меня есть 1 проблема и 1 вопрос к Telegram_Bot_EA

1. Я получаю это сообщение на mt4. Что может быть причиной этого? Можете ли вы помочь с решением?

0 08:25:24.546 Telegram_Bot_EA mt4 GBPUSD,H1: Файл скриншота 'NZDUSD60.gif' не создан.

2. Где я должен изменить размер шрифта кнопок Telegram? - Хотелось бы сделать текст немного мельче.


Заранее спасибо за помощь!

 

@Deyan Ivanov

У меня тоже есть такая проблема, вот мой код, исправленный для MT4. Отредактируйте файл "Telegram_Bot_EA.mq4", замените метод "int SendScreenShot(...)"

//+------------------------------------------------------------------+
   int               SendScreenShot(const long _chat_id,
                                    const string _symbol,
                                    const ENUM_TIMEFRAMES _period,
                                    const string _template=NULL)
     {

	......................

      Sleep(50);

      bool resultShot = ChartScreenShot(chart_id,filename,2560,1200,ALIGN_RIGHT);
      ChartClose(chart_id);
      if(resultShot)
        {
         Sleep(500);

         bot.SendChatAction(_chat_id,ACTION_UPLOAD_PHOTO);

         //---
         if(FileIsExist(filename))
           {
            string screen_id;
            result=bot.SendPhoto(photo_id,_chat_id,filename,_symbol+"_"+StringSubstr(EnumToString(_period),7));
           }
         else
           {
            string mask=m_lang==LANGUAGE_EN?"Screenshot file '%s' not created.":"Файл скриншота '%s' не создан".;
            PrintFormat(mask,filename);
           }

        }


      
....................
     }
 
Здравствуйте, Андрей. Подскажите, пожалуйста, есть ли возможность отправить сообщение о закрытии сделки с дублем/без дубля?
 
volohovnp:
Здравствуйте, Андрей. Подскажите, пожалуйста, есть ли способ отправить сообщение о закрытии сделки с тейкпрофитом/без тейкпрофита?
Я отправляю комментарий к каждой сделке, затем отправляю сообщение с указанием символа, типа ордера, комментария и действия, которое я хочу совершить.

Сообщение, например
Закрыть
Покупка EurUSD
сделка #23

Или

Закрыть на 0,21 лота или Закрыть на 50%
<Другие параметры я буду менять в зависимости от заказа>.
 
Привет, эта функция запроса занимает много времени, лучше сделать с помощью сокетов, я пытался, но не смог преобразовать, может кто-нибудь помочь изменить webreq на сокет?