Разница между ArrayIsSeries и ArrayGetAsSeries ?

 

Первая функция у меня выдает false, а вторая true.

В чем их отличие?

 
. ... Rick D. ... .:

Первая функция у меня выдает false, а вторая true.

В чем их отличие?

если коротко, то это 2 разные функции, одна проверяет что массив таймсериия, а вторая, что у массива индексация "сзаду-наперед"

//+------------------------------------------------------------------+
//|                                                   test_price.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot line1
#property indicator_label1  "line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         line1Buffer[],arr[];
bool run=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,line1Buffer);
   ArrayResize(arr,1000);
   run=true;
//---
   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(run)
     {
      Print("ArrayIsSeries :");
      Print("Массив line1Buffer = ",ArrayIsSeries(line1Buffer));
      Print("Массив low = ",ArrayIsSeries(low));
      Print("Массив arr = ",ArrayIsSeries(arr));
      Print("ArrayGetAsSeries :");
      Print("Массив line1Buffer = ",ArrayGetAsSeries(line1Buffer));
      Print("Массив low = ",ArrayGetAsSeries(low));
      ArraySetAsSeries(arr,false);
      Print("ArraySetAsSeries = false, Массив arr = ",ArrayGetAsSeries(arr));
      ArraySetAsSeries(arr,true);
      Print("ArraySetAsSeries = true, Массив arr = ",ArrayGetAsSeries(arr));
      run=false;
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

0 10:29:58.058 test EURUSD.e,H1: ArrayIsSeries :

0 10:29:58.058 test EURUSD.e,H1: Массив line1Buffer = false

0 10:29:58.058 test EURUSD.e,H1: Массив low = true

0 10:29:58.058 test EURUSD.e,H1: Массив arr = false

0 10:29:58.058 test EURUSD.e,H1: ArrayGetAsSeries :

0 10:29:58.058 test EURUSD.e,H1: Массив line1Buffer = true

0 10:29:58.058 test EURUSD.e,H1: Массив low = true

0 10:29:58.058 test EURUSD.e,H1: ArraySetAsSeries = false, Массив arr = false

0 10:29:58.058 test EURUSD.e,H1: ArraySetAsSeries = true, Массив arr = true

 
Igor Makanu:

если коротко, то это 2 разные функции, одна проверяет что массив таймсериия, а вторая, что у массива индексация "сзаду-наперед"

Все равно не ясно. Зачем проверять, что массив - таймсерия, и отдельно проверять - что у массива индексация "наоборот" ? Раз есть одна функция ArraySetAsSeries, то и функция Get по логике должна быть одна. Или это не очевидно?

 
. ... Rick D. ... .:

Все равно не ясно. Зачем проверять, что массив - таймсерия, и отдельно проверять - что у массива индексация "наоборот" ? Раз есть одна функция ArraySetAsSeries, то и функция Get по логике должна быть одна. Или это не очевидно?

  1. Вы можете использовать масив-таймсерию, например time[]. ArrayIsSeries() вернёт true потому, что этот массив - таймсерия.
    У этого массива индексация может быть либо прямая, либо обратная. ArrayGetAsSeries() вернёт либо true, либо false - в зависимости от того, как вы задали индексацию для этого массива посредством ArraySetAsSeries().
  2. Вы можете использовать пользовательский масив, например time_custom[]. ArrayIsSeries() вернёт false потому, что этот массив не является таймсерией.
    У этого массива индексация может быть либо прямая, либо обратная. ArrayGetAsSeries() вернёт либо true, либо false - в зависимости от того, как вы задали индексацию для этого массива посредством ArraySetAsSeries().
 

В MT5 индикаторные массивы (time[], close[]...) являются таймсериями, но индексация у них прямая:

ArrayIsSeries(time) // true

ArrayGetAsSeries(time) // false

А в МТ4 таймсерии имеют обратную индексацию:

ArrayIsSeries(time) // true

ArrayGetAsSeries(time) // true

У обычного массива ArrayIsSeries() всегда false. 

 
Пока вижу так. Для меня в рамках MQL важно знать только индексацию: прямая или обратная. Чтобы знать - в начале или в конце массива находятся последние данные. А для чего нужно знать - массив таймсерия или нет?
 
. ... Rick D. ... .:
Пока вижу так. Для меня в рамках MQL важно знать только индексацию: прямая или обратная. Чтобы знать - в начале или в конце массива находятся последние данные. А для чего нужно знать - массив таймсерия или нет?

Очень плохо знаю таймсерии, но предположу ответ. Таймсерия - это массив, размер (и сдвиги в нем) которого задает сам Терминал. Например, индикаторные буферы являются таймсериями.

Если массив является таймсерией, то делать ArrayResize бессмысленно, например.

 
fxsaber:

Очень плохо знаю таймсерии, но предположу ответ. Таймсерия - это массив, размер (и сдвиги в нем) которого задает сам Терминал. Например, индикаторные буферы являются таймсериями.

Если массив является таймсерией, то делать ArrayResize бессмысленно, например.

нет, индикаторные буфера терминал хоть и сам распределяет, но таймсериями они не будут, вот еще пример:

#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com/ru/users/igorm"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot line1
#property indicator_label1  "line1"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrRed
#property indicator_style1  STYLE_SOLID
#property indicator_width1  1
//--- indicator buffers
double         line1Buffer[],arr[];
bool run=true;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,line1Buffer);
   run=true;
//---
   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(run)
     {
      Print("line1Buffer = ",ArrayIsSeries(line1Buffer));
      Print("No CopyClose arr = ",ArrayIsSeries(arr));
      CopyClose(_Symbol,PERIOD_H1,0,100,arr);   // Скопируем в массив arr 100 эл-в таймсерии Close
      Print("After CopyClose arr arr = ",ArrayIsSeries(arr));
      Print("ArrayIsSeries High = ",ArrayIsSeries(High));
      Print("ArrayIsSeries const &high[] = ",ArrayIsSeries(high));
      run=false;
     }
//---
   return(rates_total);
  }
//+------------------------------------------------------------------+

результат:

0 15:58:45.847 test EURUSD.e,H1: line1Buffer = false

0 15:58:45.847 test EURUSD.e,H1: No CopyClose arr = false

0 15:58:45.847 test EURUSD.e,H1: After CopyClose arr arr = false

0 15:58:45.847 test EURUSD.e,H1: ArrayIsSeries High = true

0 15:58:45.847 test EURUSD.e,H1: ArrayIsSeries const &high[] = true

я насколько понимаю, что возвращает ArrayIsSeries() - это  признак того, что проверяемый массив принадлежит терминалу, а не MQL программе

ЗЫ: на чем написан МТ4 никогда не задавался вопросом, но организации памяти, вернее доступа к переменным очень напоминает DOS-овскую модель переменных с модификаторами near , far или external, по такой схеме массивы таймсерии это external переменные

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