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

 

Если убрать ваш SleepCustom(); в 5 секунд

то имеем


 
Vitaly Muzichenko #:

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

Складывается впечатление, что функция ChartScreenShot выполняется асинхронно.
Хотя в документации об этом не упоминается. Вероятно в документации забыли об этом написать.
Попробуй эту функцию

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

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

Складывается впечатление, что функция ChartScreenShot выполняется асинхронно.
Хотя в документации об этом не упоминается. Вероятно в документации забыли об этом написать.
Попробуй эту функцию

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

Поставил задержку в 10 секунд


 

У меня сейчас реализовано так:

Работает таймер в 1 секунду, там стоит флаг

Приходит сигнал с инди, сохраняем скрин и ждём в таймере 3 секунды, потом отправляем скрин в телегу.

Но подключать таймер в простом индикаторе для простой задачи... что-то здесь не так.

 
Vitaly Muzichenko #:

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

Поставил задержку в 10 секунд


Короче while забирает на себя управление и удерживает его, Sleep не отдаёт управление потому, что по сути она запрещена в индикаторах разработчиком.
Попробуй любую другую mql функцию вместо Sleep поставить, попробовать просто. Идея в том, чтоб while в цикле отдавал управление терминалу. 

 
Roman #:

Короче while забирает на себя управление и удерживает его, Sleep не отдаёт управление потому, что по сути она запрещена в индикаторах разработчиком.
Попробуй любую другую mql функцию вместо Sleep поставить, попробовать просто. Идея в том, чтоб while в цикле отдавал управление терминалу. 

Что можно поставить на 2 секунды?

Опять-же, функция займёт поток, и сохранение скрина работать не будет.

 

можно другой экран делать снимок

bool  ChartScreenShot(    long             chart_id,                   // идентификатор графика

создать экран №2, применить шаблон с индикаторами и делать скрин его

если символы разные, переключать на нем символ тоже можно



на сайте проблема со вставкой кода, пробелы не убираются

 
Vitaly Muzichenko #:

Что можно поставить на 2 секунды?

Опять-же, функция займёт поток, и сохранение скрина работать не будет.

Да просто любую функцию, например получение цены бид.
Не в задержке идея, а в передаче управления терминалу в цикле.
Имею ввиду тут Sleep замени на получение цены бид.

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

   
   Print("SleepCustom закончен.");
}
 
Раз функция ChartScreenShot выполняется асинхронно, то по хорошему надо после скрина, выходить из OnCalculate
и на следующем заходе в OnCalculate, обрабатывать этот файл.
В общем надо подумать, но попозже. Надо отдохнуть.
 
lynxntech #:

можно другой экран делать снимок

создать экран №2, применить шаблон с индикаторами и делать скрин его

если символы разные, переключать на нем символ тоже можно

на сайте проблема со вставкой кода, пробелы не убираются

Есть уже такое, но применение шаблона работает ещё печальней