Баг с созданием скриншота в индикаторе МТ5

 

В современном МТ5 слишком долго создаётся скриншот с индикаторов, в древнем МТ4 это делается моментально и без проблем. (Мерседес с кулисной коробкой передач от Москвича)

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

Sleep() не работает, если делать паузу через While() = останавливается всё и ничего не создаётся.

Можно использовать таймер, но это как минимум - странная конструкция для простой и автономной задачи.

Простейший код:

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
{
  if(rates_total == prev_calculated) return(rates_total);

  if(ChartScreenShot(0,filename,1024,768,ALIGN_RIGHT)) {
    SendScreenTG();
  } else {
    Print(filename,"= ChartScreenShot Error: ",GetLastError());
    return(0);
  }
  return(rates_total);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SendScreenTG()
{
  int h=FileOpen(filename, FILE_READ|FILE_WRITE|FILE_BIN|FILE_ANSI);
  if(h<0) {
    Print("Err open gif-file "+filename);
    return;
  }
  uchar gif[];
// прочитали файл в массив
  if(FileSize(h)==0 || FileReadArray(h,gif)!=FileSize(h)) {
    FileClose(h);  // закрыли файл
    Print("File Read Error: "+filename);
    return;
  }
// формируем запрос
  string sep="++Jyecslin4mp8RdKV++"; // разделитель данных запроса

--

P.S. Не проверял как это работает с экспертов, потому что там это нужно крайне редко - он автоматически торгует и туда лезть не нужно,
а вот в индикаторе это необходимо по причине того, что это ручная торговля и задача индикатора отображать и оповещать.

 
Почему filename имеет расширение .gif ?
Может всё таки надо .png
 
Roman #:
Почему filename имеет расширение .gif ?
Может всё таки надо .png

не принципиально, но у gif меньший вес

 
Vitaly Muzichenko #:

не принципиально, но у gif меньший вес

У .gif может быть другой алгоритм, так как теоретически .gif это набор картинок.
Возможно из-за этого подтормаживает. Но это только моё предположение.
Попробуй .png

 
Roman #:

У .gif может быть другой алгоритм, так как теоретически .gif это набор картинок.
Поэтому подтормаживает. Но это только моё предположение.
Попробуй .png

Попробовал


Впечатление, что скрин в МТ5 создаётся через сторонний сервер, поэтому так долго.
 
Vitaly Muzichenko #:

Попробовал

А не надо добавить флаги в FileOpen FILE_SHARE_READ | FILE_SHARE_WRITE?

И еще неплохо бы вывести код ошибки.

 
Stanislav Korotky #:
FILE_SHARE_READ | FILE_SHARE_WRITE

Добавил

--

--

Начинается чтение в момент, когда скрин ещё не создан.

Открываем папку "Files", ждём новый бар - это сигнал к созданию скрина, и видим что он создаётся с задержкой,

программа продолжает выполнение и чтение скрина, которого ещё нет.

Ошибка

Print("File Read Error: ",filename," (",GetLastError(),")");
 

Функция FileReadArray может возвращать 0 размер.
Изменил структуру твоей функции SendScreenTG, теперь все нулевые размеры FileReadArray  уходят в else.
Почему она может возвращать 0 размер, не знаю.
Да и 
FILE_SHARE_READ | FILE_SHARE_WRITE действительно лучше работает.

void SendScreenTG()
{
   int h = FileOpen(filename, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_BIN|FILE_ANSI);
   if(h == INVALID_HANDLE) 
   {
      Print("Err open "+filename);
      return;
   }
  
   uint size;
   uchar gif[];
    
   //прочитали файл в массив
   if((size=FileReadArray(h,gif)) > 0) 
   {
      //
      //тут вся логика функции SendScreenTG
      //
      
     
     
      Print("FileSize: ", size);     
   }
   else 
   {
      Print("FileSize: ", size);     
   }
    
   FileClose(h);
}
 
Roman #:

Функция FileReadArray может возвращать 0 размер.
Изменил структуру твоей функции SendScreenTG, теперь все нулевые размеры FileReadArray  уходят в else.
Почему она может возвращать 0 размер, не знаю.
Да и 
FILE_SHARE_READ | FILE_SHARE_WRITE действительно лучше работает.

Спасибо!

Сейчас имеем это:

string filename=_Symbol+".png";

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
{
  if(rates_total == prev_calculated) return(rates_total);

  if(ChartScreenShot(0,filename,1024,768,ALIGN_RIGHT)) {
    SendScreenTG();
  } else {
    Print(filename,"= ChartScreenShot Error: ",GetLastError());
    return(0);
  }
  return(rates_total);
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SendScreenTG()
{
  int h = FileOpen(filename, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_BIN|FILE_ANSI);
  if(h == INVALID_HANDLE) {
    Print("Err open "+filename);
    return;
  }

  uint size;
  uchar gif[];

//прочитали файл в массив
  if((size=FileReadArray(h,gif)) > 0) {


 

С флагами

FileOpen(filename, FILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_ANSI);

имеет это


 
Roman #:


Да и 
FILE_SHARE_READ | FILE_SHARE_WRITE действительно лучше работает.

Имелось в виду добавить эти флаги, а не убирать те, что были до того.