Comment algorithmez-vous la détection des clusters d'alimentation MA ? - page 11

 
Mikhail Toptunov:

Donc Moda est chaque tiers (x[2],x[5]...) ou juste x[2] est moda.

Désolé, je ne le comprends pas comme... ( qui correspond au maximum du tableau pdf[i](le 4ème argument de la fonction). )

Quelque chose comme ça :

#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 manière simple, sans optimisations, matrices et mathématiques compliquées :

1. pour la barre actuelle, comptez toutes les MAs séparément. Nous obtenons le tableau SMA[N] qui contient les valeurs des maxima jusqu'à N.

2. nous créons une carte thermique [M] qui couvre les prix à partir de minimum=1.00000, chaque élément est responsable de (par exemple) 10 points.

3. Nous remplissons cette carte thermique "brute" : nous prenons chaque valeur ma et voyons à quelle cellule elle se réfère. index=(SMA[i]-minimum)/résolution. Nous augmentons la valeur de cette cellule hetmap[index]+=1.0

Vous pouvez sortir le résultat vers CSV et penser

4. Lisser les valeurs "brutes" de la carte de chaleur : commencez le tableau smooth[] et lisez la moyenne smotch[i]=valeur moyenne de la carte de chaleur de i-fenêtre à i+fenêtre incluse.

5. Les maxima locaux du lissage indiqueront un "groupe d'aliments". J'espère que vous savez comment rechercher les maxima :-)

Les éléments 1 à 5 peuvent être décomposés mathématiquement et calculés beaucoup plus rapidement, avec un minimum de boucles et de tableaux supplémentaires, mais pas nécessairement de manière plus intuitive.


Je ne comprends pashetmap[index],index - ( si 500 MA par exemple, et résolution=10 points ) à combien sera-t-il ?

Putain et c'est quoi leminimum=1.00000.

Si je comprends bien :

En général, pas du tout, il semble que nous devions comparer les deux MA les plus proches, si elles sont inférieures à 1, alors écrire dans hetmap[i ].

 
Dmitry Fedoseev:

Quel est le rôle de cette carte thermique ?

Je suis désolé, je ne comprends pas quel côté aborder alors !

 
Mikhail Toptunov:

Je suis désolé, je ne sais pas quel chemin prendre alors !

Je pense que nous devrions commencer par étudier un livre d'ABC.

 
Dmitry Fedoseev:

Il semble que vous deviez commencer par étudier un livre d'ABC.



C'est ce que je pourrais faire, c'est la meilleure option ! !! Mais c'est ***.

 
Mikhail Toptunov:


Voici ce que je pourrais faire, c'est la meilleure option ! !! Mais c'est ***.

Où sont marqués les clusters à cet endroit ?

 
Comment allez-vous chercher des groupes de points sur une ligne droite ?

Le plus simple est de calculer la moyenne (densité dljat).

C'est la même chose ici.
 
Je suis entré dans une profonde méditation pour chercher la signification du mot "dljat"...
 
Dmitry Fedoseev:

Où sont marqués les clusters ?

En général, il est nécessaire de calculer le moment de transition d'un faisceau à un autre, c'est-à-dire le moment où le faisceau change de mouvement.

L'image est censée montrer ces moments au point 50ur phyb.

Maxim Kuznetsov:
Comment rechercher des groupes de points sur une ligne droite ?

Le plus simple est de calculer la moyenne (densité des dljats).

Ici, c'est la même chose.

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

dans la zone МА[ i] (par exemple, +-10 valeurs des indices i), je cherche la valeur minimale de MA

et écrire les paramètres du point d'amas dans la classe (créer un objet dans la classe)

identifier la liasse adjacente (la liasse elle-même) spécifiquement pour la barre adjacente. Par exemple, je recherche dans les objets de la classe la proximité d'une période et d'une barre.

et voir la tendance du paquet d'objets

 

En général, je fais ce genre d'acte

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