English 中文 Español Deutsch 日本語 Português
Оценка индекса фрактальности, показателя Херста и возможность предсказания финансовых временных рядов

Оценка индекса фрактальности, показателя Херста и возможность предсказания финансовых временных рядов

MetaTrader 5Торговые системы | 29 мая 2019, 07:56
7 452 34
Roman Korotchenko
Roman Korotchenko

Введение

Финансовый рынок в настоящее время является образцом "натуральной" сложно сбалансированной системы. С одной стороны он изрядно хаотичен, т.к. его изменения определяются под влиянием многих участников, а с другой стороны в нем определены и работают устойчивые процессы, определенные действиями участников. Поскольку в число задач эконофизики входит описание процессов социальных взаимодействий, которые формируют ценовую динамику, наблюдаемую на бирже, крайне желательным является определение и представление особых свойств финансовых временных рядов, что будет отличать такие данные от других естественных процессов. В современное время установлено, что ценовые ряды — это фракталы в разнообразных масштабах (от единиц минут до десятка лет).

Их поведение гораздо более сложное, чем у многих модельных и натурных процессов [3]. Чтобы выяснить подробности такого поведения, желательно применять инструмент численного анализа рядов для исследования их динамики.Типичные алгоритмы надежной оценки фрактальной размерности требуют объемных наборов данных (порядка 10 000-100 000 отсчетов), которые характеризуют ряд на длительном временном интервале, в течение которого характер поведения может меняться, иногда многократно. Для реальных задач трейдинга необходимы методы определения локальных фрактальных характеристик ряда. В настоящей статье обсуждается и демонстрируется способ определения численным методом фрактальной размерности рядов ценовых последовательностей, описанный в работах [1, 2].

Понятие фрактальной размерности и статистические свойства временных рядов

Фрактальная размерность оценивает то, как совокупность данных занимает пространство. Имеется много методов оценки фрактальной размерности. Единым для них является вычисление объема или площади в том пространстве, где эта совокупность находится. Возьмем в качестве примера временной ряд для финансового инструмента, состоящий из цен закрытия  {Close(t)}. При независимости уровней ряда {Close(t)} на его графике не существует ярко выраженных трендов, а поведение  в целом будет аналогично "белому шуму". При этом значение фрактальной размерности D будет приближаться к размеру топологической размерности плоскости, иными словами, D->2. В случае, если значения ряда {Close(t)} не являются независимыми, то величина D будет существенно меньше 2, что говорит о наличии "памяти" у временного ряда, т.е. на некоторых интервалах времени будут наблюдаться как восходящие, так  и нисходящие тренды, чередующиеся с периодами неопределенности (рисунок 1).


FIG1. Series with Different Fractal Index

Рис.1. Пример случайного ряда и ряда с трендом и соответсвующая им фрактальная размерность


Способы оценки фрактальной размерности, их особенности

Имеются разные способы вычисления фрактальной размерности для временного ряда. Обсудим метод оценки при помощи показателя Херста.

Показатель Херста H определяется из предположения


Hurst coefficient definition                                (1a)

где угловые скобки указывают на усреднение по времени. Связь показателя Херста с фрактальной размерностью получается методом нормированного размаха или R/S-анализом на основе выражений

DH = 2-H
H = log(R/ S) / log(N / 2) (1b)

где R — max {Close(t)} - min {Close(t)},  i = 1..N размах отклонений ряда Close(t),  S — среднеквадратичное отклонение значений Close(t). Более подробно данный метод рассматривается в статье Дмитрия Пискарева " Вычисление коэффициенты Херста". 

Если для временного ряда показатель Херста лежит в диапазоне 0.5-1, то такой ряд персистентный, или трендоустойчивый — это означает, что ряд {Close(t)} не является случайным, содержит тренд, и поведение этого ряда может быть спрогнозировано с достаточной точностью. Чем ближе значение H к единице, тем сильнее коррелированы значения ряда {Close(t)}.

