Русский

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

ArraySetAsSeries

Устанавливает флаг AS_SERIES указанному объекту динамического массива, индексация элементов массива будет производиться как в таймсериях.

bool  ArraySetAsSeries(
   const void&  array[],    // массив по ссылке
   bool         flag        // true означает обратный порядок индексации
   );

Параметры

array[]

[in][out]  Числовой массив для установки.

flag

[in]  Направление индексирования массива.

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

Возвращает true в случае успеха, иначе false.

Примечание

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

Пример: индикатор, показывающий номер бара

Индикатор для отображения номера бара

 

#property indicator_chart_window
#property indicator_buffers 1
//--- indicator buffers
double         NumerationBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,NumerationBuffer,INDICATOR_DATA);
//--- set buffer style
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,1,CLR_NONE);   
//--- установим индексацию для буфера как в таймсерии
   ArraySetAsSeries(NumerationBuffer,true);
//--- установим точность отборажения в DataWindow
   IndicatorSetInteger(INDICATOR_DIGITS,0);
//--- как будет выглядеть в DataWindow имя индикатора
   IndicatorShortName("Bar #"); 
//---
   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[])
  {
//---  будем хранить время открытия текущего нулевого бара
   static datetime currentBarTimeOpen=0;
//--- перевернем доступ к массиву time[] - сделаем как в таймсерии
   ArraySetAsSeries(time,true);
//--- если время нулевого бара отличается от того, что мы храним
   if(currentBarTimeOpen!=time[0])
     {
     //--- пронумеруем все бары от текущего момента вглубь графика
      for(int i=rates_total-1;i>=0;i--) NumerationBuffer[i]=i;
      currentBarTimeOpen=time[0];
     }
//--- return value of prev_calculated for next call
   return(rates_total);
  }

Смотри также

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