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

 
Alexey Kozitsyn:
Индикаторы/советники есть на графиках?
Советников нет, из индикаторов только объёмы стандартные из терминала
 
Sergey Parkin:
Советников нет, из индикаторов только объёмы стандартные из терминала
Т.е. открыли график, нанесли горизонтальную линию, закрыли терминал, открыли терминал, график (открытый для нанесения линии) на месте, а самой линии нет?
 
Alexey Kozitsyn:
Т.е. открыли график, нанесли горизонтальную линию, закрыли терминал, открыли терминал, график (открытый для нанесения линии) на месте, а самой линии нет?
именно так
 
Sergey Parkin:
именно так

Мистика, такого быть не должно... 

 

Приветствую! Подскажите, пожалуйста, как можно программно проверить наличие или отсутствие определенного пользовательского индикатора в папке MQL4\Indicators по его имени ?

То есть это нужно мне для проверки, что функция iCustom нашла индикатор и работает с ним. 

Проверяем есть ли индикатор с таким именем ( не знаю как ) 

if( !=Indicatorname)// Ну или другой "сигнал", что индикатора с таким именем нет, типа -1, false ...

{тут я чего-нибудь прописываю :)}  

else // Получаем значение с индкатора

iCustom(....Indicatorname....);

 } 

Подозреваю, что тема лежит в плоскости "Файловые операции без ограничений" ( может ошибаюсь), но с системными библиотеками, которые обычно используют в "этой теме" никогда не сталкивался...

В общем, нужен совет..., может уже и что-то готовое есть.., или хотя бы - куда "копать" 

Спасибо 

 
Ilya Melamed:

Приветствую! Подскажите, пожалуйста, как можно программно проверить наличие или отсутствие определенного пользовательского индикатора в папке MQL4\Indicators по его имени ?

То есть это нужно мне для проверки, что функция iCustom нашла индикатор и работает с ним. 

Проверяем есть ли индикатор с таким именем ( не знаю как ) 

if( !=Indicatorname)// Ну или другой "сигнал", что индикатора с таким именем нет, типа -1, false ...

{тут я чего-нибудь прописываю :)}  

else // Получаем значение с индкатора

iCustom(....Indicatorname....);

 } 

Подозреваю, что тема лежит в плоскости "Файловые операции без ограничений" ( может ошибаюсь), но с системными библиотеками, которые обычно используют в "этой теме" никогда не сталкивался...

В общем, нужен совет..., может уже и что-то готовое есть.., или хотя бы - куда "копать" 

Спасибо 

лучше подключите индикатор как ресурс, тогда не нужно будет его искать, он будет всегда рядом
 
Sergey Gritsay:
лучше подключите индикатор как ресурс, тогда не нужно будет его искать, он будет всегда рядом
Индикаторы будет подключать пользователь, потому и нужна проверка, что если пользователь ошибся в имени индикатора, то iCustom возвращает просто нули в качестве информации, не разбираясь, что индюка просто нет
 
Ilya Melamed:
Индикаторы будет подключать пользователь, потому и нужна проверка, что если пользователь ошибся в имени индикатора, то iCustom возвращает просто нули в качестве информации, не разбираясь, что индюка просто нет

тогда вам в файловые операции может помогут, вот пример из документации поиска файла

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- дата для старых файлов
input datetime InpFilesDate=D'2013.01.01 00:00';
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string   file_name;      // переменная для хранения имен файлов
   string   filter="*.txt"; // фильтр для поиска файлов
   datetime create_date;    // дата создания файла
   string   files[];        // список имен файлов
   int      def_size=25;    // размер массива по умолчанию
   int      size=0;         // количество файлов
//--- выдели память для массива
   ArrayResize(files,def_size);
//--- получение хэндла поиска в корне локальной папки
   long search_handle=FileFindFirst(filter,file_name);
//--- проверим, успешно ли отработала функция FileFindFirst()
   if(search_handle!=INVALID_HANDLE)
     {
      //--- в цикле перебираем файлы
      do
        {
         files[size]=file_name;
         //--- увеличим размер массива
         size++;
         if(size==def_size)
           {
            def_size+=25;
            ArrayResize(files,def_size);
           }
         //--- сбрасываем значение ошибки
         ResetLastError();
         //--- получим дату создания файла
         create_date=(datetime)FileGetInteger(file_name,FILE_CREATE_DATE,false);
         //--- проверим, старый ли файл
         if(create_date<InpFilesDate)
           {
            PrintFormat("Файл %s удален!",file_name);
            //--- удаляем старый файл
            FileDelete(file_name);
           }
        }
      while(FileFindNext(search_handle,file_name));
      //--- закрываем хэндл поиска
      FileFindClose(search_handle);
     }
   else
     {
      Print("Files not found!");
      return;
     }
