Как сделать нормальный скриншот программно?

 

В условиях одного конкурса требуют прикладывать скриншоты. Хотел сделать на автомате, выяснилась бяка - ничего не выйдет. Функция MQL4 WindowScreenShot записывает только собственно график без сделок, индикаторов, графики и т.д.

Раньше ей не пользовался, не подозревал, что такая убогая и никому не нужная реализация. Есть какое-то готовое решение, может, кто знает?
 
клавиша принт-скрин, затем штатный паинт и там загрузить из буфера, дальше сохранение в файл
 
Alexander Bereznyak:
клавиша принт-скрин, затем штатный паинт и там загрузить из буфера, дальше сохранение в файл

Спасибо Кэп )) Это по вашему программно?

 
Alexey Volchanskiy:

В условиях одного конкурса требуют прикладывать скриншоты. Хотел сделать на автомате, выяснилась бяка - ничего не выйдет. Функция MQL4 WindowScreenShot записывает только собственно график без сделок, индикаторов, графики и т.д.

Раньше ей не пользовался, не подозревал, что такая убогая и никому не нужная реализация. Есть какое-то готовое решение, может, кто знает?
ChartScreenShot() может поможет... Каламбурчик-с вышел...
 

Алексей, сделай секундную задержку перед снятием скрина.

Дело в том, что сначала делается скрин, а потом пересчитываются индикаторы на открытии бара.

 
Alexey Volchanskiy:

Спасибо Кэп )) Это по вашему программно?

Вы программист сделайте программно!
 
Artyom Trishkin:
ChartScreenShot() может поможет... Каламбурчик-с вышел...

Спасибо, я вчера и ее пробовал, проблема оказалась не в функциях. Сейчас прогнал вчерашний код и обнаружил, что все индикаторы и графика попадают в скриншот! Вчера (воскресенье) я делал тест на неработающем рынке, обычный скрипт, код ниже. Неужели снятие скриншота зависит от состояния рынка?? МТ4, билд 910.

#include <stderror.mqh>
#include <stdlib.mqh>

// узнает код последней ошибки и возвращает строку с описанием
string GetMyLastError2()
{
   int err = GetLastError();
   string serr = ErrorDescription(err);
   ResetLastError();
   return(serr);
}

void OnStart()
{
    string sdir = "shots\\ScalpHunter\\" + Symbol() + "\\" +  TimeToString(TimeCurrent(), TIME_DATE); // формируем имя папки
    string fname = sdir + "\\" + TimeToString(TimeCurrent(), TIME_DATE | TIME_MINUTES| TIME_SECONDS);
    StringReplace(fname, ":", "_"); // в имени файла двоеточия не допустимы, заменяем на подчеркивания
    if(!WindowScreenShot(fname + ".gif", 1280, 720))
        Print("WindowScreenShot failed, ", GetMyLastError2());
    if(!ChartScreenShot(0, fname + ".png", 1280, 720))
        Print("ChartScreenShot failed, ", GetMyLastError2());
}
    
 
Alexey Viktorov:

Алексей, сделай секундную задержку перед снятием скрина.

Дело в том, что сначала делается скрин, а потом пересчитываются индикаторы на открытии бара.

Не понял, между чем и чем делать секундную задержку? Со скрином вроде все заработало, читайте сообщение выше, но про задержку все же хочется понять )
 
Alexey Volchanskiy:
Не понял, между чем и чем делать секундную задержку? Со скрином вроде все заработало, читайте сообщение выше, но про задержку все же хочется понять )

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

Если-же не на открытии, то обрати внимание на настройки параметров скрина, у меня всё нормально снималось и с индикаторами и со сделками.

 
Alexey Viktorov:

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

Если-же не на открытии, то обрати внимание на настройки параметров скрина, у меня всё нормально снималось и с индикаторами и со сделками.

Теперь ясно, у меня работает таймер с периодом 1 сек, скрин снимается по переменной-счетчику, сейчас интервал 30 сек. и к началу ТФ он не привязан. Учту это замечание. Сейчас все нормально скриншотится, в чем была проблема в выходные - не понял.

EURUSD 

 
Alexey Volchanskiy:

Теперь ясно, у меня работает таймер с периодом 1 сек, скрин снимается по переменной-счетчику, сейчас интервал 30 сек. и к началу ТФ он не привязан. Учту это замечание. Сейчас все нормально скриншотится, в чем была проблема в выходные - не понял.

 

Можно сымитировать выходные: отключить интернет и запустить скрипт.
Причина обращения: