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

 
Mihail Matkovskij #:

Ну в  ENUM_TIMEFRAMES минимальное и максимальное значение известны. Поэтому их можно задать явно.

С остальными enum, достаточно знать их примерный диапазон значений. Если в объявлении enum константы не заданы, то значения там обычно идут от 0. i_max_enum можно задать любым двузначным или трёхзначным числом: 50, 100, 255.

Также можно получить минимальное и максимальное значение enum экспериментальным путём. Записать их и указывать в StringToEnum для наиболее оптимальной скорости:

int nEnum;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max, int _minEnum, int _maxEnum) {
  T enum_;
  int min, max;
  min = INT_MAX; max = INT_MIN;
  nEnum = 0;
  for(int i = _minEnum; i <= _maxEnum && !IsStopped(); i++) {
    enum_ = (T)i;
    if(StringFind(EnumToString(enum_), "::", 0) >= 0)
      continue;
    if (i < min)
      min = i;
    if (i > max)
      max = i;
    nEnum++;
  }
  if (min != INT_MAX && max != INT_MIN) {
    __min = min;
    __max = max;
    return true;
  }
  return false;
}

template <typename T>
bool enumFindMinMax(const T _enum, int &__min, int &__max) { return enumFindMinMax(_enum, __min, __max, INT_MIN, INT_MAX); }

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart() {
  int min, max;
  if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))
    printf("enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: %d, max: %d, Count: %d", min, max, nEnum);
  else
    Print("enumFindMinMax Error!");
}

Результат работы скрипта:

enumFindMinMax ENUM_ACCOUNT_INFO_DOUBLE min: 37, max: 52, Count: 14

Открываем ENUM_ACCOUNT_INFO_DOUBLE и смотрим. Количество констант равно Count (14). Таким образом при запуске приложения можно обработать все необходимые enum записать их минимальные и максимальные значения и использовать в  StringToEnum соответствующие min и max с наиболее оптимальной скоростью.

P.S. Второй вариант enumFindMinMax с INT_MIN и INT_MAX действительно очень медленный. Я попробовал сначала его. А потом мне надоело ждать завершения работы  enumFindMinMax  и я поставил значения от -500 до 500

if (enumFindMinMax((ENUM_ACCOUNT_INFO_DOUBLE)0, min, max, -500, 500))

Таким образом я пришел к выводу что использовать весь диапазон int совсем необязательно.

Файлы:
 

Столкнулся со странным поведением терминала.

Ситуация такая: на одном графике работает эксперт, который в определенный момент открывает другой график и устанавливает на новом графике определенный темплет. В этом темплете прописан запуск на новом графике второго эксперта.

Все прекрасно работает посреди недели, но на закрытом рынке, в выходные, новый темплет на новом графике запускается (это видно по изменению внешности графика), а второй эксперт не стартует на нем. Единственный способ "толкнуть" второй эксперт -- это вручную запустить на любом графике какой-угодно скрипт, пусть даже пустой абсолютно. Тогда и второй эксперт на новом графике начинает работать.

Я писал этот код в первом эксперте и с помощью функций ChartOpen и ChartApplyTemplate и с помощью класса CChart -- всегда одно и тоже получается, на закрытом рынке второй эксперт на новом графике не стартует пока вручную не "толкнуть" терминал как-нибудь.

Может кто сталкивался с подобным? Как с этим бороться, в какую сторону "копать"?

 
akskarabey #:

Столкнулся со странным поведением терминала.

Ситуация такая: на одном графике работает эксперт, который в определенный момент открывает другой график и устанавливает на новом графике определенный темплет. В этом темплете прописан запуск на новом графике второго эксперта.

Все прекрасно работает посреди недели, но на закрытом рынке, в выходные, новый темплет на новом графике запускается (это видно по изменению внешности графика), а второй эксперт не стартует на нем. Единственный способ "толкнуть" второй эксперт -- это вручную запустить на любом графике какой-угодно скрипт, пусть даже пустой абсолютно. Тогда и второй эксперт на новом графике начинает работать.

Я писал этот код в первом эксперте и с помощью функций ChartOpen и ChartApplyTemplate и с помощью класса CChart -- всегда одно и тоже получается, на закрытом рынке второй эксперт на новом графике не стартует пока вручную не "толкнуть" терминал как-нибудь.

Может кто сталкивался с подобным? Как с этим бороться, в какую сторону "копать"?