//--- проверим какие из файлов остались
   PrintFormat("Результаты:");
   for(int i=0;i<size;i++)
     {
      if(FileIsExist(files[i]))
         PrintFormat("Файл %s существует!",files[i]);
      else
         PrintFormat("Файл %s удален!",files[i]);
     }
  }

 ....

 
Sergey Gritsay:

тогда вам в файловые операции может помогут, вот пример из документации поиска файла

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- дата для старых файлов
input datetime InpFilesDate=D'2013.01.01 00:00';
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string   file_name;      // переменная для хранения имен файлов
   string   filter="*.txt"; // фильтр для поиска файлов
   datetime create_date;    // дата создания файла
   string   files[];        // список имен файлов
   int      def_size=25;    // размер массива по умолчанию
   int      size=0;         // количество файлов
//--- выдели память для массива
   ArrayResize(files,def_size);
//--- получение хэндла поиска в корне локальной папки
   long search_handle=FileFindFirst(filter,file_name);
//--- проверим, успешно ли отработала функция FileFindFirst()
   if(search_handle!=INVALID_HANDLE)
     {
      //--- в цикле перебираем файлы
      do
        {
         files[size]=file_name;
         //--- увеличим размер массива
         size++;
         if(size==def_size)
           {
            def_size+=25;
            ArrayResize(files,def_size);
           }
         //--- сбрасываем значение ошибки
         ResetLastError();
         //--- получим дату создания файла
         create_date=(datetime)FileGetInteger(file_name,FILE_CREATE_DATE,false);
         //--- проверим, старый ли файл
         if(create_date<InpFilesDate)
           {
            PrintFormat("Файл %s удален!",file_name);
            //--- удаляем старый файл
            FileDelete(file_name);
           }
        }
      while(FileFindNext(search_handle,file_name));
      //--- закрываем хэндл поиска
      FileFindClose(search_handle);
     }
   else
     {
      Print("Files not found!");
      return;
     }
//--- проверим какие из файлов остались
   PrintFormat("Результаты:");
   for(int i=0;i<size;i++)
     {
      if(FileIsExist(files[i]))
         PrintFormat("Файл %s существует!",files[i]);
      else
         PrintFormat("Файл %s удален!",files[i]);
     }
  }

 ....

Файлы не могут быть за пределами файловой песочницы. Папка Indicators не входит в неё же.
 
Sergey Gritsay:

тогда вам в файловые операции может помогут, вот пример из документации поиска файла


  }

 ....

а нет штатными средствами вы не залезете наверно в папку с индикаторами, попробуйте еще это пример разобрать, если не поможет, то только через вин апи

//--- покажем окно входных параметров при запуске скрипта
#property script_show_inputs
//--- фильтр
input string InpFilter="Dir1\\*";
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   string file_name;
   string int_dir="";
   int    i=1,pos=0,last_pos=-1;
//--- ищем последний бэк-слеш
   while(!IsStopped())
     {
      pos=StringFind(InpFilter,"\\",pos+1);
      if(pos>=0)
         last_pos=pos;
      else
         break;
     }
//--- в фильтре присутствует имя папки
   if(last_pos>=0)
      int_dir=StringSubstr(InpFilter,0,last_pos+1);
//--- получение хэндла поиска в корне локальной папки
   long search_handle=FileFindFirst(InpFilter,file_name);
//--- проверим, успешно ли отработала функция FileFindFirst()
   if(search_handle!=INVALID_HANDLE)
     {
      //--- в цикле проверим являются ли переданные строки именами файлов или директорий
      do
        {
         ResetLastError();
         //--- если это файл, то функция вернет true, а если директория, то функция генерирует ошибку ERR_FILE_IS_DIRECTORY
         FileIsExist(int_dir+file_name);
         PrintFormat("%d : %s name = %s",i,GetLastError()==ERR_FILE_IS_DIRECTORY ? "Directory" : "File",file_name);
         i++;
        }
      while(FileFindNext(search_handle,file_name));
      //--- закрываем хэндл поиска
      FileFindClose(search_handle);
     }
   else
      Print("Files not found!");
  }

 ...

Причина обращения: