Как алгоритмизировать выявление скопления фида МА? - страница 7

 
Aleksey Nikolayev:
Почему нельзя использовать MathQuantile()?
Наверное. Если необходимо искать медианы на каждом баре, то надо смотреть, что быстрее: поддерживать упорядоченный массив или использовать эту функцию.
 
Aleksey Nikolayev:
Почему нельзя использовать MathQuantile()?

Что в этой функции "массив вероятностей" - как его заполнить?

 
Вот еще бы кто подсказал, как отсортировать массив с привязкой к индексу. Эффективно!)
 
Mikhail Toptunov:
Вот еще бы кто подсказал, как отсортировать массив с привязкой к индексу. Эффективно!)

Индекс в массив засуньте. Размерность только увеличится массива.

 

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

То есть все добавления в массив нужно делать через эту функцию:

//находим место для значения в отсортированном массиве и записываем его туда
void SetValueInSortArray(double &eArray[], double eValue)
   {
   //находим индекс, куда будем вставлять элемент
   int eFinish=ArrayRange(eArray,0)-1;
   int eIndex;
   if(eFinish==-1)
      {
      eIndex=0;
      }
   else if(NormalizeDouble(eArray[eFinish]-eValue,8)<0)
      {
      eIndex=eFinish+1;
      }
   else
      {
      int eLower=0;
      int eUpper=eFinish;
      eIndex=0;
      while(eLower<=eUpper)
         {
         eIndex=(eLower+eUpper)/2;
         if(NormalizeDouble(eArray[eIndex]-eValue,8)>=0)
            {
            if(eIndex>0 && NormalizeDouble(eArray[eIndex-1]-eValue,8)<0)
               {
               break;
               }
            else
               {
               eUpper=eIndex-1;
               }
            }
         if(NormalizeDouble(eArray[eIndex]-eValue,8)<0)
            {
            eLower=eIndex+1;
            }
         }
      }
   //вставка элемента в начало массива
   if(eIndex==0)
      {
      if(ArrayRange(eArray,0)==0)
         {
         ArrayResize(eArray,1);
         }
      else
         {
         ArrayCopy(eArray,eArray,1,0);
         }
      }
   //вставка элемента в конец массива
   else if(eIndex>=ArrayRange(eArray,0))
      {
      ArrayResize(eArray,eIndex+1);
      }
   //вставка элемента в середину массива
   else
      {
      ArrayCopy(eArray,eArray,eIndex,eIndex-1);
      }
   eArray[eIndex]=eValue;
   }  
Используется бинарный поиск, должно быть быстро.
 
Mikhail Toptunov:
Вот еще бы кто подсказал, как отсортировать массив с привязкой к индексу. Эффективно!)

Двухмерный массив, функция ArraySort()

 
Неее, найти место одному элементу и сортировать весь массив - это сильно различное время.
 
Aleksey Vyazmikin:

Что в этой функции "массив вероятностей" - как его заполнить?

Какие квантили нужно посчитать, например:

{0.5} - медиана

{0.25, 0.5, 0.75} - квартили

{0.01, 0.02, ..., 0.99} - персентили

 
Mikhail Toptunov:
Вот еще бы кто подсказал, как отсортировать массив с привязкой к индексу. Эффективно!)

Попробуйте MathQuickSort()

 
Mikhail Toptunov:

Пример:

Массив 30 значений цены МА, ищем середину упорядоченного массива.

Получаем 15(L0) значение середины массива,далее получаем два массива от L0 вниз и L0 наверх, находим середину этих массивов и так до получения количества fokus(семи значений например)

и будет тиковый в конечном итоге

ответ прост - математическая обработка вводит в заблуждение