Необъявленный идентификатор MQL4 — как решить эту проблему?

В настоящее время я пытаюсь выучить язык программирования под названием MQL4, который используется для написания торговых алгоритмов. Он очень тесно связан с C++/C/C#, поэтому любой, кто знает эти языки, сможет помочь мне с этим.

Я пытаюсь создать очень простую программу, которая сообщает мне длину верхней и нижней теней (фитили) свечи последних периодов. Для этого я попытался использовать следующий код:

  double    bod1 = Close[1] - Open[1];
  double absbod1 = MathAbs( bod1 );

  if( bod1 >= 0 )
  {
  double uwick1 = High[1] - Close[1];
  double lwick1 = Open[1] - Low[  1];
  }
  else
  {
  double uwick1 = High[ 1] - Open[1];
  double lwick1 = Close[1] - Low[ 1];
  }

  Alert( "Lower Wick: " , lwick1 , " Upper Wick: " , uwick1 );

Вопрос 1. Почему появляется следующее сообщение об ошибке?

ошибка

Вопрос 2. Нельзя ли определить переменные в операторе if(){...}?

Q3: Если нет, то как я могу определить переменную, которая зависит от какого-то другого фактора?

Я имею в виду, предположим, что я хочу определить переменную var таким образом, чтобы var = a ИЛИ < em>var = b в зависимости от того, a > b или нет.

В4. Как мне это сделать, если не с помощью операторов if(){...}, как показано выше?


person M Smith    schedule 29.02.2016    source источник
comment
Перейдите к подразделу, посвященному области видимости переменных в вашем тексте.   -  person WhozCraig    schedule 29.02.2016


Ответы (3)


Если этот язык похож на С++, вы должны определить свою переменную перед блоком if, например:

  double uwick1 = 0;
  if(bod1 >=0)
  {
     uwick1 = High[1]-Close[1];
person marcinj    schedule 29.02.2016
comment
Это избавляет от ошибки, но не решает проблему. Кажется, что когда я изменяю код на то, что вы сказали, он по-прежнему использует любое значение uwick1 и lwick1, которое стоит перед оператором if. - person M Smith; 29.02.2016
comment
@ user2910074: Обратите внимание, что в этом коде присваивание в блоке if НЕ содержит слово double. Если есть слово double, создается новая переменная с тем же именем, присваивается ей и игнорируется внешняя переменная. В коде marcinj это просто присваивание, а не создание новой переменной. - person Mooing Duck; 02.03.2016
comment
@marcinj ваше первоначальное предположение неверно. В вашем посте нет ответов на Q3 + Q4 - person user3666197; 02.03.2016

В языках, подобных C++, переменная, определенная в блоке, существует только внутри этого блока.

Итак, в вашем коде:

double bod1 = Close[1]-Open[1];
double absbod1 = MathAbs(bod1);

if(bod1 >=0)
{
    double uwick1 = High[1]-Close[1];
    double lwick1 = Open[1]-Low[1];
}
else
{
    double uwick1 = High[1]-Open[1];
    double lwick1 = Close[1]-Low[1];
}

Alert("Lower Wick: " , lwick1 , " Upper Wick: " , uwick1);

Переменная uwick1 определяется в блоке if, а затем выходит за рамки. Другая переменная uwick1 определена в блоке else и затем выходит за рамки. Наконец, вызов Alert ссылается на переменную uwick1, но в области видимости нет переменных с таким именем.

Если вы определяете переменные перед условием:

double bod1 = Close[1]-Open[1];
double absbod1 = MathAbs(bod1);

double uwick1;
double lwick1;
if(bod1 >=0)
{
    uwick1 = High[1]-Close[1];
    lwick1 = Open[1]-Low[1];
}
else
{
    uwick1 = High[1]-Open[1];
    lwick1 = Close[1]-Low[1];
}

Alert("Lower Wick: " , lwick1 , " Upper Wick: " , uwick1);

Этот код должен работать так, как вы ожидали.

person Kyle A    schedule 29.02.2016

Хотя
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{...} были ограничениями для обеих пар объявлений (в квадратных скобках {...} были две смежные области, где doubles были определены и "видимы") и ваш исходный код, за пределами {...}-zone пытался сослаться на символ, который не был «известен» за пределами области объявления, поэтому компилятору пришлось сообщить об этом как "- undefined identifier", поскольку он понятия не имел, что должен означать этот идентификатор.

Вопрос 2. Да, в операторе if(){...} можно определять переменные. Такие переменные остаются определенными "внутри" области видимости их {...}-внешнего блока. Можно воспользоваться еще одной особенностью архитектуры — модификатором объявления static. Это будет поддерживать постоянство значения такой определенной переменной во время выполнения кода в течение всего жизненного цикла среды выполнения кода, и всякий раз, когда путь выполнения кода повторно входит в область {...}-видимости переменной, ее значение) при каждом повторном использовании. запись остается повторно сохраненной для повторного использования.

Q3+Q4: Объявление переменной — это принципиально важный шаг, а присвоение значения — еще один. Сказав это, можно наблюдать проблемы при попытке объявить + присвоить значения за один шаг. Там зависимость может создать проблемы для компилятора - в некоторых предыдущих MQL4-сборках это было так - этот компилятор попросили решить неразрешимую проблему, когда назначение зависело (от других переменных, как вы это называете) для некоторых операций/значений, которые были недоступны во время компиляции. Ваша мотивация ясна и выполнима, однако, пожалуйста, попробуйте разработать свой код с помощью этого небольшого уровня понимания синтаксических спецификаций и принципиальных различий между состояниями компиляции кода и состояния выполнения кода.


Эпилог: Не паникуйте и наслаждайтесь миром алгоритмической торговли.

person user3666197    schedule 02.03.2016