Как определили, что не стартует, по чём это видно?

P.S.

Попробуйте вот так

int OnInit()
{
....
....

 ChartRedraw();
  return(INIT_SUCCEEDED);
}
 
Mihail Matkovskij #:

Можно найти константу в enum с помощью функции с перебором (по тому же принципу  ), переводя её с помощью EnumToString и сравнивая с искомой. Останется только вернуть результат.

 А можно всё-таки пример (или хотя бы ключевую строчку), а то что-то на ум ничего не идёт? Это тоже будет перебор огромного списка значений с просеиванием нужных среди левых или там перебор только полезных значений? На данный момент мне кажется, что там не из чего просеивать, там же в списке нет левых-то... но уцепиться за идею никак не могу.

 
x572intraday #:

 А можно всё-таки пример (или хотя бы ключевую строчку), а то что-то на ум ничего не идёт? Это тоже будет перебор огромного списка значений с просеиванием нужных среди левых или там перебор только полезных значений? На данный момент мне кажется, что там не из чего просеивать, там же в списке нет левых-то... но уцепиться за идею никак не могу.

Чтобы не перебирать все возможные значения enum (поскольку это действительно долго) следует произвести следующие приготовления  (что-то вроде кеширования). Далее с помощью данной функции  можно легко перевести строку/строки в enum зная диапазоны всех нужных enum. Или искать enum в сравнительно нешироком диапазоне  .

template<typename T>
bool StringToEnum(const string i_str, T &o_val, int i_min_enum, int i_max_enum)
{
   for(int i = i_min_enum; i <= i_max_enum && !IsStopped(); i++) {
     o_val = (T)i;
     if(i_str == EnumToString(o_val))
       return(true);
   }
   o_val = WRONG_VALUE;
   return(false);
}


template<typename T>
bool StringToEnum(const string i_str, T &o_val) { return StringToEnum(i_str, o_val, INT_MIN, INT_MAX); } // медленный вариант
 
Vitaly Muzichenko #:

Как определили, что не стартует, по чём это видно?

P.S.

Попробуйте вот так

Второй эксперт в секции OnInit делает выводы в лог и их нет логе. Нет в логе даже сообщений самого терминала о старте эксперта. И на графике не появляется название эксперта в правом верхнем углу.

 
12345678902003 #:
А какая функция для этого используется? MqlRates? А если через ObjectGet то там я должен указать свойство объекта, если взять OBJPROP_PRICE то как сделать что бы он получал цену до текущего бара. 

Получить это Гет. И есть функция получения цены или времени на баре с объекта по имени или по типу обьекта и имени получить определенное свойство объекта. Не номер бара, а смещение от нулевого используется.

 
Valeriy Yastremskiy #:

Получить это Гет. И есть функция получения цены или времени на баре с объекта по имени или по типу обьекта и имени получить определенное свойство объекта. Не номер бара, а смещение от нулевого используется.

Можно это сделать с помощью функции    ObjectGetValueByTime()

Пример

double p = ObjectGetValueByTime( 0,"имя объекта...",Time[0]);
 
У меня проблема в следующем- В списке индикаторов в папке Terminal\MQL4\Indicators индикаторы есть, а  непосредственно в самом терминале MQL4 в его списке из которого эти индикаторы перетаскиваются на график, этих самых индикаторов нет. Как сделать так, чтобы и на самом терминале в его списках эти индикаторы появились тоже, чтобы ими можно было пользоваться на графике терминала   MQL4  ? На скрине правая сторона это те  индикаторы , что доступны в  терминала   MQL4, а на лево от него индикаторы этого же терминала в папке   MQL4 4\Indicators (как пример)
Файлы:
 
Halina Okopna-Pecuch #:
У меня проблема в следующем- В списке индикаторов в папке Terminal\MQL4\Indicators индикаторы есть, а  непосредственно в самом терминале MQL4 в его списке из которого эти индикаторы перетаскиваются на график, этих самых индикаторов нет. Как сделать так, чтобы и на самом терминале в его списках эти индикаторы появились тоже, чтобы ими можно было пользоваться на графике терминала   MQL4  ? На скрине правая сторона это те  индикаторы , что доступны в  терминала   MQL4, а на лево от него индикаторы этого же терминала в папке   MQL4 4\Indicators (как пример)

Вероятно что это не индикаторы.

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