Wie funktioniert der Algorithmus zur Erkennung von MA-Futtermittelclustern? - Seite 11

 
Mikhail Toptunov:

Moda ist also jedes Drittel (x[2],x[5]...) oder nur x[2] ist moda

Tut mir leid, ich verstehe das nicht als... ( was dem Maximum des Arrays pdf[i](dem 4. Argument der Funktion) entspricht. )

Etwa so:

#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:

Auf einfache Weise, ohne Optimierungen, Matrizen und komplizierte Mathematik:

1. für den aktuellen Balken alle MAs einzeln zählen. Wir erhalten das Array SMA[N], das die Werte der Maxima bis zu N enthält

2. Wir erstellen eine Heatmap[M], die Preise ab Minimum=1,00000 abdeckt, wobei jedes Element für (z.B.) 10 Punkte verantwortlich ist.

3. Wir füllen diese "rohe" Heatmap: Wir nehmen jeden ma-Wert und sehen, auf welche Zelle er sich bezieht. index=(SMA[i]-minimum)/Auflösung. Wir erhöhen den Wert dieser Zelle hetmap[index]+=1.0

Sie können das Ergebnis in CSV ausgeben und denken

4. Glätten der "rohen" Heatmap-Werte: Array smooth[] beginnen und den Durchschnittswert smotch[i]=Durchschnittswert der Heatmap von i-Fenster bis einschließlich i+Fenster lesen

5. Die lokalen Maxima von smootch deuten auf einen "Cluster of Feeds" hin. Ich hoffe, Sie wissen, wie man nach maxima sucht :-)

Die Punkte 1-5 können mathematisch zerlegt und viel schneller berechnet werden, mit einem Minimum an Schleifen und zusätzlichen Arrays, aber nicht unbedingt intuitiver.


Ich verstehe nichthetmap[index],index - ( wenn 500 MA zum Beispiel, und resolution=10 Punkte ) zu wie viel wird es sein?

Fuck und was istMinimum=1.00000.

So wie ich es verstehe:

Im Allgemeinen, nein, es scheint, als ob wir die beiden nächstgelegenen MAs vergleichen müssen, wenn weniger als 1, dann in hetmap[i ] schreiben.

 
Dmitry Fedoseev:

Was hat es mit dieser Heatmap auf sich?

Tut mir leid, ich weiß nicht, an welche Seite ich mich dann wenden soll!

 
Mikhail Toptunov:

Tut mir leid, ich weiß nicht, welchen Weg ich einschlagen soll!

Ich denke, wir sollten damit beginnen, ein ABC-Buch zu studieren.

 
Dmitry Fedoseev:

Es scheint, dass man mit dem Studium eines ABC-Buches beginnen muss.



Das könnte ich tun, das ist die beste Option!!! Aber das ist ***.

 
Mikhail Toptunov:


Das könnte ich tun, das ist die beste Option!!! Aber das ist ***.

Wo sind dort die Cluster markiert?

 
Wie suchen Sie nach Punkthäufungen auf einer Geraden?

Am einfachsten ist es, den Durchschnitt zu berechnen (Dichte dljat).

Das ist auch hier der Fall.
 
In tiefer Meditation nach der Bedeutung des Wortes 'dljat' gesucht...
 
Dmitry Fedoseev:

Wo sind die Cluster markiert?

Im Allgemeinen muss der Zeitpunkt des Übergangs von einem Bündel zu einem anderen berechnet werden, d. h. der Zeitpunkt, an dem das Bündel seine Bewegung ändert.

Das Bild zeigt angeblich diese Momente am Punkt 50ur phyb.

Maxim Kuznetsov:
Wie sucht man nach Punktclustern auf einer geraden Linie?

Am einfachsten ist es, den Durchschnitt (Dichte der Dljats) zu berechnen.

Hier ist es das Gleiche.

Wenn (MA[i-1] - MA[i])+(MA[i] - MA[i+1])<0,005 dann

innerhalb der МА[ i]-Zone (z. B. +-10 Werte der Indizes i), suche ich den Mindestwert von MA

und schreiben Sie die Parameter des Clusterpunkts in die Klasse (erstellen Sie ein Objekt in der Klasse)

das angrenzende Bündel (das Bündel selbst) speziell für den angrenzenden Balken identifizieren. D.h. ich suche in den Klassenobjekten nach der Nähe eines Punktes und eines Balkens.

und sehen Sie die Tendenz des Bündels von Objekten

 

Im Allgemeinen mache ich diese Art von Handlung

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