你是如何对MA饲料集群的检测进行算法的? - 页 11

 
Mikhail Toptunov:

所以莫达是每三分之一(x[2],x[5]......)或只有x[2]是莫达

对不起,我不明白它是...(相当于数组pdf[i] 的最大值(函数的第四个参数。))

类似这样的事情。

#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.对于当前柱状图,分别计算所有的MAs。我们得到SMA[N]数组,其中包含了N以内的最大值的值

2.我们创建一个热图[M],它涵盖了从最小=1.00000的价格,每个元素负责(例如)10个点。

3.我们填充这个 "原始 "热图:我们取每个ma值,看看它指的是哪个单元。index=(SMA[i]-minimum)/resolution。我们增加这个单元格的值 hetmap[index]+=1.0

你可以将结果输出到CSV,并认为

4.平滑 "原始 "热图值:启动数组smooth[],读取从i窗口到i+窗口(含)的热图平均值smotch[i]。

5.smootch的局部最大值将表明一个 "饲料集群"。我希望你知道如何寻找最大值 :-)

第1-5点可以用数学方法分解和计算,速度快得多,只需最少的循环和额外的数组,但不一定更直观。


我不明白hetmap[index],index-(如果500MA为例, 而分辨率=10点)会是多少?

他妈的,什么是最小=1.00000

根据我的理解:

一般来说,没有办法,似乎我们需要比较两个最近的MA,如果小于1,就写到hetmap[i]。

 
Dmitry Fedoseev:

这张热力图是如何体现的?

对不起,我不明白该从哪方面着手!

 
Mikhail Toptunov:

对不起,那我不知道该走哪条路!

我想我们应该从学习一本ABC书开始。

 
Dmitry Fedoseev:

似乎你必须从学习ABC书开始。



这就是我可以做的,这是最好的选择!!。但这是***。

 
Mikhail Toptunov:


这是我可以做的,这是最好的选择!!!但这是***。

那里标记的群组在哪里?

 
你将如何寻找直线上的点群?

最简单的是计算平均值(密度dljat)。

这里也是如此。
 
进入深度冥想,寻找 "dljat "一词的含义......
 
Dmitry Fedoseev:

群集的标记在哪里?

一般来说,有必要计算一个束向另一个束过渡的时刻,也就是集群改变运动的时候。

据称,图片显示这些时刻在50ur phyb点。

Maxim Kuznetsov:
你将如何在一条直线上搜索点群?

最简单的是计算平均值(dljats的密度)。

这里也是如此。

如果(MA[i-1]-MA[i])+(MA[i]-MA[i+1])<0.005那么

МА[i]区域内(例如,指数i的+-10值),我寻找MA的最小值

并将集群点的参数写入类中(在类中创建一个对象)。

识别相邻的捆绑物(捆绑物本身),专门用于相邻的条形物。也就是说,我通过类对象 来寻找一个句号和一个条形的接近性。

并看到物体束的倾向性

 

一般来说,我做这种行为

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;
     }
  }