Может всё таки надо .png
FILE_SHARE_READ | FILE_SHARE_WRITE
Добавил
![]()
--
--
Начинается чтение в момент, когда скрин ещё не создан.
Открываем папку "Files", ждём новый бар - это сигнал к созданию скрина, и видим что он создаётся с задержкой,
программа продолжает выполнение и чтение скрина, которого ещё нет.
Ошибка
Print("File Read Error: ",filename," (",GetLastError(),")");
Функция FileReadArray может возвращать 0 размер.
Изменил структуру твоей функции SendScreenTG, теперь все нулевые размеры FileReadArray уходят в else.
Почему она может возвращать 0 размер, не знаю.
Да и FILE_SHARE_READ | FILE_SHARE_WRITE действительно лучше работает.
void SendScreenTG() { 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); }
Функция FileReadArray может возвращать 0 размер.
Изменил структуру твоей функции SendScreenTG, теперь все нулевые размеры FileReadArray уходят в else.
Почему она может возвращать 0 размер, не знаю.
Да и FILE_SHARE_READ | FILE_SHARE_WRITE действительно лучше работает.
Спасибо!
Сейчас имеем это:
string filename=_Symbol+".png"; 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); if(ChartScreenShot(0,filename,1024,768,ALIGN_RIGHT)) { SendScreenTG(); } else { Print(filename,"= ChartScreenShot Error: ",GetLastError()); return(0); } return(rates_total); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void SendScreenTG() { 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) {
![]()
С флагами
FileOpen(filename, FILE_READ|FILE_WRITE|FILE_BIN|FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_ANSI);
имеет это
![]()
Имелось в виду добавить эти флаги, а не убирать те, что были до того.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования


В современном МТ5 слишком долго создаётся скриншот с индикаторов, в древнем МТ4 это делается моментально и без проблем. (Мерседес с кулисной коробкой передач от Москвича)
Почему так и как это обойти минимальным количеством кода, по причине того, что разработчики это не исправляют?
Sleep() не работает, если делать паузу через While() = останавливается всё и ничего не создаётся.
Можно использовать таймер, но это как минимум - странная конструкция для простой и автономной задачи.
Простейший код:
--
P.S. Не проверял как это работает с экспертов, потому что там это нужно крайне редко - он автоматически торгует и туда лезть не нужно,
а вот в индикаторе это необходимо по причине того, что это ручная торговля и задача индикатора отображать и оповещать.