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

 
Artyom Trishkin:
В справке написано что для чего нужно. И, да, это правильно, что введённый пользователем параметр нельзя программно менять. Хоть что-то принадлежать может пользователю :)

Если очень хочется - то можно)

 
Vitaly Muzichenko:

Если очень хочется - то можно)

Можно конечно, если переназначить. Но введённое пользователем значение останется без изменений.
 

Часто сталкиваюсь с проблемой. Компилятор ругается ошибкой "variable already defined" на код:

if (n<10)
 {
  int a=10;
 }
else
 {
  int a=5;
 }

В справочнике по ссылке https://docs.mql4.com/ru/basis/variables/local указано:

Переменные, объявленные внутри блока (на внутреннем уровне), имеют областью действия блок.

Если блоки вложены и идентификатор во внешнем блоке имеет такое же имя, как идентификатор во внутреннем блоке, идентификатор внешнего блока "невидим" (скрыт) до момента завершения работы внутреннего блока.

Но даже пример из того же справочника не компилируется с этой же ошибкой "variable already defined":

int i=5;      // локальная переменная функции
     {
      int i=10;  // переменная функции 
      Print("В блоке i = ",i); // результат  i = 10;
     }
   Print("Вне блока i = ",i);  // результат  i = 5;

Та же проблема с циклами:

int i=10;
for (int i=1;i<10;i++) ...

Как обойти эту проблему и заставить пример из справочника компилироваться без ошибки "variable already defined"?

 
The_Sheikh:

Часто сталкиваюсь с проблемой. Компилятор ругается ошибкой "variable already defined" на код:

В справочнике по ссылке https://docs.mql4.com/ru/basis/variables/local указано:

Переменные, объявленные внутри блока (на внутреннем уровне), имеют областью действия блок.

Если блоки вложены и идентификатор во внешнем блоке имеет такое же имя, как идентификатор во внутреннем блоке, идентификатор внешнего блока "невидим" (скрыт) до момента завершения работы внутреннего блока.

Но даже пример из того же справочника не компилируется с этой же ошибкой "variable already defined":

Та же проблема с циклами:

Как обойти эту проблему и заставить пример из справочника компилироваться без ошибки "variable already defined"?

#property strict
 
The_Sheikh:

Как обойти эту проблему и заставить пример из справочника компилироваться без ошибки "variable already defined"?

в справочнике давно не все примеры корректно работают

по области видимости в Ваших примерах - видимость в пределах одного оператора локальная, точно должно работать примерно такое:

void OnStart()
  {
   for(int i=0;i<10;i++)
     {
      double x=i;
     }

   for(int i=0;i<10;i++)
     {
      double x=i;
     }
  }

т.е. видимость в пределах оператора for - это локально, при выходе из него будут утеряны переменные i и x

 

Попытался искать последний пик индикатора Peak Repainter для обработки советником:

   GV_trendD1 = StringConcatenate(GVn," дневной тренд");
   if (!GlobalVariableCheck(GV_trendD1))
      {
      double   fUP,fDN;

      for (int f=0; f<=400 && !IsStopped(); f++)
         {
         fUP = iCustom(NULL,PERIOD_D1,"Used\\# Peak Repainter",0,f);
         if (fUP>=15) {GlobalVariableSet(GV_trendD1,1);break;}
         else {fDN = iCustom(NULL,PERIOD_D1,"Used\\# Peak Repainter",1,f); if (fDN>=15) {GlobalVariableSet(GV_trendD1,-1);break;}}
         }
      }

В результате в глобальную переменную записывается 1, даже если на самом деле должна быть -1.

Что не так? С кодом? С индикатором?

Индикатор используется с настройкой по умолчанию.

Файлы:
 
Alexey G. Smolyakov:

Попытался искать последний пик индикатора Peak Repainter для обработки советником:

В результате в глобальную переменную записывается 1, даже если на самом деле должна быть -1.

Что не так? С кодом? С индикатором?

Индикатор используется с настройкой по умолчанию.

Почему такое имя индикатора?

iCustom(NULL,PERIOD_D1,"Used\\# Peak Repainter",0,f);
 
Artyom Trishkin:

Почему такое имя индикатора?

Просто я индикаторы для разных советников держу в разных директориях. И слегка переименовываю, чтобы они группировались.

Имя на что-то влияет?

 
Alexey G. Smolyakov:

Просто я индикаторы для разных советников держу в разных директориях. И слегка переименовываю, чтобы они группировались.

Имя на что-то влияет?

влияет, все обращения к файлам в МТ4 происходят внутри папки MQL4, выход из советников/скриптов/индикаторов за  пределы этой папки исключен из соображений безопасности

 
Igor Makanu:

влияет, все обращения к файлам в МТ4 происходят внутри папки MQL4, выход из советников/скриптов/индикаторов за  пределы этой папки исключен из соображений безопасности

Полный путь папки MQL4\Indicators\Used. Вроде бы за пределы папки нет выхода. Но это отклонение от темы - другие советники работают со своими индикаторами в подобных папках без проблем. Но что за беда с этим индикатором - не понимаю. Смотрел его код, но знаний и опыта разобраться не хватает. Есть подозрение, что он считает только последний бар или что-то такое.