Вопросы от начинающих MQL5 MT5 MetaTrader 5 - страница 440

 

Здравствуйте! 2015.09.17_19:07 GMT+3. Я задал в программе советника размеры динамических массивов. А компилятор выдаёт ошибки: "ожидается запятая". А если в тексте программы встречается переменная, -- выдаёт предупреждения: "переменная такая-то скрывает объявление переменной на глобальном уровне". Не понимаю. Вроде всё правильно, как в справке. Прилагаю фрагменты кода:

//--- массив максимальных цен баров

bool ArraySetAsSeries(double &High[],bool);

//---

bool ArraySetAsSeries(double &Low[],bool);

//--- устанавливаю размеры массивов с запасом (reserve)

int ArrayResize(double &mrate[],int 16,int 9);

int ArrayResize(double &maVal[],int 16,int 9);

int ArrayResize(double &fVal[],int 3,int 2);

int ArrayResize(double &zVal[],int 3,int 0);

int ArrayResize(double &High[],int 1,int 0);

int ArrayResize(double &Low[],int 1,int 0);

//+------------------------------------------------------------------+

//| Expert deinitialization function |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

//--- массив максимальных цен баров
bool ArraySetAsSeries(double &High[],bool);
//---  
bool ArraySetAsSeries(double &Low[],bool);
//--- устанавливаю размеры массивов с запасом (reserve)
int  ArrayResize(double &mrate[],int 16,int 9);
int  ArrayResize(double &maVal[],int 16,int 9);
int  ArrayResize(double &fVal[],int 3,int 2);
int  ArrayResize(double &zVal[],int 3,int 0);
int  ArrayResize(double &High[],int 1,int 0);
int  ArrayResize(double &Low[],int 1,int 0);  
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {Компилятор выдаёт ошибки

{

 
Николай Никитюк:

Здравствуйте! 2015.09.17_19:07 GMT+3. Я задал в программе советника размеры динамических массивов. А компилятор выдаёт ошибки: "ожидается запятая". А если в тексте программы встречается

  1. Вы не можете объявлять массивы с именами High[] и Low[], так как это зарезервированные системные имена массивов-таймсерий.
  2. Неправильное написание ArrayResize. Надобно так:
    //--- устанавливаю размеры массивов с запасом (reserve)
    ArrayResize(mrate,16,9);
    ArrayResize(maVal,16,9);
    ArrayResize(fVal,3,2);
    ArrayResize(zVal,3);
  3. А установка флага таймсерии для массива будет выглядеть так:
    //--- массив максимальных цен баров
    ArraySetAsSeries(High,true);
    //---  
    ArraySetAsSeries(Low,true);
 
2015.09.17_19:45 GMT+3. На всякий случай прикрепляю файл .png :
Файлы:
 
Karputov Vladimir:
  1. Вы не можете объявлять массивы с именами High[] и Low[], так как это зарезервированные системные имена массивов-таймсерий.
  2. Неправильное написание ArrayResize. Надобно так:
Спасибо! Вы так быстро ответили. В 20 часов МСК у меня отбой. Остальное потом посмотрю. 19:54 МСК. 
 
Karputov Vladimir:
Если Вы имеет в виду мой код - тогда да, мой код - это проверка на новый бар.
Мне интересен тот код, который я приложил - хочу понять, что он делает.
 
-Aleks-:
Мне интересен тот код, который я приложил - хочу понять, что он делает.

Код, который Вы привели ничего не делает, точнее он не работает. Ошибка:

if(TimeN==0)
      TimeN=TimeC;

Это условие сработает только один раз - при первом запуске программы. В этот момент статическая переменная будет проинициализирована.

Условие ниже вообще бессмысленно проверять, так как в Вашем коде переменная TimeN будет равна вечному нулю (точнее это будет дата 1 января 1970 года) и этот вечный ноль предлагается сравнивать с переменной TimeC, которая равна времени открытия текущего бара):

   if(TimeN==TimeC)
      return;
 
Karputov Vladimir:

Код, который Вы привели ничего не делает, точнее он не работает. Ошибка:

Это условие сработает только один раз - при первом запуске программы. В этот момент статическая переменная будет проинициализирована.

Условие ниже вообще бессмысленно проверять, так как в Вашем коде переменная TimeN будет равна вечному нулю (точнее это будет дата 1 января 1970 года) и этот вечный ноль предлагается сравнивать с переменной TimeC, которая равна времени открытия текущего бара):

Вот теперь и думаю, а зачем это нужно было писать... в советник.

Спасибо за разъяснения! 

 
Karputov Vladimir:

Если новый бар на таймфрейме М1, то печатаем сообщение:

Оказалось, что я не полный код привел, правильно было так

 

int init()

  { 

   static datetime TimeN=0;

   return(INIT_SUCCEEDED);

  }

 

int start()

  { 

   datetime TimeC=iTime(NULL,TF,0);

   if(TimeN==0)TimeN=TimeC;

   if(TimeN==TimeC) return(0);

   TimeN=TimeC;

  // Код программы исполняется при появлении нового бара

   return(INIT_SUCCEEDED);

  } 

В таком случае, он рабочий, верно?
 
-Aleks-:

Оказалось, что я не полный код привел, правильно было так

 

int init()

  { 

   static datetime TimeN=0;

   return(INIT_SUCCEEDED);

  }

 

int start()

  { 

   datetime TimeC=iTime(NULL,TF,0);

   if(TimeN==0)TimeN=TimeC;

   if(TimeN==TimeC) return(0);

   TimeN=TimeC;

  // Код программы исполняется при появлении нового бара

   return(INIT_SUCCEEDED);

  } 

В таком случае, он рабочий, верно?
А Вы пробовали компилировать-то этот код? Здесь ошибка: в OnInit() объявляется переменная TimeN и при выходе из OnInit() данная переменная будет уничтожена. Поэтому в функции OnTick() возникает ошибка
'TimeN' - undeclared identifier

Вот рабочий код:

//+------------------------------------------------------------------+
//|                                                         Test.mq4 |
//|                        Copyright 2015, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   static datetime TimeN;
   datetime TimeC=iTime(NULL,PERIOD_M1,0);
   if(TimeN==TimeC)
      return;
   TimeN=TimeC;
// новый бар, выполняем код
   Print("New bar");
   return;
  }
//+------------------------------------------------------------------+
 
Karputov Vladimir:
А Вы пробовали компилировать-то этот код? Здесь ошибка: в OnInit() объявляется переменная TimeN и при выходе из OnInit() данная переменная будет уничтожена. Поэтому в функции OnTick() возникает ошибка

Вот рабочий код:

Это я не верно написал static datetime TimeN=0; в зоне до int OnInit() - там где объявляются внешние и другие переменные.

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