Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 1584

 
lynxntech #:

По скриншоту

Получить в переменную результат функции, и покрутить её во while? 

Не забыть про IsStopped()) 

Я это пробовал, пока крутит while - программа умирает и скриншот не создаётся.

 
Samuel Bandi Roccatello #:

Привет всем,

Не правильно

a_position.Type()

правильно

a_position.PositionType()
 
Miguel Angel Vico Alba #:

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

Покажите ваш кусок кода…

 
Alexey Viktorov # :

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

Покажите свой кусок кода...

Все методы, которые вы упомянули, действительны. Все зависит от того, насколько сильно вы хотите это сделать. В этом нет никакой тайны.

Быстрый пример, основанный на открытии нового бара:

input int W = 1280 ;        // ширина скриншота
input int H = 720 ;         // высота скриншота
input int TimerSecs = 1 ;   // интервал таймера в секундах

bool need_shot = false ;    // флаг для запуска скриншота
string fname;               // имя файла скриншота
datetime last_bar_time = 0 ;
//--- отформатируйте время даты в безопасное имя файла (без ":" и пробелов)
string SafeStamp( datetime t)
  {
   string s = TimeToString (t, TIME_DATE | TIME_MINUTES | TIME_SECONDS ); // "YYYY.MM.DD HH:MM:SS"
   StringReplace (s, ":" , "-" );   // замените ":" на "-"
   StringReplace (s, " " , "_" );   // замените пробел на "_"
// Необязательно: замените точки, если хотите
// StringReplace(s, ".", "-");
   return s;
  }
//--- инициализация
int OnInit ()
  {
   EventSetTimer (TimerSecs); // запуск таймера
   return INIT_SUCCEEDED ;
  }
//--- деинициализация
void OnDeinit (const int reason)
  {
   EventKillTimer (); // остановить таймер
  }
//--- обнаруживаем новый бар на тике
void OnTick ()
  {
   datetime bar_time = iTime (_Symbol , _Period , 0);
   if (bar_time != last_bar_time) // обнаружен новый бар
     {
      last_bar_time = bar_time;
      need_shot = true ;
      fname = "bar_" + SafeStamp(bar_time) + ".png" ; // безопасное имя файла
     }
  }
//--- делайте снимок экрана по событию таймера
void OnTimer ()
  {
   if (!need_shot)
       return ; // ничего не делать
// принудительный рендеринг перед скриншотом
   ChartRedraw (0);
   ChartRedraw (0);
   ResetLastError ();
   bool ok = ChartScreenShot (0 , fname, W, H);
   int err = GetLastError ();
   if (ok)
       Print ("Screenshot saved: " , fname);
   else
       PrintFormat ("Screenshot failed: %s, err=%d" , fname, err);
   need_shot = false ; // сбросить флаг
  }


Файлы:
 
Miguel Angel Vico Alba #:

Все методы, которые вы упомянули, действительны. Все зависит от того, насколько сильно вы хотите это сделать. В этом нет никакой тайны.

Быстрый пример, основанный на открытии нового бара:


Я был очень невнимателен. Автор вопроса совсем другой человек.

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

Вопросы от начинающих MQL5 MT5 MetaTrader 5

Nauris Zukas, 2025.08.13 14:15

Надежно ли работает функция ChartScreenShot() в визуальном режиме MetaTrader 5 Strategy Tester? В документации нет никаких ограничений, но я получаю пустые изображения. Кто-нибудь сталкивался с этим или нашел решение?


 
Alexey Viktorov #:

Это может показаться очевидным, но я думаю, что об этом стоит упомянуть. Вы запускаете тест в визуальном режиме? Без визуального режима нет рендеринга графиков, что объясняет пустые изображения.

 
Miguel Angel Vico Alba #:

Все перечисленные вами методы действенны. Все зависит от того, насколько сильно вы хотите это сделать. В этом нет никакой тайны.

Быстрый пример, основанный на открытии нового бара:


Спасибо за код и изображение, но ваш скриншот (bar_2025.08.15_11-00-00.png) сделан в реальной торговле, а не в визуальном бэктесте, как я и спрашивал: "Надежно ли работает функция ChartScreenShot() в визуальном режиме MetaTrader 5 Strategy Tester?". Я протестировал ваш код с включенным визуальным режимом, и он по-прежнему выдает пустые изображения в бэктесте. В использовании OnTimer() и ChartRedraw() нет ничего нового - я уже пробовал это делать. Ваш расплывчатый совет о "задержках, повторных попытках или запуске по таймеру" не решает проблему. Если у вас есть рабочий пример кода для режима визуального бэктестинга или если вы способны его предоставить, покажите его.

 
Nauris Zukas #:

