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

 
tvv:

Я не понял. Эта опция указывает на местоположение файла - \\MetaQuotes\Terminal\Common. Без этой опции я не смогу взять файл, который сформировался в тестере. Без этой опции файл будет искаться в MQL4\Files - а туда файл из тестера я не смогу положить.

Именно на отсутствие этого флага я указал.

 
Alexey Viktorov:

Именно на отсутствие этого флага я указал.

Спасибо за помощь - это просто опечатка - я этот флаг знаю. Проблема не решена - файл не хочет открываться в режиме общего чтения - даже без использования тестера. Пока этот файл открыт индикатором - скрипт не может его открыть. А вот Блокнот открывает его без проблем.

 
tvv:

Спасибо за помощь - это просто опечатка - я этот флаг знаю. Проблема не решена - файл не хочет открываться в режиме общего чтения - даже без использования тестера. Пока этот файл открыт индикатором - скрипт не может его открыть. А вот Блокнот открывает его без проблем.

Попробуй периодически принудительно скидывать данные на диск FileFlush().


зы: вот ещё что заметил не сразу

tvv:

ExtHandle=FileOpen(c_symbol+(string)20+".csv",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ|FILE_SHARE_READ|FILE_COMMON);
Файл в скрипте открыт так: ExtHandleR=FileOpen("EURUSD20.csv",FILE_BIN|FILE_READ|FILE_SHARE_READ);
Прошу указать на мою ошибку.

Странно что читает. Должен быть флаг FILE_CSV
FileFlush - Файловые операции - Справочник MQL4
FileFlush - Файловые операции - Справочник MQL4
  • docs.mql4.com
При выполнении операции записи в файл физически данные могут оказаться в нем только через некоторое время. Для того чтобы данные сразу же сохранились в файле, нужно использовать функцию FileFlush(). Если не использовать функцию, то часть данных, еще не попавших на диск, принудительно записывается туда только при закрытии файла функцией...
 
Alexey Viktorov:

Попробуй периодически принудительно скидывать данные на диск FileFlush().


зы: вот ещё что заметил не сразу

Странно что читает. Должен быть флаг FILE_CSV

.CSV - это расширение файла - оно может быть любое - я выбрал такое, чтобы можно было в Блокноте смотреть. Вот интересная статья - https://www.mql5.com/ru/articles/2720. Мой код соответствует правилам, которые там описаны - но не могу прочитать файл программно. в режиме FILE_SHARE_READ. Для файла EURUSD20.HST с расширением .HST - флаг должен быть FILE.BIN, так чтобы в МТ4 файл можно было открыть автономно.

Основы программирования на MQL5: Файлы
Основы программирования на MQL5: Файлы
  • 2016.09.28
  • Dmitry Fedoseev
  • www.mql5.com
Функции для работы с файлами есть почти во всех языках программирования, и MQL5 в этом смысле — не исключение. Хотя при программировании советников и индикаторов на MQL5 работать с использованием файлов приходится не всегда, (а скорее даже — очень редко), но тем не менее, каждый экспертописатель рано или поздно с этим сталкивается. Диапазон...
 
tvv:

.CSV - это расширение файла - оно может быть любое - я выбрал такое, чтобы можно было в Блокноте смотреть. Вот интересная статья - https://www.mql5.com/ru/articles/2720. Мой код соответствует правилам, которые там описаны - но не могу прочитать файл программно. в режиме FILE_SHARE_READ. Для файла EURUSD20.HST с расширением .HST - флаг должен быть FILE.BIN, так чтобы в МТ4 файл можно было открыть автономно.

Я пробовал работать не в тестере а просто на обычном графике (EURUSD M1) - запускаю индикатор, который формирует ТФ М20.

Код открытия файла:

ExtHandle= FileOpen("EURUSD20.csv",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_READ|FILE_SHARE_READ).

Этот файл в этом случае появится в папке MQL4\Files. Далее запуска скрипт на обычном графике (EURUSD M5), который копирует содержимое файла EURUSD20.csv в файл EURUSD20.HST. Файл EURUSD20.HST формируется в папке history в том же каталоге, что и MQL4.

