Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2634

 
Maxim Kuznetsov #:

может он кем-то открыт..

если скриншот от ChartScreenshot (судя по png), есть смысл просто подождать, пока терминал от него отцепится

Сколько ждать?

 

Вот как сохраняет файл

if(ChartScreenShot(0,filename,ScreenWidth,ScreenHeight,ALIGN_RIGHT)) {


 
Vitaly Muzichenko #:

Вот как сохраняет файл

Вот функция, которую я использую для скриншотов. Функция не завершается сразу, а дожидается создания скриншота.

//+------------------------------------------------------------------+
void ScreenShot(long ChartId = 0)
  {
   MqlDateTime dt;
   TimeCurrent(dt);
   string _photo_id = StringFormat("%s.png", IntegerToString(dt.hour));
   FileDelete(_photo_id);

   bool scaleData = ChartGetInteger(ChartId, CHART_SHOW_DATE_SCALE);
   bool scalePrice = ChartGetInteger(ChartId, CHART_SHOW_PRICE_SCALE);

   ChartSetInteger(ChartId, CHART_BRING_TO_TOP, true);
   ChartSetInteger(ChartId, CHART_AUTOSCROLL, true);//Режим автоматического перехода к правому краю графика
   ChartSetInteger(ChartId, CHART_SHOW_DATE_SCALE, false);
   ChartSetInteger(ChartId, CHART_SHOW_PRICE_SCALE, false);

   long width = ChartGetInteger(ChartId, CHART_WIDTH_IN_PIXELS) + 10;//10
   long height = 0;

   int windows = (int)ChartGetInteger(ChartId, CHART_WINDOWS_TOTAL);
   for(int i = 0; i < windows; i++)
      height += ChartGetInteger(ChartId, CHART_HEIGHT_IN_PIXELS, i) + 6;

   ChartSetInteger(ChartId, CHART_SHOW_DATE_SCALE, scaleData);
   ChartSetInteger(ChartId, CHART_SHOW_PRICE_SCALE, scalePrice);
   ChartRedraw();
   Sleep(30);

   if(ChartScreenShot(ChartId, _photo_id, (int)width, (int)height, ALIGN_LEFT))
     {
      int cont = 0;
      while(!IsStopped() && cont < 10)
        {
         if(FileIsExist(_photo_id))
           {
            int h = FileOpen(_photo_id, FILE_READ | FILE_WRITE | FILE_BIN);
            if(h >= 0)
              {
               int file_size = (int)FileSize(h);
               FileClose(h);
               if(file_size > 0)
                  break;
              }
           }
         cont++;
         Sleep(30);
        }
     }
  }
//+------------------------------------------------------------------+

Работает всегда идеально. Если она у вас не будет работать, значит проблема не в функции ChartScreenShot(), а в чём то другом.

 
Aleksandr Slavskii #:

Вот функция, которую я использую для скриншотов. Функция не завершается сразу, а дожидается создания скриншота.

Работает всегда идеально. Если она у вас не будет работать, значит проблема не в функции ChartScreenShot(), а в чём то другом.

Совсем не создаёт скриншоты, проверял в индикаторе.

Судя по коду, функция для работы в советнике, мне нужно для работы в индикаторе. Появился сигнал = создать скрин.

--

График имеет вид

--

ChartScreenShot сохраняет с 10 раз всего пару раз правильно, в остальных случаях - чистый график


 

Добрый день!

Не могли бы вы посоветовать скрипт, который мог бы нарисовать на графике линию цены StopOut при нескольких открытых позициях на одной валютной паре?

Счет с хеджированием.

С уважением, Александр

 
Vitaly Muzichenko #:

Совсем не создаёт скриншоты, проверял в индикаторе.

Судя по коду, функция для работы в советнике, мне нужно для работы в индикаторе. Появился сигнал = создать скрин.

--

График имеет вид

--

ChartScreenShot сохраняет с 10 раз всего пару раз правильно, в остальных случаях - чистый график


Убери 

Sleep(30)

поставь на таймер

 
Galim_V #:

Убери 

поставь на таймер

После долгих тестов выяснилось, что в индикаторе на мт5 целая история с сохранением рисунка

Простейший код для тестов

  if(ChartScreenShot(0,filename,ScreenWidth,ScreenHeight,ALIGN_RIGHT)) {
    int cont = 0;
    while(!IsStopped() && cont < 50) {
      if(FileIsExist(filename)) { // файла нет, поэтому цикл проходит все 50 итераций
        int h = FileOpen(filename, FILE_READ|FILE_BIN|FILE_ANSI);
        if(h >= 0) {
          ulong file_size = FileSize(h);
          FileClose(h);
          if(file_size > 0) 
            break;
        }
      }
      cont++;
      SleepSpin(300000); // Пауза
      Print(cont);
    }
  }
//-
// читаем gif в массив
  int h=FileOpen(filename, FILE_READ|FILE_WRITE|FILE_BIN|FILE_ANSI);
  if(h<0) {
    Print("-err Open gif-file "+filename);
    return(false);
  }

  uchar gif[];
// прочитали файл в массив
  if(FileSize(h)==0 || FileReadArray(h,gif)!=FileSize(h)) {
    FileClose(h);  // закрыли файл
    Print("File Read Error: "+filename);
    return(false);
  }
//+------------------------------------------------------------------+
//| Spin sleep                                                       |
//+------------------------------------------------------------------+
void SleepSpin(ulong microseconds)
{
  ulong start=GetMicrosecondCount();
  while((GetMicrosecondCount()-start)<microseconds) {
  }
}

Печать

--

Пока цикл не пойдёт до конца, файл в папке создан не будет!

НО, после прохождения цикла файл создаётся сразу, но с чистым графиком - без индикаторов и объектов.

Если цикл убрать - файл создаётся правильный, но с задержкой, и прочитать его невозможно - он ещё пустой = нужна пауза.

Именно в паузе для индикатора есть проблема.

 
Vitaly Muzichenko #:

После долгих тестов выяснилось, что в индикаторе на мт5 целая история с сохранением рисунка

Простейший код для тестов

Печать

--

Пока цикл не пойдёт до конца, файл в папке создан не будет!

НО, после прохождения цикла файл создаётся сразу, но с чистым графиком - без индикаторов и объектов.

Если цикл убрать - файл создаётся правильный, но с задержкой, и прочитать его невозможно - он ещё пустой = нужна пауза.

Именно в паузе для индикатора есть проблема.

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

 
Galim_V #:

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

Как это реализовать, чтобы после сигнала сохранения изображения, через 3-5 секунд начать читать файл?

--

P.S. Сейчас без паузы изображение не успевает создаться и начинается чтение, при таком раскладе файл создаётся с нулевым размером (пустой)

 
Vitaly Muzichenko #:
через 3-5 секунд начать читать файл?

datetime timeToRead=0;

void DoScreenshot() {

....

timeToRead=TimeLocal()+Nseconds;

}

void OnTimer() {

if (timeToRead!=0 && TimeLocal()<timeToRead) {

               if (ReadFuxingFile()) {

timeToRead=0;

}

        }

}

PS/ @#45й бабай, за столько лет так и не смогли сделать форматирование кода...может веб-деятелям ссылок подкинуть ? на бест-практис и готовые библиотеки