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

 

Возможно я чего то не понял, поэтому сильно не пинайте.

ulong lastEvent = 0;
int i = 0;
//+------------------------------------------------------------------+
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
int OnCalculate(const int32_t rates_total,
                const int32_t 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 int32_t &spread[])
  {
   if(lastEvent < GetTickCount64())
     {
      EventChartCustom(0, 0, 0, 0, "screen" + (string)i + ".png");
      lastEvent = GetTickCount64() + 3000;
      i++;
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
void OnChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id == CHARTEVENT_CUSTOM)
      ChartScreenShot(0, sparam, 1024, 768, ALIGN_RIGHT);
  }
//+------------------------------------------------------------------+

Скришотит норм вроде.


А если так, то и читать его можно.

void OnChartEvent(const int32_t id, const long& lparam, const double& dparam, const string& sparam)
  {
   if(id == CHARTEVENT_CUSTOM)
      if(ChartScreenShot(0, sparam, (int)ChartGetInteger(0, CHART_WIDTH_IN_PIXELS), ChartGetInteger(0, CHART_HEIGHT_IN_PIXELS)))
         while(IsStopped())
           {
            if(FileGetInteger(sparam, FILE_SIZE) != 0)
              {
               // собственно здесь мы понимаем, что скрин записан/перезаписан и его можно отправлять/читать
               break;
              }
           }
  }
 
Sergey Gridnev #:
Лучше будет, если к этому внимание разработчиков привлечь. Пусть хоть что-то по этому поводу ответят. Иначе этот баг не будет исправлен никогда.
Если ChartScreenShot асинхронная, а она асинхронная, нужна возможность получить управление после завершения сохранения скриншота. Или нужна возможность исполняет ChartScreenShot в синхронном режиме.

Не привлекаются, почему-то

Sergey Gridnev #:
Костыль, который не гарантирует готовности файла скриншота на момент вызова функции SendScreenTG.

Готовность гарантировать невозможно, мы не знаем конечный размер файла. Проверит можно только на > 0

 
Vitaly Muzichenko #:

Готовность гарантировать невозможно, мы не знаем конечный размер файла. Проверит можно только на > 0

Время модификации файла.

 
fxsaber #:

На форуме были примеры запуска OrderSend и WebRequest из индикатора. Реализация через запуск соответствующего скрипта.

С созданием и отправкой скрина можно сделать по аналогии. В скрипте обсуждаемой асинхронности не будет.

Это не подходит, задача сильно простая чтобы для неё делать целую экосистему. 

 
Vitaly Muzichenko #:

Это не подходит, задача сильно простая чтобы для неё делать целую экосистему. 

В Телеграм же как-то отправляете данные.

 
Roman #:
Стандартной нет функции ожидания.
А насколько WaitForFile будет корректно работать, я не знаю.

Но вроде пашет.

Попробую позже, сейчас немного другая задача.

Опять-же, смущает использование while() 

 
fxsaber #:

В Телеграм же как-то отправляете данные.

dll-WebRequest, с индикатора работает отменно 

 
Vitaly Muzichenko #:

Не привлекаются, почему-то

Готовность гарантировать невозможно, мы не знаем конечный размер файла. Проверит можно только на > 0

В WaitForFile основная идея, не в проверке размера на > 0

Размером на > 0 мы просто проверяем есть там что или нет.
Сама идея в том, что файл освободился от записи в него, и теперь нам доступно его чтение.
То есть в цикле проверяем доступность хендла, если он корректен, значит файл от записи освободился.

 

может самый универсальный таймаут со static переменной?

типа такого

static bool needSend=false;
static uint LastTimeTrade=0;

//сделали скриншот
needSend=true;
LastTimeScreenShoot=GetTickCount();  //обновили время

if(GetTickCount() - LastTimeScreenShoot < 3)
   return;
//отправка в Телеграмм
needSend=false;

при NewBar конечно не пойдет

 
Roman #:

В WaitForFile основная идея, не в проверке размера на > 0

Размером на > 0 мы просто проверяем есть там что или нет.
Сама идея в том, что файл освободился от записи в него, и теперь нам доступно его чтение.
То есть в цикле проверяем доступность хендла, если он корректен, значит файл освободился.

Позже проверю тот код

lynxntech #:

может самый универсальный таймаут со static переменной?

типа такого

при NewBar конечно не пойдет

Именно