Недостатком этого метода является то, что для получения достоверной оценки показателя Херста требуется достаточно большое количество данных (тысячи значений ряда данных), иначе полученные оценки могут быть некорректными. Помимо этого, значения ряда должны иметь нормальный закон распределения, а это имеет место далеко не всегда. Поскольку для надежного вычисления, как DH, так и показателя H требуется большой представительный масштаб с большим объемом данных, то неудивительно, что в процессе соответствующей длительности процесса торговли ряд может неоднократно менять свое поведение. А для связи локальной динамики исследуемого процесса с фрактальной размерностью наблюдаемого ряда требуется локально определить размерность D.

Оценка фрактальной размерности исходя из минимальной площади покрытия

При прогнозировании эконометрических рядов более эффективным является метод, основанный на расчете размерности минимального покрытия  [1, 2]. Хаусдорф в 1919 г. предложил выражение для определения фрактальности:


HausdorfFractal.

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

Допустим, на отрезке [a, b] задана функция f(t). Равномерно разобьем отрезок wm = [a=t0<t1<t2...tm=b], при этом масштаб разбиения определим  TimeScale  Если подобные множества покрываем, например, клетками с размером delta, то при уменьшении фактора  delta количество клеток N вырастет по степенному закону:

  Nlaw

где D — фрактальная размерность.

При определении размерности D методом клеток поверхность, на которой расположен график временного ряда, разбивается на клетки размером   delta, затем подсчитывается число клеток  N( delta), которым принадлежит как минимум одна точка этого графика. Затем  delta меняется, и строится график функции N( delta) в двойном логарифмическом масштабе. Далее полученный набор точек аппроксимируется прямой методом наименьших квадратов (МНК). По углу наклона этой прямой определяется D

Минимальная площадь покрытия графика функции в данном масштабе на отрезке [a, b] будет равна сумме площадей прямоугольников с основанием  delta и высотой,  равной вариации  MaxMinValue —  разности между максимумом и минимумом функции f(t) на каждом отрезке[ti-1, ti]. Площадь минимального покрытия MinSquare можно найти как:

SquareMinOverload                    (2)

где AmplSum— сумма амплитудных вариаций функции f(t) на отрезке [a, b]. Оценка  AmplSum зависит от выбора величины. Чем меньше deltamin, тем точнее будет вычислена   AmplSum. При этом величина  AmplSumпри изменении  deltaminизменяется по степенному закону:

V_Ampl_law                                          (3)

где  muValue. Величина DimMinCover получила название "размерность минимального покрытия", а индекс  mu— индекс фрактальности. 

Иллюстрация зависимости минимальной площади покрытия при разных значениях  deltaminдля временного ряда, состоящего из 32 наблюдений, приведена на рис. 2.

Calculate cover

Рис. 2. Вычисление площади покрытия при различных значениях   deltamin

В работе [2] показано, что фрактальная размерность, вычисляемая с помощью клеточного покрытия и покрытием прямоугольниками на основе вариации функции совпадают. Важным свойством алгоритма, использующего вариации функции, является его значительно более быстрая сходимость, что позволяет определять значение фрактальной размерности временного ряда локально по малому набору значений.

Логарифмируя (3), получаем

MuEquation                                                            (4)

Для определения  DimMinCover в двойных логарифмических координатах методом наименьших квадратов (МНК) строится график зависимости (3), далее  определяется тангенс угла наклона прямой. По выражению (4) вычисляется  mu— индекс фрактальности, который является локальной характеристикой временного ряда. В [1] показано, что точность определения , намного выше, чем точность определения других фрактальных характеристик, таких как клеточная размерность  или размерность, вычисленная на основе показателя Херста. К тому же метод не имеет ограничений на закон распределения рядов  . В [1] также показано, что для получения достоверной оценки временной  ряд   должен включать не менее 32 наблюдений. В реальности финансовые ряды имеют существенно более длительную историю. Такой подход дает возможность использовать индекс фрактальности как зависимость от  времени  mu(t), где каждое значение определяется на основе 32 предыдущих значений временного  ряда   .

На рис. 3 приведен пример расчета индекса фрактальности  mu по углу наклона аппроксимирующей прямой. Согласно рисунку, коэффициент детерминации уравнения регрессии R 2, аппроксимирующего зависимость равен 0.96, что указывает на то, что индекс фрактальности, равный 0.4544, вычислен достаточно точно для фрагмента ряда из 32 точек.

