Array out of range in Нужна Помощь - страница 7

 
Valeriy Yastremskiy:

Дневные экстремумы, а то что вы находите это по сути экстремумы, минимумы (или максимумы) имеют достаточно большие расстояния от текущей цены. Разлет минимума и максимума на 132 днях на еве более 12300 пунктов. Цена от ближайшего минимума 2000, от максимума 800. 

Тоже не догоняю.

Извиняюсь , завтра попробую объяснить  устал сегодня 

 
MakarFX:

AUDUSD у меня не так

ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров

Что тут куда копирует и кому возвращает? 

 
Алексей Тарабанов:

Что тут куда копирует и кому возвращает? 

Алексей Тарабанов:

Что тут куда копирует и кому возвращает? 

Справочник MQL4 / Операции с массивами / ArrayCopyRates

ArrayCopyRates

Копирует в массив данные баров указанного графика и возвращает количество скопированных баров. Существует 2 варианта вызова функции:

int  ArrayCopyRates(
   MqlRates&  rates_array[],   // массив MqlRates, переданный по ссылке
   string     symbol=NULL,     // инструмент
   int        timeframe=0      // таймфрейм
   );

Копирует в двумерный массив вида double RateInfo[][6] данные баров указанного графика и возвращает количество скопированных баров.

int  ArrayCopyRates(
   void&     dest_array[][],    // массив, переданный по ссылке
   string    symbol=NULL,       // инструмент
   int       timeframe=0        // таймфрейм
   );

Параметры

ArrayCopyRates

При использовании второй формы вызова происходит реальное копирование данных в массив dest_array[][], сам массив автоматически перераспределяется, чтобы соответствовать размеру таймсерии (даже если массив был объявлен статическим).

Первое измерение массива содержит количество баров. Второе измерение имеет 6 элементов со значениями:

0 - время (time),
1 - цена открытия (open),
2 - наименьшая цена (low),
3 - наивысшая цена (high),
4 - цена закрытия (close),

Документация по MQL5: Основы языка / Функции / Вызов функции
Документация по MQL5: Основы языка / Функции / Вызов функции
  • www.mql5.com
Если некоторое имя, которое не было описано ранее, появляется в выражении и за ним следует левая круглая скобка, то оно по контексту считается именем некоторой функции. Аргументы (формальные параметры) передаются по значению, т. е. каждое выражение x1, . . . , xn вычисляется и значение передается функции. Порядок вычисления выражений и порядок...
 
Dark Kchlyzov:
Справочник MQL4 / Операции с массивами / ArrayCopyRates

ArrayCopyRates

Копирует в массив данные баров указанного графика и возвращает количество скопированных баров. Существует 2 варианта вызова функции:

int  ArrayCopyRates(
   MqlRates&  rates_array[],   // массив MqlRates, переданный по ссылке
   string     symbol=NULL,     // инструмент
   int        timeframe=0      // таймфрейм
   );

Копирует в двумерный массив вида double RateInfo[][6] данные баров указанного графика и возвращает количество скопированных баров.

int  ArrayCopyRates(
   void&     dest_array[][],    // массив, переданный по ссылке
   string    symbol=NULL,       // инструмент
   int       timeframe=0        // таймфрейм
   );

Параметры

ArrayCopyRates

При использовании второй формы вызова происходит реальное копирование данных в массив dest_array[][], сам массив автоматически перераспределяется, чтобы соответствовать размеру таймсерии (даже если массив был объявлен статическим).

Первое измерение массива содержит количество баров. Второе измерение имеет 6 элементов со значениями:

0 - время (time),
1 - цена открытия (open),
2 - наименьшая цена (low),
3 - наивысшая цена (high),
4 - цена закрытия (close),

А куда сохраняется возвращаемое значение типа int? Вы все данные в функцию передали, но нихрена из неё не получили. 

 
Алексей Тарабанов:

А куда сохраняется возвращаемое значение типа int? Вы все данные в функцию передали, но нихрена из неё не получили. 

Min_D_Level = iLow(_Symbol,PERIOD_D1,i); break;

Вроде как сюда  

double   Min_D_Level ;      // ближайшей минимальный  D уровень

или я что-то не до понимаю ?

А куда сохраняется возвращаемое значение типа int? 

???

Реально мозг закипел .

Можно как-то по Проше .

Типа вот ты (вы) тут допустили не допустимое правильно будет вот так пример кода и тд.

 

