Come si fa ad algoritmizzare il rilevamento dei cluster di alimentazione MA? - pagina 11

 
Mikhail Toptunov:

Quindi Moda è ogni terzo (x[2],x[5]...) o solo x[2] è moda

Scusa, non lo capisco come... ( che corrisponde al massimo dell'array pdf[i](il 4° argomento della funzione). )

Qualcosa del genere:

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

In modo diretto, senza ottimizzazioni, matrici e matematica complicata:

1. Per la barra corrente, contare tutte le MA separatamente. Otteniamo l'array SMA[N] che contiene i valori dei massimi fino a N

2. creiamo una heatmap[M] che copre i prezzi dal minimo=1,00000, ogni elemento è responsabile di (per esempio) 10 punti.

3. Riempiamo questa heatmap "grezza": prendiamo ogni valore di ma e vediamo a quale cella si riferisce. indice=(SMA[i]-minimo)/risoluzione. Aumentiamo il valore di questa cella hetmap[index]+=1.0

È possibile emettere il risultato in CSV e pensare

4. Smussare i valori "grezzi" della heatmap: avviare l'array smooth[] e leggere la media smotch[i]=valore medio della heatmap da i-finestra a i+finestra compresa

5. I massimi locali di smootch indicheranno un "cluster di alimentazione". Spero che tu sappia come cercare i massimi :-)

I punti 1-5 possono essere fatti dalla matematica e calcolati molto più velocemente, con cicli minimi e array extra, ma non necessariamente più ovvi


Non capiscohetmap[index],indice - ( se 500 MA per esempio, e risoluzione=10 punti ) a quanto sarà?

Cazzo e cos'è ilminimo=1,00000.

Come ho capito:

In generale, in nessun modo, sembra che dobbiamo confrontare le due MA più vicine, se meno di 1, allora scrivere a hetmap[i ]

 
Dmitry Fedoseev:

Come si inserisce questa mappa di calore?

Mi dispiace, non capisco a quale parte avvicinarsi allora!

 
Mikhail Toptunov:

Mi dispiace, non so da che parte andare allora!

Penso che dovremmo iniziare a studiare un libro ABC.

 
Dmitry Fedoseev:

Sembra che si debba iniziare studiando un libro ABC.



Questo è quello che potrei fare, è l'opzione migliore!!! Ma questo è ***.

 
Mikhail Toptunov:


Ecco cosa potrei fare, è l'opzione migliore!!! Ma questo è ***.

Dove sono segnati i cluster?

 
Come cercherai gli ammassi di punti su una linea retta?

La cosa più semplice è calcolare la media (densità dljat).

Questo è lo stesso qui.
 
È entrato in profonda meditazione per cercare il significato della parola 'dljat'...
 
Dmitry Fedoseev:

Dove sono segnati i cluster?

In generale, è necessario calcolare il momento di transizione da un fascio all'altro, cioè quando il gruppo cambia movimento.

L'immagine mostra presumibilmente questi momenti al punto 50ur phyb.

Maxim Kuznetsov:
Come si cercano gli ammassi di punti su una linea retta?

La cosa più semplice è calcolare la media (densità di dljat).

Qui è lo stesso.

Se (MA[i-1] - MA[i])+(MA[i] - MA[i+1])<0,005 allora

all'interno della zona МА [i] (per esempio, +-10 valori degli indici i), cerco il valore minimo di MA

e scrivere i parametri del punto di raggruppamento nella classe (creare un oggetto nella classe)

identificare il fascio adiacente (il fascio stesso) specificamente per la barra adiacente. Cioè cerco tra gli oggetti della classe la vicinanza di un periodo e di una barra.

e vedere la tendenza del fascio di oggetti

 

In generale, faccio questo tipo di azioni

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