//+------------------------------------------------------------------+ //| 777.mq4 | //| Copyright 2015, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #include <Telegram.mqh> string Token="7417:AAH54X9HyFIbecqq1U1-R18tU"; int ChannelID=33722; CCustomBot bot; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ struct TSignalInfo { string symbol; ENUM_TIMEFRAMES timeframe; datetime time_last; //--- static datetime GetMinute() { MqlDateTime dt; TimeCurrent(dt); dt.sec=0; return(StructToTime(dt)); } }; TSignalInfo signal[]; //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ bool SignalIsAllowed(const string _symbol, const ENUM_TIMEFRAMES _timeframe) { //--- find int total=ArraySize(signal); for(int i=0; i<total; i++) { if(signal[i].symbol==_symbol && signal[i].timeframe==_timeframe) { //Print("found"); if(signal[i].time_last<TSignalInfo::GetMinute()) { signal[i].time_last=TSignalInfo::GetMinute(); return(true); } return(false); } } //--- add ArrayResize(signal,total+1); signal[total].symbol=_symbol; signal[total].timeframe = _timeframe; signal[total].time_last = TSignalInfo::GetMinute(); //Print("add"); return(true); } //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- bot.Token(Token); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- if(id==CHARTEVENT_CUSTOM+234) { if(!SignalIsAllowed(ChartSymbol(lparam),ChartPeriod(lparam))) return; //Print("Custom: ",lparam," ",dparam," ",sparam); ChartScreenShot(lparam,"chart.gif"); //--- первый скриншот string _photo_id; int err=bot.SendPhoto(_photo_id,ChannelID,"chart.gif",sparam); ChartSetSymbolPeriod(lparam,ChartSymbol(lparam),ChartPeriod(lparam)); if(ChartPeriod(lparam)!=PERIOD_H4) { string _symbol=ChartSymbol(lparam); ChartScreenShot(_symbol,PERIOD_H4,"chart.gif","BollingerBands"); string _photo_id2; int err2=bot.SendPhoto(_photo_id2,ChannelID,"chart.gif",sparam); } } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool ChartScreenShot(long chart_id,const string file_name) { //--- создать скриншот const int chart_width=1280; const int chart_height=623; FileDelete(file_name); //--- if(ChartScreenShot(chart_id,file_name,chart_width,chart_height,ALIGN_RIGHT)) { //--- ChartRedraw(chart_id); Sleep(500); //--- waitng 30 sec for save screenshot int wait=30; while(!FileIsExist(file_name) && --wait>0) { printf("Waiting %d sec ...",wait); Sleep(1000); ChartRedraw(chart_id); } //--- check file if(!FileIsExist(file_name)) printf("Failed to create a screenshot '%s'.",file_name); } else { Print("ChartScreenShot error ",_LastError); return(false); } return(true); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool ChartScreenShot(const string _symbol, const ENUM_TIMEFRAMES _tf, const string file_name, const string _template) { //--- // //long chart_id=ChartOpen(_symbol,_tf); long chart_id=ChartID(); if(!ChartSetSymbolPeriod(chart_id,_symbol,_tf)) { Print("Change Symbol/Period error: ",_LastError); return false; } ChartRedraw(chart_id); Sleep(155); //--- if(StringLen(_template)>0) if(!ChartApplyTemplate(chart_id,_template)) Print("Apply Template error: ",_LastError); //--- создать скриншот const int chart_width=1280; const int chart_height=623; FileDelete(file_name); //--- if(ChartScreenShot(chart_id,file_name,chart_width,chart_height,ALIGN_RIGHT)) { //--- ChartRedraw(chart_id); Sleep(500); //--- waitng 30 sec for save screenshot int wait=30; while(!FileIsExist(file_name) && --wait>0) { printf("Waiting %d sec ...",wait); Sleep(1000); ChartRedraw(chart_id); } //--- check file if(!FileIsExist(file_name)) printf("Failed to create a screenshot '%s'.",file_name); } else { Print("ChartScreenShot error ",_LastError); //ChartClose(chart_id); return(false); } //ChartClose(chart_id); return(true); } //+------------------------------------------------------------------+
замените или сохраните отдельным файлом и его попробуйте использовать. Должен менять текущий , там где стоит этот советник\индикатор и перестать закрывать график по завершении сохранения скриншота.
замените или сохраните отдельным файлом и его попробуйте использовать. Должен менять текущий , там где стоит этот советник\индикатор и перестать закрывать график по завершении сохранения скриншота.
Ваша версия не правильно работает, она применяет шаблон в то окно где установлен советник, и соответственно его удаляет и так же делает скрин до смены инструмента на графике. Сделайте что бы не применяло шаблон "BollingerBands" и меняло инструмент до создания скрина и думаю все будет работать.
Ваша версия не правильно работает, она применяет шаблон в то окно где установлен советник, и соответственно его удаляет и так же делает скрин до смены инструмента на графике. Сделайте что бы не применяло шаблон "BollingerBands" и меняло инструмент до создания скрина и думаю все будет работать.
//+------------------------------------------------------------------+ //| 777.mq4 | //| Copyright 2015, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2015, MetaQuotes Software Corp." #property link "https://www.mql5.com" #property version "1.00" #property strict #include <Telegram.mqh> string Token="7417:AAH54X9HyFIbecqq1U1-R18tU"; int ChannelID=33722; CCustomBot bot; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ struct TSignalInfo { string symbol; ENUM_TIMEFRAMES timeframe; datetime time_last; //--- static datetime GetMinute() { MqlDateTime dt; TimeCurrent(dt); dt.sec=0; return(StructToTime(dt)); } }; TSignalInfo signal[]; //+------------------------------------------------------------------+ //+------------------------------------------------------------------+ bool SignalIsAllowed(const string _symbol, const ENUM_TIMEFRAMES _timeframe) { //--- find int total=ArraySize(signal); for(int i=0; i<total; i++) { if(signal[i].symbol==_symbol && signal[i].timeframe==_timeframe) { //Print("found"); if(signal[i].time_last<TSignalInfo::GetMinute()) { signal[i].time_last=TSignalInfo::GetMinute(); return(true); } return(false); } } //--- add ArrayResize(signal,total+1); signal[total].symbol=_symbol; signal[total].timeframe = _timeframe; signal[total].time_last = TSignalInfo::GetMinute(); //Print("add"); return(true); } //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- bot.Token(Token); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) { //--- if(id==CHARTEVENT_CUSTOM+234) { if(!SignalIsAllowed(ChartSymbol(lparam),ChartPeriod(lparam))) return; //Print("Custom: ",lparam," ",dparam," ",sparam); ChartSetSymbolPeriod(lparam,ChartSymbol(lparam),ChartPeriod(lparam));//меняем инструмент и тф ChartScreenShot(lparam,"chart.gif");//делаем скрин //--- первый скриншот string _photo_id; int err=bot.SendPhoto(_photo_id,ChannelID,"chart.gif",sparam);//отправляем /* if(ChartPeriod(lparam)!=PERIOD_H4) { string _symbol=ChartSymbol(lparam); ChartScreenShot(_symbol,PERIOD_H4,"chart.gif",""); string _photo_id2; int err2=bot.SendPhoto(_photo_id2,ChannelID,"chart.gif",sparam); }*/ } } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool ChartScreenShot(long chart_id,const string file_name) { //--- создать скриншот const int chart_width=1280; const int chart_height=623; FileDelete(file_name); //--- if(ChartScreenShot(chart_id,file_name,chart_width,chart_height,ALIGN_RIGHT)) { //--- ChartRedraw(chart_id); Sleep(500); //--- waitng 30 sec for save screenshot int wait=30; while(!FileIsExist(file_name) && --wait>0) { printf("Waiting %d sec ...",wait); Sleep(1000); ChartRedraw(chart_id); } //--- check file if(!FileIsExist(file_name)) printf("Failed to create a screenshot '%s'.",file_name); } else { Print("ChartScreenShot error ",_LastError); return(false); } return(true); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool ChartScreenShot(const string _symbol, const ENUM_TIMEFRAMES _tf, const string file_name, const string _template) { //--- // //long chart_id=ChartOpen(_symbol,_tf); long chart_id=ChartID(); if(!ChartSetSymbolPeriod(chart_id,_symbol,_tf)) { Print("Change Symbol/Period error: ",_LastError); return false; } ChartRedraw(chart_id); Sleep(155); //--- if(StringLen(_template)>0) if(!ChartApplyTemplate(chart_id,_template)) Print("Apply Template error: ",_LastError); //--- создать скриншот const int chart_width=1280; const int chart_height=623; FileDelete(file_name); //--- if(ChartScreenShot(chart_id,file_name,chart_width,chart_height,ALIGN_RIGHT)) { //--- ChartRedraw(chart_id); Sleep(500); //--- waitng 30 sec for save screenshot int wait=30; while(!FileIsExist(file_name) && --wait>0) { printf("Waiting %d sec ...",wait); Sleep(1000); ChartRedraw(chart_id); } //--- check file if(!FileIsExist(file_name)) printf("Failed to create a screenshot '%s'.",file_name); } else { Print("ChartScreenShot error ",_LastError); //ChartClose(chart_id); return(false); } //ChartClose(chart_id); return(true); } //+------------------------------------------------------------------+
Я вам ничего не должен.
Понятно что не должны, я только попросил подправить код, тех кто в этом разбирается лучше меня.
Кстати, в последней версии вообще второй скрин не отправляет. Там система, если сигнал на Н4, тогда один сткрин, если на Н1 то два.
Есть полностью рабочий советник, который отправляет два скрина графика в телеграм, первый скрин с открытого окна в терминале, а второй с этим же инструментом но с другим тайм фреймом,
для этого открывается новое окно, применяется шаблон, делается скрин и удаляется окно. Но эта схема с вторым скрином не всегда стабильно работает, хочу поменять, что бы не открывало
новое окно, а использовало постоянно одно и тоже только подставляло нужный инструмент, помогите подправить это в коде.
Я думаю ваша ошибка тут
ChartSetSymbolPeriod(lparam,ChartSymbol(lparam),ChartPeriod(lparam)); if(ChartPeriod(lparam)!=PERIOD_H4)
Вы не меняя период делаете новый скрин.
Я думаю ваша ошибка тут
Вы не меняя период делаете новый скрин.
Там второй скрин делается в новом окне, думаю там все правильно.
Помогите как сделать тут что бы второй скрин делал постоянно в одном и том же окне, только применял новый инструмент, сейчас каждый раз создает новое окно.
bool ChartScreenShot(const string _symbol, const ENUM_TIMEFRAMES _tf, const string file_name, const string _template) { //--- // // long chart_id=ChartOpen(_symbol,_tf); if(!ChartSetSymbolPeriod(chart_id,_symbol,_tf)) { Print("Change Symbol/Period error: ",_LastError); return false; } ChartRedraw(chart_id); Sleep(155); //---
Alexandr Gavrilin здесь помог, сделало чтобы второй скрин создавало в том же окне где установлен советник, но инструмент новый применяло только после создания скрина, а нужно до... как это исправить? Подходит вариант создания второго скрина и в том окно где советник и в новом.
bool ChartScreenShot(const string _symbol, const ENUM_TIMEFRAMES _tf, const string file_name, const string _template) { //--- // //long chart_id=ChartOpen(_symbol,_tf); long chart_id=ChartID(); if(!ChartSetSymbolPeriod(chart_id,_symbol,_tf)) { Print("Change Symbol/Period error: ",_LastError); return false; } ChartRedraw(chart_id); Sleep(155); //---
В таком варианте с начало создает второй скрин а только потом подставляет нужный инструмент.
Там второй скрин делается в новом окне, думаю там все правильно.
Помогите как сделать тут что бы второй скрин делал постоянно в одном и том же окне, только применял новый инструмент, сейчас каждый раз создает новое окно.
Alexandr Gavrilin здесь помог, сделало чтобы второй скрин создавало в том же окне где установлен советник, но инструмент новый применяло только после создания скрина, а нужно до... как это исправить? Подходит вариант создания второго скрина и в том окно где советник и в новом.Тогда зачем ChartSetSymbolPeriod со старыми значениями символа и периода?
У меня есть принципы, которые я стараюсь не нарушать. Могу только теоретически подсказывать. Готовое решение стараюсь не писать. Плюс ко
всему с телеграмом никогда не связывался и нет желания.
Просто напишите алгоритм:
- Пришло событие.
- Сделали снимок экрана.
- Изменили ТФ
- Сделали снимок экрана
- Вернули ТФ в первоначальное значение.
Пока я не вижу последовательности в алгоритме.
И когда будут проблемы, ищите причину.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Есть полностью рабочий советник, который отправляет два скрина графика в телеграм, первый скрин с открытого окна в терминале, а второй с этим же инструментом но с другим тайм фреймом,
для этого открывается новое окно, применяется шаблон, делается скрин и удаляется окно. Но эта схема с вторым скрином не всегда стабильно работает, хочу поменять, что бы не открывало
новое окно, а использовало постоянно одно и тоже только подставляло нужный инструмент, помогите подправить это в коде.