Dependence in double log coordinates

Рис. 3. Аппроксимация зависимости lnV(delta) в двойных логарифмических координатах и определение индекса фрактальности

Оценку фрактальной размерности можно проводить как методом клеточной размерности, так и с помощью показателя Херста. В качестве примера продемонстрируем котировки акций Лукойл (ММВБ) до кризиса в начале века. Это время можно интерпретировать как стабильный тренд с постепенной повышением (персистентный ряд). Рис. 4 иллюстрирует результаты оценки фрактальной размерности в 1999 году

FractalDimensionLHOL

Рис. 4. а) приближение МНК фрактальной меры с помощью клеточного покрытия (D=1.1894), б) Лог-лог диаграмма численной оценки параметра Херста (D=1.6)

Фрактальная размерность ряда D = 1.18 указывает на его персистентный трендоустойчивый характер. Значение близкое к единице указывает на скорое окончание имевшего место тренда, что и случилось в 2000-2001 годах. Значение показателя Херста H=0.40. Следует обратить внимание на невысокий коэффициент детерминации R 2= 0.56 при доверительном интервале 0.95. Согласно формулам (1), вычисленная по показателю Херста фрактальная размерность равна D = 1.6, что указывает на случайное поведение ряда с повышенным уровнем стохастичности. Однако, для котировок акций Лукойл, временной период 1999 года к таковым не относится. 

Интересный и показательный пример точности оценки индекса фрактальности и показателя Херста в качестве локальных показателей временных рядов приводится в работе [2]. Данная оценка параметров более подходит трейдерским задачам рыночного анализа оперативного качественного и количественного поведения временных рядов. Исходный ценовой ряд компании Alcoa Inc., включающий 8145 точек, был разбит на 8113 пересекающихся интервалов длительностью по 32 дня, сдвинутых друг относительно друга на один день. В качестве параметров точности расчетов использовались: ширина доверительного интервала 95% для   Н и  mu, оценка точности попадания реальных точек на теоретическую прямую K = 1- R 2 , где R 2 — коэффициент детерминации (если точки точно ложатся на прямую, то R 2=1 и К=0).

На каждом из 8113 отрезков были рассчитаны:

  • H — показатель Херста;
  • mu— индекс фрактальности;
  • — ширина 95 % доверительного интервала для H;
  • — ширина 95 % доверительного интервала для  ;
  • — точность соответствия экспериментальных точек получаемой прямой для H;
  • — точность соответствия экспериментальных точек получаемой прямой для  mu.

Типичные фрагменты графиков функций ,   и  , , построенных по интервалам, правый конец которых совпадает с моментом t, представлены на рис. 5а и 5б. Как видно из этих рисунков, в подавляющем большинстве случаев индекс  mu определен на порядок точнее, чем H.

Fig.5a delta_H(t), delta_mu(t)

Рис. 5a. Типичный фрагмент временного ряда ширины доверительных интервалов построенных по ряду цен закрытия для компании Alcoa Inc.


Fig. 5b. K_h(t), K_mu(t)

Рис. 5б. Соответствующий фрагмент ряда для значений  точности соответствия экспериментальных точек теоретической прямой, построенных по тому же самому ряду 

Эти рисунки позволяют сделать вывод, что в подавляющем большинстве случаев индекс фрактальности   mu определен на порядок точнее, чем H.

Главное преимущество индекса  mu по отношению к иным фрактальным показателям (в частности, показателю Херста) состоит в том, что соответствующая ему величина  AmplSum быстро выходит на асимптотический режим. Это дает возможность использовать  mu в качестве локальной характеристики, определяя динамику исходного процесса, поскольку масштаб для его надежного определения имеет такой же порядок, что и основной масштаб определяющих состояний процесса. К таким состояниям можно отнести периоды относительного спокойствия (флэты) и периоды относительно длительного движения вверх или вниз (тренды). Для связи величины  mu с поведением ряда, удобно ввести функцию   как значение  mu определенное на минимальном, предшествующем t, интервале, где  mu еще может быть вычислено с приемлемой точностью.

