В Телеграмм отправляются не полные скрины.

 

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


неполный скрин

Такое происходит не часто, но не приятно.
Для работы с Телеграмм использую модуль Telegram.mqh, который очень хорошо был описан на данном форуме.
Может надо что-то изменить или добавить в код, буду очень признателен за совет.
Код отправки скринов

        string filename=StringFormat("%s%d.gif",symbol,period);
        while(IsTradeContextBusy()) Sleep(10);
        if(ChartScreenShot(chart_id,filename,960,960,ALIGN_RIGHT))
        {
          Sleep(1000);
          int wait=1000;
          while(!FileIsExist(filename) && --wait>0) Sleep(1000);
          if(FileIsExist(filename))
          {
            Print("ScreenShot "+filename+" "+(string)wait);
            string _caption=Base_ChartScreen[i].caption;
            string screen_id;
            int res=MyBot.SendPhoto(screen_id,Input_ChannelName,filename,_caption);
            if(res==0)
            {
              Print("ScreenShot send "+filename);            
              Base_ChartScreen[i].screen=false;
              if(FileIsExist(filename)) FileDelete(filename);
            }
            else Print("Send ScreenShot error: ",GetErrorDescription(res));
          }
        }
 

может быть не хватает пикселей по вертикали

попробуйте

ChartScreenShot(chart_id,filename,800,600,ALIGN_RIGHT)

в справке:

Примечание

Если необходимо снять скриншот графика с определенной позиции, то необходимо сначала позиционировать график при помощи функции ChartNavigate(). Если горизонтальный размер скриншота меньше, чем окно графика, то выводится либо правая часть окна графика, либо левая часть, в зависимости от значения параметра align_mode.

Документация по MQL5: Операции с графиками / ChartNavigate
Документация по MQL5: Операции с графиками / ChartNavigate
  • www.mql5.com
ChartNavigate - Операции с графиками - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Renat Akhtyamov #:

может быть не хватает пикселей по вертикали

попробуйте

в справке:

Примечание

Если необходимо снять скриншот графика с определенной позиции, то необходимо сначала позиционировать график при помощи функции ChartNavigate(). Если горизонтальный размер скриншота меньше, чем окно графика, то выводится либо правая часть окна графика, либо левая часть, в зависимости от значения параметра align_mode.

Спасибо за участие и помощь в решении вопроса.
К сожалению от этих параметров не сильно зависит эта ошибка вывода.
Я использовал размер 800х600 и даже 640х480, все равно при нагрузке на терминал или еще что
выдаются иногда не полные скрины.
Выдавая сигнал я ориентируюсь на смартфон, а туда желательно выдавать скрины равного размера,
поэтому принял решение выдавать с разрешением 960х960, что позволяет на смартфоне их хорошо рассматривать.

 

после FileIsExists поставьте задержку.

когда файл существует, не факт что он полностью записан на диск.

 
Maxim Kuznetsov #:

после FileIsExists поставьте задержку.

когда файл существует, не факт что он полностью записан на диск.

Хорошо, а на сколько?
100 500 или больше милесекунд?

 
Maxim Kuznetsov #:

после FileIsExists поставьте задержку.

когда файл существует, не факт что он полностью записан на диск.

А каким образом, если без задержки, можно еще проверить записан файл полностью или нет?

 
Gennady Mazur #:

А каким образом, если без задержки, можно еще проверить записан файл полностью или нет?

не уверен, но попробуйте открывать на чтение без флагов SHARE_READ, SHARE_WRITE - запрещая(не разрешая) совместную запись и чтение.
Чтобы точно знать что к файлу никто и ничто уже больше не обращается и скриншотер полностью записал данные и со своей стороны файл закрыл

PS/ я когда-то делал несколько иначе - скриншоты валятся в один каталог, отдельный рассыльщик периодически каталог смотрит и перекладывает их в OUTBOX,
при успешной отправке перекладывает в SENT, а оттуда всё что старше 15 дней удаляется.
То есть не пытался в сию секунду отправить полученный скриншот, все одно он большой и долго шлётся, к чему торопится :-)
И всё обходилось без Sleep(). Отчасти возможно от того что треды получались разные, скриншотер и рассыльщик

 

или на запись его открыть, без SHARE_WRITE конечно. Только тут надо аккуратно, чтобы не затереть :-)

 
Вряд ли фпйл недозаписан, не открывался бы скриншот вообще
Мне кажется что жесткий диск под завязку заполнен, либо оперативки не хватает
 

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

Если не откроется, подождать и повторить попытку. 

Если это сработает, то лучше в методе убрать _SHARE_, чтобы пользоваться без лишних манипуляций. 

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

 
Renat Akhtyamov #:
Вряд ли фпйл недозаписан, не открывался бы скриншот вообще
Мне кажется что жесткий диск под завязку заполнен, либо оперативки не хватает

Файл в методе открывается с флагами FILE_SHARE_WRITE|FILE_SHARE_READ. Потрясающее решение!