Первая функция у меня выдает 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
если коротко, то это 2 разные функции, одна проверяет что массив таймсериия, а вторая, что у массива индексация "сзаду-наперед"
Все равно не ясно. Зачем проверять, что массив - таймсерия, и отдельно проверять - что у массива индексация "наоборот" ? Раз есть одна функция ArraySetAsSeries, то и функция Get по логике должна быть одна. Или это не очевидно?
Все равно не ясно. Зачем проверять, что массив - таймсерия, и отдельно проверять - что у массива индексация "наоборот" ? Раз есть одна функция ArraySetAsSeries, то и функция Get по логике должна быть одна. Или это не очевидно?
- Вы можете использовать масив-таймсерию, например time[]. ArrayIsSeries() вернёт true потому, что этот массив - таймсерия.
У этого массива индексация может быть либо прямая, либо обратная. ArrayGetAsSeries() вернёт либо true, либо false - в зависимости от того, как вы задали индексацию для этого массива посредством ArraySetAsSeries(). - Вы можете использовать пользовательский масив, например 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 важно знать только индексацию: прямая или обратная. Чтобы знать - в начале или в конце массива находятся последние данные. А для чего нужно знать - массив таймсерия или нет?
Очень плохо знаю таймсерии, но предположу ответ. Таймсерия - это массив, размер (и сдвиги в нем) которого задает сам Терминал. Например, индикаторные буферы являются таймсериями.
Если массив является таймсерией, то делать ArrayResize бессмысленно, например.
Очень плохо знаю таймсерии, но предположу ответ. Таймсерия - это массив, размер (и сдвиги в нем) которого задает сам Терминал. Например, индикаторные буферы являются таймсериями.
Если массив является таймсерией, то делать 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 переменные

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Первая функция у меня выдает false, а вторая true.
В чем их отличие?