Соотношение характера временного ряда и индекса фрактальности

Для удобства пользователей индикатора, основанного на индексе фрактальности, будет полезно привести его некоторые особенности [2].

Поведение ряда определяет значение   mu, а именно:

  1. Случай   = 0.5 указывает на случайное блуждание цены (винеровский процесс). Инвесторы ведут себя независимо и какая-либо выраженная тенденция в поведении цен отсутствует. В этом случае можно говорить, что цена имеет "нормальную" устойчивость, поскольку цена слабо зависит от внешних воздействий, "обратной связи" нет, арбитражные возможности отсутствуют.
  2. Случай   < 0.5 говорит о ситуации повышенной устойчивости цены к внешним воздействиям, возможно связанной с повышенной уверенностью инвесторов в стабильности данной компании и отсутствием новой информации на рынке. В этом случае цены акций колеблются в пределах достаточно узкого ценового диапазона. При росте цен находится достаточное количество продавцов, а при падении – покупателей, которые своими действиями возвращают цены в исходный диапазон. "Связь" в данном случае отрицательна и гасит изменения цены акции, сохраняя стабильное поведение цен.
  3. Случай  > 0.5 соответствует пониженной устойчивости цены. Такое может указывать на появление новой информации и реакцией на эту информацию. Поскольку в первом приближении можно считать, что все участники рынка оценивают поступающую информацию примерно одинаково, то в движении цен возникает тенденция, соответствующая полученной информации. При некоторых условиях такая ситуация приводит к резким изменениям цены акции.

Индекс фрактальности и показатель Херста связаны отношением  mu = 1-Hчто позволяет унаследовать из хаотических временных рядов варианты классификации:

  1. При   mu = 0.5, H = 0.5  временной ряд - это винеровский процесс ("коричневый" шум). Главное свойство этого процесса есть отсутствие памяти: эволюция ряда не связана с предыдущими значениями.
  2. При 0.5 <  mu <= 1, 0 <= H < 0.5 процесс называется "розовым" шумом. Для него характерна "отрицательная" память: если ранее имело место положительное приращение, то затем с высокой вероятностью возникнет отрицательное и наоборот. 
  3. При 0 <=  mu < 0.5 , 0.5 < H <=1 временной ряд - "черный" шум с "положительной" памятью: если в прошлом возник положительный тренд, то в будущем он же сохранится с высокой вероятностью и наоборот.

Индикатор для оценки индекса фрактальности и показателя Херста

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

Индикатор выполняет оценку индекса фрактальности, доверительного интервала для него, значения коэффициента детерминации и  показателя Херста, на предоставляемых графиках отображаются  графики функций   Fractal Index, и  , описанные выше.

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

double CFractalIndexLine::CalculateFractalIndex(const double &series[],const int N0,const int N1,
                                                const double hourSampling,int CountFragmentScale=0)
  {
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// series[] - временной ряд
// N0, N1 - левая и правая граничные точки фрагмента в массиве series[], по которому будет оцениваться индекс фрактальности
// hourSampling - дискретизация между точками В ЧАСАХ
// CountFragmentScale - количество запрашиваемых масштабов для формирования набора точек, по которым рассчитается индекс фрактальности
//
// РЕЗУЛЬТАТ
// индекс фрактальности (Mu), показатель Херста (Hurst), доверительный интервал 95% (ConfInterval[2], 
// коэффициент детерминированости (R2det) - чем ближе к 1, тем точнее точки расчетности ложатся на аппроксимирующую прямую
// устойчивость определения коэффициента KR2 = 1-R2det. Чем ближе к нулю - тем точнее рассчитанное значение Mu
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// 1. Загрузим внутренний фрагмент значениями из временного ряда     
   LoadFragment(series,N0,N1,hourSampling);

// 2. Определим число циклов определения точек аппрксимирующей прямой
   int   nn2 = (int)floor(Nfrgm/2);  // Предельное разбиение - не меньше чем по две точке
   int npow2 = (int)ipow2(nn2);      // Число степеней двойки в Предельном возможное разбиение;

   if(CountFragmentScale==0) CountFragmentScale=npow2; // по-умолчанию

   int Count=fmin(CountFragmentScale,npow2);           // ограничение числа вариантов дробления фрагмента ряда
   int NumPartDivide;

   for(int i=0; i<=Count; i++)
     {
      NumPartDivide = (int)pow (2,i);      // Число кусочков деления фрагмента ряда
      CalcAmplVariation(NumPartDivide, i); // Расчет точки для модели аппроксимирующей прямой      
      i=i;
     }
// 4. Оценка Индекса Фрактальности и границ доверительных интервалов Индекса
   Mu=fCalculateConfidenceIntervalMU(LogDeltaScales,LogAmplVariations,Count,ConfInterval,R2det);
   Hurst=1-Mu;		// Коэффициент Херста
   KR2=1-R2det;

   return Mu;
  }
