Como vocês algoritmam a detecção de aglomerados de ração MA? - página 11

 
Mikhail Toptunov:

Então Moda é cada terço(x[2],x[5]...) ou apenas x[2] é moda

Desculpe, não entendo isso como... ( que corresponde ao máximo da matriz pdf[i](o 4º argumento da função). )

Algo parecido com isto:

#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 simples, sem otimizações, matrizes e matemática complicada:

1. para a barra atual, conte todos os MAs separadamente. Recebemos SMA[N] array que contém valores de Máximos até N

2. criamos um heatmap[M] que cobre preços a partir de um mínimo=1,00000, cada elemento é responsável por (por exemplo) 10 pontos.

3. Preenchemos este mapa de calor "bruto": pegamos cada valor ma e vemos a que célula ele se refere. index=(SMA[i]-minimum)/resolução. Aumentamos o valor desta célula hetmap[índice]+=1,0

Você pode emitir o resultado para o CSV e pensar

4. Suavizar os valores "brutos" do heatmap: iniciar a matriz suavemente[] e ler o smotch[i]= valor médio do heatmap de i-window para i+window inclusive

5. Os máximos locais de smootch indicarão um "conjunto de rações". Espero que você saiba como procurar os máximos :-)

Os pontos 1-5 podem ser decompostos matematicamente e computados muito mais rapidamente, com um mínimo de loops e arrays extras, mas não necessariamente mais intuitivos.


Não entendohetmap[índice],índice - ( se 500 MA, por exemplo, e resolução=10 pontos ) a quanto será?

Foda-se e o que émínimo=1,00000.

Pelo que entendi:

Em geral, de maneira alguma, parece que precisamos comparar os dois MA mais próximos, se menos de 1, então escreva para o hetmap[i ]

 
Dmitry Fedoseev:

Como se encaixa este mapa de calor?

Desculpe, não entendo qual lado abordar então!

 
Mikhail Toptunov:

Desculpe, então não sei para que lado ir!

Acho que devemos começar estudando um livro do ABC.

 
Dmitry Fedoseev:

Parece que você tem que começar estudando um livro do ABC.



Isso é o que eu poderia fazer, essa é a melhor opção!!! Mas isso é ***.

 
Mikhail Toptunov:


Eis o que eu poderia fazer, é a melhor opção!!! Mas isso é ***.

Onde estão marcados os aglomerados?

 
Como você procurará grupos de pontos em uma linha reta?

O mais simples é calcular a média (densidade dljat).

O mesmo se passa aqui.
 
Fomos em profunda meditação para buscar o significado da palavra "dljat".
 
Dmitry Fedoseev:

Onde estão marcados os aglomerados?

Em geral, é necessário calcular o momento de transição de um agrupamento para outro, ou seja, quando o agrupamento muda de movimento.

A foto supostamente mostra estes momentos no ponto 50ur phyb.

Maxim Kuznetsov:
Como você buscará clusters de pontos em uma linha reta?

O mais simples é calcular a média (densidade de dljats).

Aqui é a mesma coisa.

Se (MA[i-1] - MA[i])+(MA[i] - MA[i+1])<0,005 então

dentro da zona МА[ i] (por exemplo, +-10 valores de índices i), procuro o valor mínimo de MA

e escrever os parâmetros do ponto de agrupamento na classe (criar um objeto na classe)

identificar o feixe adjacente (o próprio feixe) especificamente para a barra adjacente. Isto é, procuro nos objetos de classe a proximidade de um período e de um bar.

e ver a tendência do feixe de objetos

 

Em geral, eu faço este tipo de ato

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