Код скрипта: 

файл для чтения ExtHandleR=FileOpen("EURUSD20.csv",FILE_BIN|FILE_READ|FILE_SHARE_READ);

файл для записи  ExtHandleW=FileOpenHistory("EURUSD20.hst",FILE_BIN|FILE_WRITE|FILE_SHARE_WRITE|FILE_SHARE_READ);

Все работает только тогда, когда я удаляю индикатор с графика М1. То есть режим разделения файла по чтению у меня не работает.

 

Здравствуйте! Что за глюк  метатрейдера на графике евродолар? Появилась дневная свеча за восскресенье 9.10.2011 , на часовом графике только один час 23:00 за это число. Наверно это связано с переводом часов на зимнее время. Как это исправить? Раньше этой свечи не было.

 
tvv:   Все работает только тогда, когда я удаляю индикатор с графика М1. То есть режим разделения файла по чтению у меня не работает.

Проблема решается так: Программа, записывающая файл, должна после каждой операции записи закрывать файл FileClose тем самым освобождая его для чтения другой программой. Это связано с тем, что данные при записи сначала попадают в буфер и в файле физически какое-то время отсутствуют. Закрытие файла освобождает буфер в файл. Перед следующей записью

   // Открытие или создание файла и перемещение указателя в конец
   Файл = FileOpen(ИмяФайла, FILE_CSV | FILE_READ | FILE_WRITE, " "); // еще COMMON  SHARE...
   FileSeek(Файл, 0, SEEK_END);

файл снова открывается и указатель перемещается к концу

 

Здравствуйте! Подскажите а верным ли будет утверждение, что получаемое количество пунктов будет одинаково в обоих выражениях?? Мне это действительно важно!

"Цена закрытия последнего закрытого ордера"-Ask>=30*Point

Ask-"Цена закрытия последнего закрытого ордера">=30*Point //Если цена Выше

Точнее сказать Ведь пункты не могут быть отрицательными??? Или все же.....))

 

Добрый вечер.

Начал изучать mql5 появилось несколько вопросов, поэтому прошу помощи.

Задача получить в массив значения хаев n последних свечей, и отсортировать массив отобрав только не побитые хаи.

Написал такую функцию:

double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
   {
      double high=0;
      int k=0;
      int s=0;
      ArraySetAsSeries(High,true);
         if(CopyHigh(Symbol(),Period(),0,NumCand,High)==-1)
               {
               Print("Не удалось скопировать значения цен High! Код ошибки = ",GetLastError());
               }  
               
      
       for(int x=NumCand-1; x==0; x--)
            {
            if(IsStopped())
            break;
                  for (int j = NumCand-x-1; j == 0; j--) 
                  {
                  if (High[j+1] > High[j])
                     {
                     // Если хай не побит записываем в массив
                     temp[k] = High[j+1];
                     k++;
                     }   
                   }
            }
      s=sizeof(temp);               
      high=temp[index];
      return(high);
   } 

Выдает ошибку array out of range. в строке.

 high=temp[index];

Данная ошибка, как я понял, вызвана обращением к несуществующей ячейки массива.

Но найти ошибку с хода не смог, подскажите где накосячил, или может есть более элегантная сортировка.

 
WhiteBerkut:

Добрый вечер.

Начал изучать mql5 появилось несколько вопросов, поэтому прошу помощи.

Задача получить в массив значения хаев n последних свечей, и отсортировать массив отобрав только не побитые хаи.

Написал такую функцию:

Выдает ошибку array out of range. в строке.

Данная ошибка, как я понял, вызвана обращением к несуществующей ячейки массива.

Но найти ошибку с хода не смог, подскажите где накосячил, или может есть более элегантная сортировка.

Сравните значение index с размерностью массива. Учтите, что элементы массива нумеруются с нуля, и номер последнего на 1 меньше размерности. А NumCand чему равно?
Причина обращения: