MetaEditor/MQL4 ExpertAdviser: Объявление локальной переменной больше одного раза?

Я смотрю на какой-то старый код MetaEditor4/MQL4, где дважды была объявлена ​​локальная переменная:

......
1 int start()                                     
2   {
3     if (1==2)
4       {
5          double myVar = 1;
6       } else
7       {
8          double myVar = 2;
9       }
10    return;                                      
11  }
.......

Процесс компиляции в MetaEditor версии 5.00, build 1601 завершается с ошибкой:

'myVar' - variable already defined в строке 8.

Если я уберу строку 8, компиляция пойдет хорошо.

Мои вопросы:

1. Есть ли в MetaEditor опция, допускающая многократное объявление локальной переменной?

2. В предыдущих версиях MetaTrader Terminal 4/MetaEditor и .MQ4 кода: можно ли было объявить локальную переменную более одного раза в такой ситуации?

3. MetaEditor имеет версию 5.00, build 1601, но расширение кода .mq4, и он был установлен вместе с программным обеспечением терминала MetaTrader MetaTrader4 (от FXCM). Поэтому я предполагаю, что все еще могу использовать код .MQ4 с ним. Есть ли шанс получить откуда-то чистую установку MQL4? Всякий раз, когда я устанавливаю mt4 (например, из: загрузка mt4), он заканчивается установщиком mt5.


person Community    schedule 21.02.2018    source источник


Ответы (2)


Пролог:

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

Столкнувшись с необходимостью реинжиниринга кодовой базы, охватывающей несколько человеко-десятилетий, я могу рассказать вам много историй о том, что сработало, а что нет.


"Старый код" вместо Нового-MQL4.56789

Если из этого следует вынести что-то одно, никогда не пытайтесь «обойти» New-MQL4, а лучше пересмотрите код и рефакторинг «Старого кода» — это более безопасный способ выжить (намного дольше).

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

Объявление 1 + 2 )
Компилятор по-прежнему допускает несколько объявлений, но не в одной области видимости.

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

2 ...
3 if (  1 == 2 ) {
4       ...
5       double myVar = 1; // myVar declared & known  |since HERE >
6       ...              //        masking any other,|known HERE :
7       ...             //                           |known HERE : 
8 } else               //                            |till  HERE . Undef further
9 {
10      ...
11      double myVar = 2; // myVar declared & known  |since HERE >
12                       //        masking any other,|known HERE :
13       ...            //                           |known HERE :
14 }                   //                            |till  HERE . Undef further

таким образом, если была какая-либо переменная с _global_ областью действия с тем же именем myVar, она не будет "видима" во время существования локально объявленной переменной с тем же именем.

Наконец, если выполнение кода ускользнуло от любой из строк 8 или 14 дальше, локально объявленная переменная double myVar просто перестала существовать, и это поведение в принципе правильно ( а «старые» версии компилятора терпели своего рода опасную привычку побочных эффектов, в течение многих лет терпимого распространения области действия, поэтому пришло время очистить правила, чтобы соответствовать справедливому уровню стандартов C/S.


Дополнение 3) язык многое получает от MQL5, даже если не используется в MQL4

Да, MetaEditor корректно скомпилирует код MQL4 в формат исполнения кода .mq4, здесь нет проблем. Даже процесс автоматического обновления начал идти независимо от (автоматического) обновления платформы терминала MT4 (так что вы довольно часто будете видеть новый файл справки и принудительную перекомпиляцию всех ваших видимых активов .MQ4 на локальном хосте в обновлен формат .EX4, так что "Не паникуйте".

Лучше никогда не устанавливать MT4, не зависящий от брокера, всегда обращайтесь в службу поддержки своего брокера и получайте установочный пакет и помощь от своего брокера. Это деловые отношения, которые вы подписали в контракте, поэтому сохраните эти строки, поскольку вы собираетесь торговать своими деньгами на столе, на котором они работают в соответствии с установленными Условиями и положениями. У некоторых брокеров есть средства настройки платформы, поэтому лучше воспользоваться их пользовательскими настройками, которые будут соответствовать их автоматизации на стороне сервера.

Это больше вопрос экономии усилий НИОКР. (Можно много прочитать о языковых компонентах, внедряемых из домена MQL5, в справке MQL4 редактора IDE). Это естественная воля стратегии дизайна продукта, а не удваивать усилия на двойной линии. Без сомнения, есть много деталей, файл справки можно было бы улучшить и лучше поддерживать, здравый смысл здесь состоит в том, чтобы жить с фактами и заново изучать, какие недавно введенные функции остаются нейтральными для кодовой базы MQL4, а какие новые вещи могут действительно помочь много в аспектах, где старые компиляторы были ограничены в возможностях.

Если кто-то возразит, что некоторые шаги по перепроектированию компилятора/платформы были плохими, я бы согласился на однопоточную, критичную для платформы, потенциально блокирующую концентрацию выполнения всех CustomIndicator-ов только в одном SPoF. -нить.

Но C'est La Vie, пока системные архитекторы не пересмотрят этот SPoF, платформа останется подверженной крашам из-за этой фичи, но мяч находится на другой стороне площадки и там придется внедрять изменения.

person user3666197    schedule 21.02.2018

  1. код может быть запущен в строгом или нестрогом режиме. строгий означает, что переменная должна быть объявлена ​​в пределах его области видимости, нестрогий — вся та каша, которая у вас сейчас. поэтому поставьте #property strict в начале файла
  2. откройте где-нибудь демо-счет и установите туда мт4. демо может быть действительно в течение 30 дней только при регистрации через сайт брокера или с неограниченным и открытым демо из мт4 (пример - Альпари)
person Daniel Kniaz    schedule 21.02.2018