//----------------------------------------------------------------------------------------------------------------------------------

double CFractalIndexLine::CalcAmplVariation(const int NumPartDivide,int idxAmplVar=-1)
  {
// Если idxAmplVar=-1, то индекс в массиве определяется автоматически (по вкладу степени 2-ки в NumPartDivide)
// УЖЕ ПРЕДВАРИТЕЛЬНО: фрагмент скопирован, время дискретизации ряда В ДНЯХ задано
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

// 1. ПРОВОДИМ ОПРЕДЕЛЕНИЕ ГРАНИЦ ИНТЕРВАЛОВ, СООТВЕТСТВУЮЩИХ ЗАДАННОМУ ЧИСЛУ РАЗБИЕНИЙ
   int nCheckPoint=0,nIntervalPoints=0; // число проверяемых точек в одном подинтервале разбиения 
   double dayDeltaScales=BoundaryArray(NumPartDivide,fragment,0,Nfrgm-1,hSampling,Boundaries,nIntervalPoints);

// 2. ПРОГОН ПО ИНТЕРВАЛАМ ДЛЯ ОПРЕДЕЛЕНИЯ ПРЕДЕЛЬНЫХ ЗНАЧЕНИЙ ФУНКЦИИ И АМПЛИТУДНОЙ ВАРИАЦИИ
   int countInterval=Boundaries.CountNonEmty();
   int  maxFuncIdx=0,minFuncIdx=0;
   double A,V=0.;

   nCheckPoint=(int)(Boundaries.y[0]-Boundaries.x[0])+1;
   for(int i=0; i<countInterval; i++)
     {
      maxFuncIdx = ArrayMaximum(fragment,(int)Boundaries.x[i],nCheckPoint); // ИНДЕКС С МАКС. ЗНАЧЕНИЕМ
      minFuncIdx = ArrayMinimum(fragment,(int)Boundaries.x[i],nCheckPoint);
      A = fragment[maxFuncIdx] - fragment[minFuncIdx];
      V = V+A;
      i=i;
     }

// 3. НАКОПЛЕНИЕ РЕЗУЛЬТАТОВ В ХРАНИЛИЩЕ    
   if(idxAmplVar==-1) idxAmplVar=ipow2(NumPartDivide); // индекс в массиве-хранилище

   LogDeltaScales   [idxAmplVar] = log(dayDeltaScales); // log-масштаб текущего разбиения
   LogAmplVariations[idxAmplVar] = log(V);              // log-Амплитудная Вариация в текущем масштабе разбиений

   return V;
  }
//--------------------------------------------------------------------------------------------------------------------------------------

Фрагменты программы из файла  CFragmentIndexLine.mqh выполняют циклы для расчета площади покрытия как продемонстрировано на рис.2. Подробные комментарии в тексте программы объясняют последовательность действий.

Демонстрация работы индикатора на реальных данных

После вызова индикатора с запросом оценивания 600 дней и окном для оценивания 64 точки, получается результат из 536 значений индекса фрактальности, который отображен на рис.6.

FigGAZP

Рис.6 Цены закрытия ОАО "Газпром" и результаты оценивания индекса фрактальности

