Возникла ошибка при компилировании советника МТ4?

 

Прошу помочь, подправить код советника, возникает две ошибки при компиляции после добавления #property strict.

bool MASignal( int op, int bar )
{
    if( op == OP_BUY ) if( MAFast(bar) > MASlow(bar) )
    {
       for( int i = bar+1 ; i <= BarsMASaveSignal+1 ; i++ )
         if( MAFast(i) <= MASlow(i) )
           return(true);
    }

    if( op == OP_SELL ) if( MAFast(bar) < MASlow(bar) )
    {
       for( i = bar+1 ; i <= BarsMASaveSignal+1 ; i++ )
         if( MAFast(i) >= MASlow(i) )
           return(true);
    }
 
 return(false);

}


"i"-undeclared identifier ошибка

Файлы:
 
поставьте перед i оператор int
 
Kirill Voytseshchuk:

Прошу помочь, подправить код советника, возникает две ошибки при компиляции после добавления #property strict.

bool MASignal( int op, int bar )
{
    if( op == OP_BUY ) if( MAFast(bar) > MASlow(bar) )
    {
       for( int i = bar+1 ; i <= BarsMASaveSignal+1 ; i++ )
         if( MAFast(i) <= MASlow(i) )
           return(true);
    }

    if( op == OP_SELL ) if( MAFast(bar) < MASlow(bar) )
    {
       for( i = bar+1 ; i <= BarsMASaveSignal+1 ; i++ )
         if( MAFast(i) >= MASlow(i) )
           return(true);
    }
 
 return(false);

}


"i"-undeclared identifier ошибка

Два замечания:

1. Код должен быть вставлен так...

2. При использовании #property strict доступность переменных изменяется. Поэтому целесобразней переменную i объявить до циклов.

bool MASignal( int op, int bar )
{
  int i = 0;
   if( op == OP_BUY ) if( MAFast(bar) > MASlow(bar) )
    {
       for( i = bar+1 ; i <= BarsMASaveSignal+1 ; i++ )
         if( MAFast(i) <= MASlow(i) )
           return(true);
    }

    if( op == OP_SELL ) if( MAFast(bar) < MASlow(bar) )
    {
       for( i = bar+1 ; i <= BarsMASaveSignal+1 ; i++ )
         if( MAFast(i) >= MASlow(i) )
           return(true);
    }
 
 return(false);

}
 
Топикстартеру. Разберитесь с тем, что вам посоветовал Алексей Викторов. И никогда так не делайте. ))
 
Sergei Vladimirov:
Топикстартеру. Разберитесь с примером, который вам дал Алексей Викторов. И никогда так не делайте. ))
Это замечание по поводу объявления переменной i или всего остального???
 

вот так, для каждого цикла свой int:

for(int i = bar+1 ; i <= BarsMASaveSignal+1 ; i++ )
 
Alexey Viktorov:
Это замечание по поводу объявления переменной i или всего остального???
По поводу расширения области видимости переменных без необходимости. Вы ж потом запутаетесь, где и что могло изменить эту i, если код будет не совсем маленьким.
 
Alexander Bereznyak:

вот так, для каждого цикла свой int:

И если во втором цикле использовать ту-же переменную i как в коде Kirill Voytseshchuk то повторное int вызовет ошибку 'i' - variable already defined - переменная уже определена. В таком случае надо использовать разные переменные, или так как предложил я. И ничего страшного в этом нет т.к. в любом цикле стартовое значение счётчика цикла задаётся и предыдущее значение этой переменной никак не повлияет на выполнение программы. Другое дело вложенные циклы, но разговор не о них.


 
Sergei Vladimirov:
Топикстартеру. Разберитесь с тем, что вам посоветовал Алексей Викторов. И никогда так не делайте. ))

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

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

А вот то, что в:

for(int i = bar+1 ; i <= BarsMASaveSignal+1 ; i++ )

стоит знак <= (меньше или равно), тут могут быть возможны выходы сообщения array of range.

Т.е., знак < (меньше) - да, а = (равно) - лишнее.

 
Alexey Viktorov:

И если во втором цикле использовать ту-же переменную i как в коде Kirill Voytseshchuk то повторное int вызовет ошибку 'i' - variable already defined - переменная уже определена. 

Нет. Это было давным-давно, до апгрейда языка, когда он никаким стандартам не соответствовал. Сейчас это всё приведено в порядок.
 
Sergei Vladimirov:
Нет. Это было давным-давно, до апгрейда языка, когда он никаким стандартам не соответствовал. Сейчас это всё приведено в порядок.

Без применения #property strict - возможно сообщение variable already defined (переменная определена).

P./S.: Уф... а тут "заглючила". Сообщение variable already defined (переменная определена) - это наоборот возможно при применении #property strict. Правку об этом вношу без привязки к коду в теме.

Sorry.

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