Спасибо за код и изображение, но ваш скриншот (bar_2025.08.15_11-00-00.png) сделан в реальной торговле, а не в визуальном бэктесте, как я и спрашивал: "Надежно ли работает функция ChartScreenShot() в визуальном режиме MetaTrader 5 Strategy Tester?". Я протестировал ваш код с включенным визуальным режимом, и он по-прежнему выдает пустые изображения в бэктесте. В использовании OnTimer() и ChartRedraw() нет ничего нового - я уже пробовал это делать. Ваш расплывчатый совет о "задержках, повторных попытках или запуске по таймеру" не решает проблему. Если у вас есть рабочий пример кода для режима визуального бэктестинга или если вы способны его предоставить, покажите его.

Во-первых, прошу прощения, если мои предыдущие ответы показались вам неясными или бесполезными. Я должен пояснить, что у меня нет личной потребности в ChartScreenShot() в тестере стратегий MT5, и я никогда не использовал его в своей работе. Все, что я здесь написал, было создано с нуля с единственной целью - помочь вам и другим найти возможные решения.

После глубокого изучения истории форума я считаю необходимым быть полностью прозрачным. Насколько я могу судить, ChartScreenShot() никогда не работал надежно в тестере стратегий MT5, даже в визуальном режиме. Нет ни одного подтвержденного случая, когда она работала бы стабильно. Напротив, существуют многолетние отчеты, описывающие пустые или нуль-байтовые файлы.

Причина кроется в том, как устроен MT5. В MT4 тестер работает в одном потоке и отображает график в том же контексте, что и окно терминала, поэтому, когда вы делаете скриншот, в памяти находится реальное изображение графика, которое нужно захватить. В MT5 тестер многопоточный и распределен по процессам агента, а рендеринг графика происходит асинхронно. В визуальном режиме график, который вы видите, отрисовывается интерфейсом терминала, но код советника в тестере выполняется в агентском процессе, который не имеет прямого доступа к этому отрисованному изображению. Функция возвращает "true", потому что считает, что она преуспела, но в этом контексте нет завершенного графика, который можно было бы перехватить.

Из-за такого разделения проблему нельзя решить с помощью трюков с таймингом, повторных попыток или исправлений кода. Это ограничение является прямым результатом архитектуры MT5 и того, как она работает с бэктестингом.

Надеюсь, это объясняет, почему вы и другие видят пустые изображения и почему нет настоящих рабочих примеров для визуального бэктестинга. Это не вопрос мастерства или креативности; эта функция просто не поддерживается в среде тестера MT5.

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

Вопросы от новичков MQL5 MT5 MetaTrader 5

Мигель Анхель Вико Альба, 2025.08.14 16:05

Да, по сравнению с MT4 это может показаться немного странным, но на это есть причина, рендеринг асинхронный.


 
Nauris Zukas #:

Спасибо за код и изображение, но ваш скриншот (bar_2025.08.15_11-00-00.png) сделан в реальной торговле, а не в визуальном бэктесте, как я и спрашивал: "Надежно ли работает функция ChartScreenShot() в визуальном режиме MetaTrader 5 Strategy Tester?". Я протестировал ваш код с включенным визуальным режимом, и он по-прежнему выдает пустые изображения в бэктесте. В использовании OnTimer() и ChartRedraw() нет ничего нового - я уже пробовал это делать. Ваш расплывчатый совет о "задержках, повторных попытках или запуске по таймеру" не решает проблему. Если у вас есть рабочий пример кода для режима визуального бэктестинга или если вы способны его предоставить, покажите его.

А в чём, собственно смысл делать скриншоты в тестере, если их можно сделать после?

 
Aleksey Vyazmikin #:

А в чём, собственно смысл делать скриншоты в тестере, если их можно сделать после?

В своё время я тоже сходил с ума… Правда это было на МТ4. После прогона тестера смотрю открытые ордера, показания индикаторов и удивляюсь… «Как здесь мог открыться ордер?» Сидеть таращиться в монитор утомительно. Вот и начал делать снимки в момент открытия ордера, чтобы увидеть показания индикаторов… Но теперь язык стал гораздо удобней. А с появлением отладчика вообще все проблемы исчезли.