Хотя
MQL4
может выглядеть как язык C,
остерегайтесь, что это не
( +
у него есть пара режимов компиляции,
которые иметь СОВСЕМ РАЗНОЕ исполнение кода ОДНОГО И ТОГО ЖЕ ИСХОДНОГО КОДА
... так что Дьявол прячется в деталях
)
Ваши первоначальные заметки о сходстве могут и будут вызывать много неприятностей в будущем.
Забудьте о C
.
Тревожную директиву Ассемблера стоит повторить #ASSUME NOTHING
string
— это не string
, а частный случай struct
, и список различий растет.
MQL4
просто не является языком C.
Чем раньше человек осознает, тем лучше.
Во-первых,
модель выполнения языка подчинена трем очень разным моделям:
- в MQL4 Script
-- отключена от асинхронного внешнего FxMarketEventSTREAM
< /strong>
- в MQL4 Expert Advisor
-- выполнение кода инициируется FxMarketEventSTREAM
- в MQL4 Custom Indicator
-- выполнение кода (суб)-пакетный запуск после запуска по фронту FxMarketEventSTREAM
Это то, чего нет ни в одном C-языке.
Во-вторых,
синтаксис языка развивается (точнее, ползет вверх), и начинают применяться новые ограничения. Единственный способ справиться с этим — перечитывать MQL4
Документацию буквально при каждом обновлении, да, при каждом обновлении. На этом шаге можно избежать нежелательных сюрпризов (после компиляции остается еще больше сюрпризов - нужно сказать, что некоторые части предоставленной документации явно неверны, некоторые остаются понятными, пока вы не скомпилируете "совместимый" код, и он не получит отбрасывается компилятором/парсером Худшее происходит в случаях, которые волшебным образом «проходят» через фазу компилятора/парсера и остаются, вызывая у вас кошмары во время выполнения, где искалеченный код делает странные вещи, которые все еще прошли все ограничения компиляции/выполнения, но произвести хаос (конечно, другая история, но размещенная для полного предупреждения о MQL4
-экосистемных рисках и опасных зонах - так что забудьте о языке C, ваш самый жестокий враг находится внутри версий MetaQuotes Language ( New-< /em>MQL4.56789...
) эволюция )
НовыйMQL4.56789
ввел режим двойной компиляции — #strict
и старый
Одно из "новых" изменений (которое потребовало нескольких человеко-лет перепроектирования кодовой базы) — это ограниченная область видимости переменных. Помимо двойной конструкции глобальной переменной, "New"-MQL4.56789
начал "обрамлять" видимость объявленной переменной, так что "вне" "внешнего" конструктора такой переменной символ перестает существовать и, таким образом, не определено, как сообщает ваша ошибка времени компиляции.
Q1: решено, if(){...}else{...}
были ограничениями для обеих пар объявлений (в квадратных скобках {...}
были две смежные области, где double
s были определены и "видимы") и ваш исходный код, за пределами {...}
-zone пытался сослаться на символ, который не был «известен» за пределами области объявления, поэтому компилятору пришлось сообщить об этом как "- undefined identifier"
, поскольку он понятия не имел, что должен означать этот идентификатор.
Вопрос 2. Да, в операторе if(){...}
можно определять переменные. Такие переменные остаются определенными "внутри" области видимости их {...}
-внешнего блока. Можно воспользоваться еще одной особенностью архитектуры — модификатором объявления static
. Это будет поддерживать постоянство значения такой определенной переменной во время выполнения кода в течение всего жизненного цикла среды выполнения кода, и всякий раз, когда путь выполнения кода повторно входит в область {...}
-видимости переменной, ее значение) при каждом повторном использовании. запись остается повторно сохраненной для повторного использования.
Q3+Q4: Объявление переменной — это принципиально важный шаг, а присвоение значения — еще один. Сказав это, можно наблюдать проблемы при попытке объявить + присвоить значения за один шаг. Там зависимость может создать проблемы для компилятора - в некоторых предыдущих MQL4
-сборках это было так - этот компилятор попросили решить неразрешимую проблему, когда назначение зависело (от других переменных, как вы это называете) для некоторых операций/значений, которые были недоступны во время компиляции. Ваша мотивация ясна и выполнима, однако, пожалуйста, попробуйте разработать свой код с помощью этого небольшого уровня понимания синтаксических спецификаций и принципиальных различий между состояниями компиляции кода и состояния выполнения кода.
Эпилог: Не паникуйте и наслаждайтесь миром алгоритмической торговли.
person
user3666197
schedule
02.03.2016