По рисунку видна корреляция показаний индекса и поведение цен. Синий цвет графика индекса соответствует трендовому состоянию системы, устойчивость тренда и возможность предсказания дальнейшего поведения. Фиолетовый цвет указывает на антиперсистентность по типу "розового шума", что соответствует "отрицательной" памяти и флэту. Желтый цвет — соответствует "броуновскому движению" — случайность движения и невозможность предсказания.

Заключение

Локальный фрактальный анализ в трейдинге интересен со следующих точек зрения:

  1. Определение разладки — момента смены статистических характеристик временного ряда;
  2. Прогнозирование временного ряда.

Следует учитывать, что достоверный масштаб для определения индекса   mu с подходящей точностью, на два порядка меньше, чем аналогичный масштаб для вычисления показателя Херста H. Такая разница позволяет использовать индекс   mu в качестве локального фрактального показателя. Поэтому можно считать, что индекс   mu описывает стабильность временного ряда. Случай   mu <0.5 может быть интерпретирован как тренд, а случай   mu >0.5 - как флэт. Случай же   mu ~ 0.5 соответствует броуновскому движению. Это позволяет с помощью функции   классифицировать исходные ценовые ряды и обосновывать прогноз. 

Литература

  1. Дубовиков М.М., Старченко Н.В. Эконофизика и фрактальный анализ финансовых временных рядов // УФН 2011, т. 181, № 7, стр. 779-786.
  2. Дубовиков М.М., Старченко Н.В. Эконофизика и анализ финансовых временных рядов // Сборн. "ЭКОНОФИЗИКА. Современная физика в поисках экономической теории", стр. 243-291. Под ред. В. В. Харитонова и А. А. Ежова. – М.: МИФИ, 2007.
  3. Петерс Дж. Хаос и порядок на рынках капитала. Новый аналитический взгляд на циклы, цены и изменчивость рынка.– M.: "Мир", 2000. - 333 c.
  4. Кривоносова Е.К., Первадчук В.П., Кривоносова Е.А. Сравнение фрактальных характеристик временных рядов экономических показателей. //проверка 09.05.2019
  5. Старченко Н.В. Локальный фрактальный анализ в физических приложениях. // Препринт № 006-2005 М.: МИФИ, 2005.


Прикрепленные файлы |
FRACTAL_upd.zip (21.58 KB)
Последние комментарии | Перейти к обсуждению на форуме трейдеров (34)
Алексей Тарабанов
Алексей Тарабанов | 20 июн. 2019 в 21:57
Статья очень бы выиграла, если бы автор дал определение термина "Фрактальная размерность". Без этого - статья ни о чем, а что такое фрактальная размерность я не знаю. 
Aleksandr Slavskii
Aleksandr Slavskii | 2 июн. 2023 в 11:10

Добрый день.

Запустил индикатор, таймфрейм 1 час, символ EURUSD, котировки метаквотов, настройки дефолтные.

Через несколько секунд работы, выдаёт ошибку  array out of range in 'CFractalSeriesSet.mqh' (108,17)

Стр.108 у меня эта

MuIndexes[ii] = IndexCalculater.Mu;

Сделал распринтовку. 

16:01:59.441    Fractal Index (EURUSD,H1)       ii = 539
16:01:59.441    Fractal Index (EURUSD,H1)       MuIndexes.Size() = 1074
16:01:59.441    Fractal Index (EURUSD,H1)       ii = 538
16:01:59.441    Fractal Index (EURUSD,H1)       MuIndexes.Size() = 1074
16:01:59.441    Fractal Index (EURUSD,H1)       ii = 537
16:01:59.441    Fractal Index (EURUSD,H1)       MuIndexes.Size() = 1074
16:02:10.682    Fractal Index (EURUSD,H1)       ii = 1610
16:02:10.682    Fractal Index (EURUSD,H1)       MuIndexes.Size() = 1074
16:02:10.685    Fractal Index (EURUSD,H1)       array out of range in 'CFractalSeriesSet.mqh' (108,17)

Не могу понять почему происходит выход за пределы массива. Размер массива 1074, индекс 1610, где выход за пределы?

И как то странно то, что индексы идут по убывающей,и не дойдя до нуля становится 1610, до этого было всё логично.

