Нужна помощь в советнике для отправки скрина на Telegram

 

Есть полностью рабочий советник, который отправляет два скрина графика в телеграм, первый скрин с открытого окна в терминале, а второй с этим же инструментом но с другим тайм фреймом,

для этого открывается новое окно, применяется шаблон, делается скрин и удаляется окно. Но эта схема с вторым скрином не всегда стабильно работает, хочу поменять, что бы не открывало

новое окно, а использовало постоянно одно и тоже только подставляло нужный инструмент, помогите подправить это в коде.

 

//+------------------------------------------------------------------+
//|                                                          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);
   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);
  }
//+------------------------------------------------------------------+ 
 
telegram.mqh приложите
 
Alexandr Gavrilin:
telegram.mqh приложите

telegram.mqh

Файлы:
Telegram.mqh  73 kb
 
//+------------------------------------------------------------------+
//|                                                          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);
  }
//+------------------------------------------------------------------+

замените или сохраните отдельным файлом и его попробуйте использовать. Должен менять текущий , там где стоит этот советник\индикатор и перестать закрывать график по завершении сохранения скриншота.

 
Alexandr Gavrilin:

замените или сохраните отдельным файлом и его попробуйте использовать. Должен менять текущий , там где стоит этот советник\индикатор и перестать закрывать график по завершении сохранения скриншота.

Ваша версия не правильно работает, она применяет шаблон в то окно где установлен советник, и соответственно его удаляет и так же делает скрин до смены инструмента на графике. Сделайте что бы не применяло шаблон  "BollingerBands" и меняло инструмент до создания скрина и думаю все будет работать.

 
Andrey777:

Ваша версия не правильно работает, она применяет шаблон в то окно где установлен советник, и соответственно его удаляет и так же делает скрин до смены инструмента на графике. Сделайте что бы не применяло шаблон  "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);
  }
//+------------------------------------------------------------------+
 
Alexandr Gavrilin:

Я вам ничего не должен.

Понятно что не должны, я только попросил подправить код, тех кто в этом разбирается лучше меня.

Кстати, в последней версии вообще второй скрин не отправляет. Там система, если сигнал на Н4, тогда один сткрин, если на Н1 то два.

 
все равно инструмент на графике меняет сразу после отправки второго скрина, а нужно до...
 
Andrey777:

Есть полностью рабочий советник, который отправляет два скрина графика в телеграм, первый скрин с открытого окна в терминале, а второй с этим же инструментом но с другим тайм фреймом,

для этого открывается новое окно, применяется шаблон, делается скрин и удаляется окно. Но эта схема с вторым скрином не всегда стабильно работает, хочу поменять, что бы не открывало

новое окно, а использовало постоянно одно и тоже только подставляло нужный инструмент, помогите подправить это в коде.

 

Я думаю ваша ошибка тут

      ChartSetSymbolPeriod(lparam,ChartSymbol(lparam),ChartPeriod(lparam));

      if(ChartPeriod(lparam)!=PERIOD_H4)

Вы не меняя период делаете новый скрин.

 
Alexey Viktorov:

Я думаю ваша ошибка тут

Вы не меняя период делаете новый скрин.

Там второй скрин делается в новом окне, думаю там все правильно. 

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

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);
//---

В таком варианте с начало создает второй скрин а только потом подставляет нужный инструмент.

 
Andrey777:

Там второй скрин делается в новом окне, думаю там все правильно. 

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

Alexandr Gavrilin здесь помог, сделало чтобы второй скрин создавало в том же окне где установлен советник, но инструмент новый применяло только после создания скрина, а нужно до... как это исправить? Подходит вариант создания второго скрина и в том окно где советник и в новом.

Тогда зачем ChartSetSymbolPeriod со старыми значениями символа и периода?

У меня есть принципы, которые я стараюсь не нарушать. Могу только теоретически подсказывать. Готовое решение стараюсь не писать. Плюс ко всему с телеграмом никогда не связывался и нет желания.

Просто напишите алгоритм:

  • Пришло событие.
  • Сделали снимок экрана.
  • Изменили ТФ
  • Сделали снимок экрана
  • Вернули ТФ в первоначальное значение.

Пока я не вижу последовательности в алгоритме.

И когда будут проблемы, ищите причину.

Причина обращения: