¿Cómo se algoritmiza la detección de los grupos de alimentación MA? - página 11

 
Mikhail Toptunov:

Así que Moda es cada tres (x[2],x[5]...) o simplemente x[2] es moda

Lo siento, no lo entiendo como... ( que corresponde al máximo de la matriz pdf[i](el 4º argumento de la función.) )

Algo así:

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

De forma directa, sin optimizaciones, matrices y matemáticas complicadas:

1. Para la barra actual, cuente todas las MAs por separado. Obtenemos la matriz SMA[N] que contiene los valores de los máximos hasta N

2. creamos un mapa de calor[M] que cubre los precios desde el mínimo=1,00000, cada elemento es responsable de (por ejemplo) 10 puntos.

3. Rellenamos este mapa de calor "en bruto": tomamos cada valor ma y vemos a qué celda se refiere. índice=(SMA[i]-mínimo)/resolución. Aumentamos el valor de esta celda hetmap[index]+=1.0

Puede enviar el resultado a CSV y pensar

4. Suavizar los valores "crudos" del mapa de calor: iniciar el array smooth[] y leer el valor medio smotch[i]=valor medio del mapa de calor desde la ventana i hasta la ventana i+ inclusive

5. Los máximos locales de smootch indicarán un "grupo de alimentación". Espero que sepas buscar los máximos :-)

Los puntos 1 a 5 se pueden hacer por medio de las matemáticas y se calculan mucho más rápido, con un mínimo de bucles y matrices adicionales, pero no necesariamente más obvio


No entiendohetmap[index],index - ( si 500 MA por ejemplo, y resolución=10 puntos ) a cuanto ascenderá?

Joder y lo que esmínimo=1,00000.

Según tengo entendido:

En general, no hay manera, parece como si tuviéramos que comparar los dos MAs más cercanos, si es menor que 1, entonces escribir en hetmap[i ]

 
Dmitry Fedoseev:

¿Cómo encaja este mapa de calor?

Lo siento, ¡no entiendo a qué lado acercarse entonces!

 
Mikhail Toptunov:

Lo siento, ¡no sé qué camino tomar entonces!

Creo que deberíamos empezar por estudiar un libro de ABC.

 
Dmitry Fedoseev:

Parece que hay que empezar por estudiar un libro de ABC.



Eso es lo que podría hacer, ¡¡¡es la mejor opción!!! Pero eso es ***.

 
Mikhail Toptunov:


¡¡¡Esto es lo que podría hacer, es la mejor opción!!! Pero eso es ***.

¿Dónde están los grupos marcados allí?

 
¿Cómo buscará grupos de puntos en una línea recta?

Lo más sencillo es calcular la media (densidad dljat).

Esto es lo mismo aquí.
 
Entró en meditación profunda para buscar el significado de la palabra...
 
Dmitry Fedoseev:

¿Dónde están marcadas las agrupaciones?

En general, es necesario calcular el momento de transición de un paquete a otro, es decir, cuando el grupo cambia de movimiento.

La imagen muestra supuestamente estos momentos en el punto 50ur phyb.

Maxim Kuznetsov:
¿Cómo buscará grupos de puntos en una línea recta?

Lo más sencillo es calcular la media (densidad de dljats).

Aquí es lo mismo.

Si (MA[i-1] - MA[i])+(MA[i] - MA[i+1])<0,005 entonces

dentro de la zona МА[ i] (por ejemplo, +-10 valores de los índices i), busco el valor mínimo de MA

y escribir los parámetros del punto de cluster en la clase (crear un objeto en la clase)

identificar el paquete adyacente (el propio paquete) específicamente para la barra adyacente. Es decir, busco en los objetos de clase la cercanía de un punto y una barra.

y ver la tendencia del conjunto de objetos

 

En general, hago este tipo de actos

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