//+------------------------------------------------------------------+ //| Telegram_Bot_EA.mq5 | //| Copyright 2020, MetaQuotes Software Corp. | //| http://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2020, MetaQuotes Software Corp." #property link "http://www.mql5.com" #property version "1.00" #property strict #include #include const ENUM_TIMEFRAMES _periods[] = {PERIOD_M1,PERIOD_M5,PERIOD_M15,PERIOD_M30,PERIOD_H1,PERIOD_H4,PERIOD_D1,PERIOD_W1,PERIOD_MN1}; //+------------------------------------------------------------------+ //| CMyBot | //+------------------------------------------------------------------+ class CMyBot: public CCustomBot { private: ENUM_LANGUAGES m_lang; string m_symbol; ENUM_TIMEFRAMES m_period; string m_template; CArrayString m_templates; public: //+------------------------------------------------------------------+ void Language(const ENUM_LANGUAGES _lang) { m_lang=_lang; } //+------------------------------------------------------------------+ int Templates(const string _list) { m_templates.Clear(); //--- parsing string text=StringTrim(_list); if(text=="") return(0); //--- while(StringReplace(text," "," ")>0); StringReplace(text,";"," "); StringReplace(text,","," "); //--- string array[]; int amount=StringSplit(text,' ',array); amount=fmin(amount,5); for(int i=0; i0) { if(SeriesInfoInteger(_symbol,_period,SERIES_SYNCHRONIZED)) break; Sleep(500); } if(_template!=NULL) if(!ChartApplyTemplate(chart_id,_template)) PrintError(_LastError,InpLanguage); ChartRedraw(chart_id); Sleep(500); ChartSetInteger(chart_id,CHART_SHOW_GRID,false); ChartSetInteger(chart_id,CHART_SHOW_PERIOD_SEP,false); string filename=StringFormat("%s%d.gif",_symbol,_period); if(FileIsExist(filename)) FileDelete(filename); ChartRedraw(chart_id); Sleep(100); if(ChartScreenShot(chart_id,filename,800,600,ALIGN_RIGHT)) { Sleep(100); //--- Need for MT4 on weekends !!! ChartRedraw(chart_id); bot.SendChatAction(_chat_id,ACTION_UPLOAD_PHOTO); //--- waitng 30 sec for save screenshot wait=60; while(!FileIsExist(filename) && --wait>0) Sleep(500); //--- if(FileIsExist(filename)) { string screen_id; result=bot.SendPhoto(screen_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); } } ChartClose(chart_id); return(result); } //+------------------------------------------------------------------+ void ProcessMessages(void) { #define EMOJI_TOP "\xF51D" #define EMOJI_BACK "\xF519" #define KEYB_MAIN (m_lang==LANGUAGE_EN)?"[[\"Account Info\"],[\"Quotes\"],[\"Charts\"]]":"[[\"Информация\"],[\"Котировки\"],[\"Графики\"]]" #define KEYB_SYMBOLS "[[\""+EMOJI_TOP+"\",\"GBPUSD\",\"EURUSD\"],[\"AUDUSD\",\"USDJPY\",\"EURJPY\"],[\"USDCAD\",\"USDCHF\",\"EURCHF\"]]" #define KEYB_PERIODS "[[\""+EMOJI_TOP+"\",\"M1\",\"M5\",\"M15\"],[\""+EMOJI_BACK+"\",\"M30\",\"H1\",\"H4\"],[\" \",\"D1\",\"W1\",\"MN1\"]]" for(int i=0; i0.0) break; } int digits=(int)SymbolInfoInteger(symbol,SYMBOL_DIGITS); double bid=SymbolInfoDouble(symbol,SYMBOL_BID); CopyOpen(symbol,PERIOD_D1,0,1,open); if(open[0]>0.0) { double percent=100*(bid-open[0])/open[0]; //--- sign string sign=ShortToString(0x25B2); if(percent<0.0) sign=ShortToString(0x25BC); msg=StringFormat("%s: %s %s (%s%%)",symbol,DoubleToString(bid,digits),sign,DoubleToString(percent,2)); } else { msg=(m_lang==LANGUAGE_EN)?"No history for ":"Нет истории для "+symbol; } } SendMessage(chat.m_id,msg,ReplyKeyboardMarkup(KEYB_SYMBOLS,false,false)); continue; } //--- Charts if(chat.m_state==3) { StringToUpper(text); string symbol=text; if(SymbolSelect(symbol,true)) { m_symbol=symbol; chat.m_state=31; string msg=(m_lang==LANGUAGE_EN)?"Select a timeframe like 'H1'":"Введите период графика, например 'H1'"; SendMessage(chat.m_id,msg,ReplyKeyboardMarkup(KEYB_PERIODS,false,false)); } else { string mask=(m_lang==LANGUAGE_EN)?"Invalid symbol name '%s'":"Инструмент '%s' не найден"; string msg=StringFormat(mask,text); SendMessage(chat.m_id,msg,ReplyKeyboardMarkup(KEYB_SYMBOLS,false,false)); } continue; } //Charts->Periods if(chat.m_state==31) { bool found=false; int total=ArraySize(_periods); for(int k=0; k