Посидел тут немного:

#property version   "1.00"
#property strict

//символ и таймфрейм текущего графика
string symbol;
ENUM_TIMEFRAMES frame;
datetime time;
   

struct BarData
   {
   struct Elem
      {
      int      number;     //порядковый номер периода (дня, месяца или года)
      double   high;       //максимум периода
      double   low;        //минимум периода
      datetime time_high;  //время максимума
      datetime time_low;   //время минимума
      } Arr[];             //массив периода
   int index;              //текущий индекс массива
   double   max;           //последнее максимальное значение периода
   double   min;           //последнее минимальное значение периода
   datetime time_max;      //время максимума
   datetime time_min;      //время минимума

   //при создании структуры указываем, что массив пустой
   BarData(){index=-1;}    
   
   //функция записывает текущие экстремумы
   void WriteBar(int eNumber, string eSymbol, ENUM_TIMEFRAMES eFrame, datetime eTime)
      {
      int eShift=iBarShift(eSymbol,eFrame,eTime);
      double eHigh=iHigh(eSymbol,eFrame,eShift);
      double eLow=iLow(eSymbol,eFrame,eShift);
      //если элементов ещё нет или период сменился
      if(index<0 || eNumber!=Arr[index].number)
         {
         ArrayResize(Arr,++index+1);
         Arr[index].number=eNumber;
         Arr[index].high=eHigh;
         Arr[index].low=eLow;
         Arr[index].time_high=eTime;
         Arr[index].time_low=eTime;
         }
      //если произошло обновление текущего максимума
      if(eHigh-Arr[index].high>0)
         {
         Arr[index].high=eHigh;
         Arr[index].time_high=eTime;
         }
      //если произошло обновление текущего минимума
      if(Arr[index].low-eLow>0)
         {
         Arr[index].low=eLow;
         Arr[index].time_low=eTime;
         }
      //если произошло обновление предыдущего максимума
      if(eHigh-max>0)
         {
         for(int i=index+1; i>=0; i--)
            {
            if(Arr[index].high-eHigh>0)
               {
               max=Arr[index].high;
               time_max=Arr[index].time_high;
               break;
               }
            }
         }
      //если произошло обновление предыдущего минимума
      if(min-eLow>0)
         {
         for(int i=index+1; i>=0; i--)
            {
            if(eLow-Arr[index].low>0)
               {
               min=Arr[index].low;
               time_min=Arr[index].time_low;
               break;
               }
            }
         }
      }
   } day, month, year;

int OnInit()
   {
   symbol=Symbol();
   frame=(ENUM_TIMEFRAMES)Period();
   return(INIT_SUCCEEDED);
   }

void OnTick()
   {
   //текущее время закрытого бара
   time=iTime(symbol,frame,1);
   
   MqlDateTime date; 
   TimeToStruct(time,date);
   
   //делаем записи каждого периода
   day.WriteBar(date.day,symbol,frame,time);
   month.WriteBar(date.mon,symbol,frame,time);
   year.WriteBar(date.year,symbol,frame,time);
   
   //теперь имеем значения   
   Comment(TimeToString(day.time_max)+" : "+DoubleToString(day.max)+" : "+DoubleToString(day.Arr[day.index].high)+"\n"+TimeToString(day.time_min)+" : "+DoubleToString(day.Arr[day.index].low)+" : "+DoubleToString(day.min));
   }
Надо стремится избегать лишних циклов. У нас потоком поступают котировки, и нужно сразу налету делать нужные записи, чтобы потом не копаться в истории и не тратить ресурсы компьютера. 
 
Dark Kchlyzov:

Вроде как сюда  

double   Min_D_Level ;      // ближайшей минимальный  D уровень

или я что-то не до понимаю ?

Да, что-то не понимаете. Надо так: 

Количество_баров=ArrayCopyRates(Bar_data_D1,_Symbol,PERIOD_D1); // Копирует в массив данные баров указанного графика и возвращает количество скопированных баров

Ну и дальше... 

 
Алексей Тарабанов:

Да, что-то не понимаете. Надо так: 

Ну и дальше... 

Вот и на этом большое спасибо !!

 
Dark Kchlyzov:

Вот и на этом большое спасибо !!

Большое не за что. 

 

3.47 пойду спать .

завтра всё переварю , если будут вопросы дам знать !

Всем большое Спасибо !!!

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