15:49:38.445    Fractal Index (EURUSD,H1)       ii = 1
15:49:38.445    Fractal Index (EURUSD,H1)       MuIndexes.Size() = 1074
15:49:38.445    Fractal Index (EURUSD,H1)       ii = 0
15:49:38.445    Fractal Index (EURUSD,H1)       MuIndexes.Size() = 1074
15:49:47.403    Fractal Index (EURUSD,H1)       ii = 1073
15:49:47.403    Fractal Index (EURUSD,H1)       MuIndexes.Size() = 1074
15:49:47.403    Fractal Index (EURUSD,H1)       ii = 1072
15:49:47.403    Fractal Index (EURUSD,H1)       MuIndexes.Size() = 1074

Можете подсказать в чём может крыться причина этого?

Как исправить?

Rashid Umarov
Rashid Umarov | 2 июн. 2023 в 11:35
Aleksandr Slavskii #:

Не могу понять почему происходит выход за пределы массива. Размер массива 1074, индекс 1610, где выход за пределы?

Вы же сами ответили

Aleksandr Slavskii
Aleksandr Slavskii | 2 июн. 2023 в 11:56
Rashid Umarov #:

Вы же сами ответили

Упс. Теперь вижу)

Почему то цифру 1610, мозг воспринимал как 1061 и я такой в непонятках, где выход за пределы.

Aleksandr Slavskii
Aleksandr Slavskii | 2 июн. 2023 в 13:09

Не уверен, что это правильно (уверен, что не правильно), но добавил в код строку.

В файле CFractalSeriesSet.mqh перед строкой 

ii = (CircleCount - 1 - i) + IndexCount; // СВЕЖИЕ ОЦЕНКИ ХРАНЯТСЯ В КОНЦЕ МАССИВОВ

написал

IndexCount = IndexCount >= (int)MuIndexes.Size() ? 0 : IndexCount;

Теперь за пределы массива не уходит. Но хз как это отразится на вычислениях индикатора.

Библиотека для простого и быстрого создания программ для MetaTrader (Часть XI). Совместимость с MQL4 - События закрытия позиций Библиотека для простого и быстрого создания программ для MetaTrader (Часть XI). Совместимость с MQL4 - События закрытия позиций
Продолжаем создавать большую кроссплатформенную библиотеку, целью которой является упростить написания программ для платформы MetaTrader 5 и MetaTrader 4. В десятой части мы продолжили работу над совместимостью библиотеки с MQL4 и сделали определение событий открытия позиций и активации отложенных ордеров. В данной статье сделаем определение событий закрытия позиций и избавимся от оказавшихся невостребованными свойств ордеров.
Библиотека для простого и быстрого создания программ для MetaTrader (Часть X): Совместимость с MQL4 - События открытия позиции и активации отложенных ордеров Библиотека для простого и быстрого создания программ для MetaTrader (Часть X): Совместимость с MQL4 - События открытия позиции и активации отложенных ордеров
В предыдущих статьях мы начали создавать большую кроссплатформенную библиотеку, целью которой является упростить написание программ для платформ MetaTrader 5 и MetaTrader 4. В девятой части начали дорабатывать классы библиотеки для работы в MQL4. В данной статье продолжим доработку библиотеки с целью полной её совместимости с MQL4.
Методы измерения скорости движения цены Методы измерения скорости движения цены
Существует множество различных подходов к исследованию и анализу рынков. Но основных обычно два: технический и фундаментальный. В первом случае происходит сбор, обработка и изучение каких-либо числовых данных и характеристик, связанных с рынком: цены, объемы и так далее. Во втором делается анализ событий и новостей, которые, в свою очередь, влияют прямо или косвенно на рынки. В статье рассматриваются методы измерения скорости движения цены и исследование торговых стратегий на их основе.
Создание графических интерфейсов на базе .Net Framework и C# (Часть 2): Дополнительные графические элементы Создание графических интерфейсов на базе .Net Framework и C# (Часть 2): Дополнительные графические элементы
Статья является логическим продолжением предыдущей публикации "Создание графических интерфейсов для экспертов и индикаторов на базе .Net Framework и C#" и знакомит читателей с новыми графическими элементами для создания графических интерфейсов.