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

 
Vitaly Muzichenko #:

Где взять следующую итерацию через 2 секунды пока создаётся файл, кроме Таймера с флагом?

ChartScreenShot создаёт или перезаписывает файл очень долго

Судя по этому коду, итерация на следующей новой свече.

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);
 
Roman #:

Судя по этому коду, итерация на следующей новой свече.

Это пример.

Скрин отправляется при появлении стрелки, ну или любого другого сигнала с индикатора параллельно с Alert().
Это может быть один раз в сутки, а может и 5 раз в час

 
Vitaly Muzichenko #:

Это пример.

Скрин отправляется при появлении стрелки, ну или любого другого сигнала с индикатора параллельно с Alert().
Это может быть один раз в сутки, а может и 5 раз в час

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
{
   int bars = rates_total-prev_calculated;
   
   //на первом старте принудительно создаём файл, чтоб он уже был
   if(bars > 1)
      ChartScreenShot(0,filename,1024,768,ALIGN_RIGHT);
   
   
   //рассчёт по новому бару
   if(bars == 1)
   {
      if(твой сигнал && ChartScreenShot(0,filename,1024,768,ALIGN_RIGHT))
         SendScreenTG();
   }      



  return(rates_total);
}
 
Roman #:

Ещё раз повторюсь

Не важно, есть уже файл скриншота, или его нет.

Для его перезаписи в индикаторе нужно те-же 1.5-2 секунды, что и для его создания и записи.

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

Нужна задержка 1.5-2 секунды перед SendScreenTG();

 
Vitaly Muzichenko #:

Ещё раз повторюсь

Не важно, есть уже файл скриншота, или его нет.

Для его перезаписи в индикаторе нужно те-же 1.5-2 секунды, что и для его создания и записи.

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

Нужна задержка 1.5-2 секунды перед SendScreenTG();

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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[])
{
   int bars = rates_total-prev_calculated;
   
   //на первом старте принудительно создаём файл, чтоб он уже был
   if(bars > 1)
      ChartScreenShot(0,filename,1024,768,ALIGN_RIGHT);
   
   
   //рассчёт по новому бару
   if(bars == 1)
   {
      if(твой сигнал && ChartScreenShot(0,filename,1024,768,ALIGN_RIGHT))
      {
         SleepCustom();
         SendScreenTG();
      }   
   }      



  return(rates_total);
}


//+------------------------------------------------------------------+
//| Ожидание 5 секунд                                                |
//+------------------------------------------------------------------+
void SleepCustom()
{
   ulong start = GetTickCount64();
   
   //пока не прошло 5 секунд
   while(GetTickCount64() - start < 5000); 

   
   Print("SleepCustom закончен.");
}

//+------------------------------------------------------------------+
void SendScreenTG()
{
   if(!FileIsExist(filename))
      return;
   
   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);
}
 
Vitaly Muzichenko #:

Ещё раз повторюсь

Не важно, есть уже файл скриншота, или его нет.

Для его перезаписи в индикаторе нужно те-же 1.5-2 секунды, что и для его создания и записи.

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

Нужна задержка 1.5-2 секунды перед SendScreenTG();

Вот что получаем, сейчас отправка на каждом новом баре М1

Скрин отправляет сохранённый с прошлого раза, а не текущий, текущий не успевает перезаписаться, но функция SendScreenTG() уже отработала, забрав скрин, который есть


 
Roman #:
void SleepCustom() {    ulong start = GetTickCount64();       //пока не прошло 5 секунд    while(GetTickCount64() - start < 5000);       Print("SleepCustom закончен."); }

Спасибо!

Я об этом писал в самом начале, пока работает while() = всё умирает и сохранение также не происходит

Вот эти 5 секунд задержки

  if(rates_total == prev_calculated) return(rates_total);
  text = "TimeCurrent = "+TimeToString(TimeCurrent(),TIME_MINUTES|TIME_SECONDS); // На график
  ObjectSetString(0,"txt",OBJPROP_TEXT,text);
  if(ChartScreenShot(0,filename,1024,768,ALIGN_RIGHT)) {
    SleepCustom();
    text = "TimeCurrent = "+TimeToString(TimeCurrent(),TIME_MINUTES|TIME_SECONDS); // В сообщение
    SendScreenTG();
  } else {
    Print(filename,"= ChartScreenShot Error: ",GetLastError());
    return(0);
  }

  return(rates_total);
}


 
Vitaly Muzichenko #:

Спасибо!

Я об этом писал в самом начале, пока работает while() = всё умирает и сохранение также не происходит

Вот эти 5 секунд задержки


Что значит всё умирает?
То есть и с моим SleepCustom(); старый скрин отправляет? 

 
Roman #:

Что значит всё умирает?
То есть и с моим SleepCustom(); старый скрин отправляет? 

Да, показал в коде. Я это уже пробовал ранее

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

Vitaly Muzichenko, 2025.08.25 17:31

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

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

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

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


 

Видео, нажать для воспроизведения