Русский

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

ArrayGetAsSeries

Проверяет направление индексации массива.

bool  ArrayGetAsSeries(
   const void&  array[]    // массив для проверки
   );

Параметры

array[]

[in]  Проверяемый массив.

Возвращаемое значение

Возвращает true, если у указанного массива установлен флаг AS_SERIES, то есть доступ к массиву осуществляется задом наперед как в таймсерии. Таймсерия отличается от обычного массива тем, что индексация элементов таймсерии производится от конца массива к началу (от самых свежих данных к самым старым).

Примечание

Для проверки массива на принадлежность к таймсерии следует применять функцию ArrayIsSeries(). Массивы ценовых данных, переданных в качестве входных параметров в функцию OnCalculate(), не обязательно имеют направление индексации как у таймсерий. Нужное направление индексации можно установить функцией ArraySetAsSeries().

Пример:

#property indicator_chart_window
#property description "Индикатор вычисляет абсолютные значения разницы между ценами"
#property description "Open и Close или High и Low, и отображает их в отдельном подокне"
#property description "в виде гистограммы."
//--- настройки индикатора
#property indicator_separate_window
#property indicator_buffers 1
//--- входные параметры
input bool InpAsSeries=true// Направление индексации в индикаторном буфере
input bool InpPrices=true;   // Цены для расчета (true - Open,Close; false - High,Low)
//--- индикаторный буфер
double ExtBuffer[];
//+------------------------------------------------------------------+
//| Вычисление значений индикатора                                   |
//+------------------------------------------------------------------+
void CandleSizeOnBuffer(const int rates_total,const int prev_calculated,
                        const double &first[],const double &second[],double &buffer[])
  {
//--- переменная начала для рассчета баров
   int start_index=prev_calculated;
//--- если значения индикатора уже были рассчитаны на предыдущем тике, то работаем на последнем баре
   if(prev_calculated>0)
      start_index--;
//--- определим направление индексации в массивах
   bool as_series_first=ArrayGetAsSeries(first);
   bool as_series_second=ArrayGetAsSeries(second);
   bool as_series_buffer=ArrayGetAsSeries(buffer);
//--- изменим направление индексации на прямое, если необходимо
   if(as_series_first)
      ArraySetAsSeries(first,false);
   if(as_series_second)
      ArraySetAsSeries(second,false);
   if(as_series_buffer)
      ArraySetAsSeries(buffer,false);
//--- рассчитаем значения индикатора
   for(int i=start_index;i<rates_total;i++)
      buffer[i]=MathAbs(first[i]-second[i]);
  }
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- привязка индикаторных буферов
   SetIndexBuffer(0,ExtBuffer);
//--- установим направление индексации в индикаторном буфере
   ArraySetAsSeries(ExtBuffer,InpAsSeries);
//--- проверяем для каких цен рассчитывается индикатор
   if(InpPrices)
     {
      //--- цены Open и Close
      IndicatorShortName("BodySize");
      //--- установим цвет индикатора
      SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3,clrOrange);
     }
   else
     {
      //--- цены High и Low
      IndicatorShortName("ShadowSize");
      //--- установим цвет индикатора
      SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,3,clrDodgerBlue);
     }
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//--- расчет индикатора в зависимости от значения флага
   if(InpPrices)
      CandleSizeOnBuffer(rates_total,prev_calculated,open,close,ExtBuffer);
   else
      CandleSizeOnBuffer(rates_total,prev_calculated,high,low,ExtBuffer);
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Смотри также

Доступ к таймсериям, ArraySetAsSeries