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

 
Mikhail Toptunov:

То есть Мода - каждый третий(х[2], х[5] ...) или  просто  х[2] - мода

Простите, я не понимаю это как... ( который соответствует максимуму массива pdf[i] (4-й аргумент функции). )

Как-то так:

#include <Math\Stat\Math.mqh>
void OnStart()
{
  double a[] = {0.1, 0.2, 0.3, 0.4, 0.5, 0.55, 0.56, 0.565, 0.57, 0.58, 0.59, 0.6, 0.7, 0.8, 0.9};
  double mode, eps = 0.01;
  mode = mode_calc(a, eps);
  Print("mode = ", mode);
}
//+------------------------------------------------------------------+
double mode_calc(double &a[], double eps)// вычисление моды для выборки a[] с точностью eps
{
  double x[], pdf[];
  MathSequence(MathMin(a), MathMax(a), eps, x);
  int n = ArraySize(x);
  ArrayResize(pdf, n);
  MathProbabilityDensityEmpirical(a, n, x, pdf);
  int ix = ArrayMaximum(pdf);
  return x[ix];
}
 
Maxim Kuznetsov:

в лоб, без оптимизаций, матриц и сложной математики:

1. для текущего бара считаем все МА-шки по отдельности. Получаем массив SMA[N] в коротром лежат значения машек до N

2. заводим heatmap[M], который покрывает цены от minimum=1.00000 , Каждый элемент отвечает за (например) resolution=10 пунктов. 

3. Заполняем этот "сырой" heatmap: берём значение каждой ма-шки и смотрим к какой ячейке оно относится. index=(SMA[i]-minimum)/resolution. Увеличиваем значение этой ячейки hetmap[index]+=1.0

полученный результат можно вывести в CSV и подумать

4. Сглаживаем значения "сырого" heatmap: заводим массив smooth[] и считаем среднее smotch[i]=среднее значение heatmap oт i-window до i+window включительно

5. Локальные максимумы smootch будут указывать на "скопление фидов". Максимумы надеюсь, умеете искать :-)

пункты 1-5 можно разложить математикой и посчитать гораздо быстрее, с минимумом циклов и доп.массивов, но не факт что будет нагляднее


Я вот не понимаю  hetmap[index],  index - ( если 500 МА например, а resolution=10 пунктов) до скольки будет?

Блин и что такое minimum=1.00000.

Как понимаю :

В общем то ни как, кажется будто надо сравнить две ближайшие МА если меньше  1-цы их разница, то записываем в  hetmap[i]

 
Dmitry Fedoseev:

Каким боком сюда эта тепловая карта?

Прошу прощения, я тогда не понимаю, с какого бока подойти!

 
Mikhail Toptunov:

Прошу прощения, я тогда не понимаю, с какого бока подойти!

Кажется с изучения букваря надо начать.

 
Dmitry Fedoseev:

Кажется с изучения букваря надо начать.



Вот что я смог, это лучший вариант!!! Но это же ***

 
Mikhail Toptunov:


Вот что я смог, это лучший вариант!!! Но это же ***

А где там обозначены скопления?

 
Скопления точек на прямой как искать будете?

Простейшее - посчитать среднюю (плотность длжат). 

Вот тут также. 
 
Ушел в глубокую медитацию за поиском смысла слова "длжат"...
 
Dmitry Fedoseev:

А где там обозначены скопления?

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

на картинке якобы отображены эти моменты в точке 50ур фиб. 

Maxim Kuznetsov:
Скопления точек на прямой как искать будете?

Простейшее - посчитать среднюю (плотность длжат). 

Вот тут также. 

Если (МА[i-1] -МА[i])+(МА[i] -МА[i+1])<0.005 то

в зоне МА [i] (например +-10 значений индексов i) ищу минимальное значение МА

и записываю в класс параметры точки скопления (создаю объект в классе)

выявляю соседнюю связку(сам жгут) конкретно соседнего бара. То есть перебираю объекты класса на близость периода и бара.

и смотрю тенденцию связки из объектов

 

В Общем действо такое исполняю

void  medianaL0_0(const int rates_total,const datetime &time[])
  {
   double masPra[Pmax]; // хранение цены МА
   int masPer[Pmax]; // хранение Периода 
   CountPO=0;
   ArrayResize(PO,CountPO); 
   ZeroMemory(PO);
   for(int b=rates_total-Pmax; b<rates_total; b++)
     {
      for(int p=2; p<Pmax; p++) // отбор по периодам
        {
         masPra[p]=sm.d[p-1].m[b]; 
         masPer[p]=p;        
        }
      MathQuickSort(masPra,masPer,2,Pmax-1,1);
      medianaL0_2(masPra,masPer,b,time);
     }
  }

void medianaL0_2(const double &masPra[],const int &masPer[],int bar,const datetime &time[])
  {
   double m[Pmax],x=0,y=0;
   for(int i=5; i<Pmax-1; i++)
     {
      filter0_0(i);
      x=MathAbs(masPra[i-1]-masPra[i]); //MathSqrt
      y=MathAbs(masPra[i]-masPra[i+1]);
      int a=MathAbs(masPer[_ot]-masPer[i]);
      int b=MathAbs(masPer[i]-masPer[_do]);
      if(masPer[i]-masPer[i-1]<=_ot)//&&masPer[i+1]-masPer[i]<=_ot
         m[i]=x+y;
       else
          m[i]=-1;
     }
   medianaL0_3(masPra,masPer,bar,time,m);
  }

void medianaL0_3(const double &masPra[],const int &masPer[],int bar,const datetime &time[],const double &m[])
  {
   for(int i=5; i<Pmax-1; i++)
     {
      filter0_0(i);
      int z=ArrayMinimum(m,_ot,_do);
      if(m[z]<=0.005&&m[z]!=-1)
        {
         ArrayResize(PO,CountPO+1); 
         PO[CountPO].bar=bar;
         PO[CountPO].period=masPer[i];
         PO[CountPO].mediana=i;
         PO[CountPO].praceMA=masPra[i];
         PO[CountPO].time=time[bar];
         CountPO++;
        }
      i=i+_do;
     }
  }
Причина обращения: