Фрактал по матрице (поиск чудо формулы) помогите плиззз МАСТЕРА, ГУРУ, ПРОФИ

 

В общем задача:

Рассчитать фрактал двумерного массива вернее класса.

Есть значит у меня результат вычисления 

void  CSMA_Greed::Solve(const int aRatesTotal,const int aPrevCalc,const double  &aData[])
  {
   rt=aRatesTotal;
   prv=aPrevCalc;
   for(int i=0; i<m_max_period; i++)
      ArrayResize(d[i].m,rt);
   chsma.Solve(rt,prv,aData,d[m_max_period-1].m);

   for(int i=prv>m_max_period?prv:m_max_period; i<rt; i++)
     {
      temp=d[m_max_period-1].m[i]*m_max_period;
      for(int j=m_max_period-2; j>=0; j--)
        {
         temp-=aData[i-(j+1)];
         d[j].m[i]=temp/(j+1);
        }
     }
  };

Это вычисление нужно прогнать по алгоритму поиска фракталов.

С начала вычислить фрактал по 

m[i]

потом на основе m[i] со смещением в одни шаг пройтись по верхушкам

d[j]
 

Я только учусь архитектуре классов, но то что я здесь надел это полное хов.о

void  CSMA_Greed::SolveFraktal(const int aRatesTotal,const int aPrevCalc,const double  &aData[])
  {

   for(int j=m_max_period-2; j>=0; j--)   // В минус период
     {
      double frpr[],outpr1[],outpr2[];
      ArrayResize(frpr,rt);
      ArrayResize(outpr1,rt);
      ArrayResize(outpr2,rt);
      for(int i=prv>m_max_period?prv:m_max_period; i<rt; i++) // В рост бар
        {
         frpr[i]=d[j].m[i];
        }
      fr.Solve(rt,aPrevCalc,frpr,frpr,outpr1,outpr2);

      for(int i=prv>m_max_period?prv:m_max_period; i<rt; i++) // В рост бар
        {
         if(outpr1[i]>0)
            df[j].m[i]=outpr1[i];
         if(outpr2[i]>0)
            df[j].m[i]=outpr2[i];
        }
     }

  };

Может есть у кого реализованный алгоритм расчетов фракталов в матрице или вообще это делается по чудо формуле?

 

Это не подойдёт? 

// Поиск нижнего фрактала
double LFractal( int  i,                           // Текущий бар
                 int  LeftWing,                    // Левое крыло фрактала
                 int  RightWing,                   // Правое крыло фрактала
                 bool StrictLeftWing,              // Регулярность левого крыла
                 bool StrictRightWing ){           // Регулярность правого крыла
   double C[],Result=0;
   if( i <= RightWing ) return(Result);
   int dim=ArrayResize(C,LeftWing+1+RightWing), j=0;
   while( j < dim ){                               // Массив сравниваемых значений
      C[j]=Low[j+i-RightWing];
      j++;
   }
   if( ( LeftWing                    < 1           // Левое крыло отсутствует, или
      || C[RightWing+1]-C[RightWing] > -Zero )     //    его основание выше центра
    && ( RightWing                   < 1           // Правое крыло отсутствует, или
      || C[RightWing-1]-C[RightWing] > -Zero ) ){  //    его основание выше центра
      Result=C[RightWing];                         // Локальный минимум в центре
      j=1;
      while ( j < dim-1 ){
         if( ( j < RightWing                       // Точка правого крыла; ее внешняя точка не выше:
              && ( ( !StrictRightWing  && Result-C[j-1] > Zero )     // центральной(нестрогий фрактал)
                || (  StrictRightWing  && C[j]  -C[j-1] > Zero ) ) ) // текущей(строгий фрактал)
          || ( j > RightWing                       // Точка левого крыла; ее внешняя точка не выше:
              && ( ( !StrictLeftWing && Result-C[j+1] > Zero )         // центральной(нестрогий фрактал)
                || (  StrictLeftWing && C[j]  -C[j+1] > Zero ) ) ) ) { // текущей(строгий фрактал)
            Result=0;                              // Нет фрактала в центре
            break;
         }
         j++;
      }
   }
   return(Result);
}
//+------------------------------------------------------------------+
// Поиск верхнего фрактала
double HFractal( int  i,                           // Текущий бар
                 int  LeftWing,                    // Левое крыло фрактала
                 int  RightWing,                   // Левое крыло фрактала
                 bool StrictLeftWing,              // Регулярность левого крыла
                 bool StrictRightWing ){           // Регулярность правого крыла
   double C[],Result=0;
   if( i <= RightWing ) return(Result);
   int dim=ArrayResize(C,LeftWing+1+RightWing), j=0;
   while( j < dim ){                               // Массив сравниваемых значений
      C[j]=High[j+i-RightWing];
      j++;
   }
   if( ( LeftWing                    < 1           // Левое крыло отсутствует, или
      || C[RightWing]-C[RightWing+1] > -Zero )     //    его основание ниже центра
    && ( RightWing                   < 1           // Правое крыло отсутствует, или
      || C[RightWing]-C[RightWing-1] > -Zero ) ){  //    его основание ниже центра
      Result=C[RightWing];                         // Локальный максимум в центре
      j=1;
      while( j < dim-1 ){
         if( ( j < RightWing                       // Точка правого крыла; ее внешняя точка не ниже:
              && ( ( !StrictRightWing  && C[j-1]-Result > Zero )     // центральной(нестрогий фрактал)
                || (  StrictRightWing  && C[j-1]-C[j]   > Zero ) ) ) // текущей(строгий фрактал)
          || ( j > RightWing                       // Точка левого крыла; ее внешняя точка не ниже:
              && ( ( !StrictLeftWing && C[j+1]-Result > Zero )         // центральной(нестрогий фрактал)
                || (  StrictLeftWing && C[j+1]-C[j]   > Zero ) ) ) ) { // текущей(строгий фрактал)
            Result=0;                              // Нет фрактала в центре
            break;
         }
         j++;
      }
   }
   return(Result);
}
 
Алексей Тарабанов #:

Это не подойдёт? 

Благодарю Вас!

Но это разобрать смекалки не хватит, может есть источник где можно почитать о этом алгоритме. Или картинка как это работает))

 

https://www.mql5.com/ru/forum/332765/page214#comment_18602588 

Ищем закономерности
Ищем закономерности
  • 2020.10.05
  • www.mql5.com
Привет, хлопцы! Предлагаю всем делиться найденными закономерностями...
 

Как бы мне определить эти фракталы имея двумерный массив значений


 
Алексей Тарабанов #:

https://www.mql5.com/ru/forum/332765/page214#comment_18602588 

Низкий вам поклон за помощь , я отыскал этот раздел по ключевым словам из кода, ознакамливаюсь, но пока не выудил понимания.

 
Mikhail Toptunov #:

Как бы мне определить эти фракталы имея двумерный массив значений


Я вижу поверхность в трёхмерном пространстве. Двумерным массивом значений чего Вы хотите её описать? 

 
Алексей Тарабанов #:

Я вижу поверхность в трёхмерном пространстве. Двумерным массивом значений чего Вы хотите её описать? 

Так у меня на каждом баре есть n-ое кол-во значений.

 d[j].m[i]=temp/(j+1); 
d[] - период
m[] - бар

на матрице это будет выглядеть так

      	m
d	0 0 0 0 1 0
	0 0 0 1 0 0
	0 0 1 0 0 0
	0 1 0 0 0 0

Я так то это реализовал , но так не красиво , нет чувства удовлетворения от этой реализации.

перебираю каждый b по m, ищу фрактал по одной оси (в матрице это вниз)
//+------------------------------------------------------------------+
//| Ищем фрактал движения                                            |
//+------------------------------------------------------------------+
int reversal(int p, int b, int i)
  {
   double pr1=sm_d_m(p-1,b,i);
   if(pr1>sm_d_m(p+1,b,i)&&  //--+
      pr1>sm_d_m(p,b,i)&&    //---+
      pr1>sm_d_m(p-2,b,i)&&  //--+
      pr1>sm_d_m(p-3,b,i))   //-+
      return(0);                       // с права на лево
   if(pr1<sm_d_m(p+1,b,i)&&  //--+
      pr1<sm_d_m(p,b,i)&&    //-+
      pr1<sm_d_m(p-2,b,i)&&  //--+
      pr1<sm_d_m(p-3,b,i))   //---+
      return(1);                       // с лева на право
   return(-1);
  }
Получившиеся значения перебираю по другой оси (в матрице это по единичкам)

void SvjazkaPO()
  {
   int index[],count=0,countchain=0;
   CountCB=0;
   ZeroMemory(cand_buff);
   ArrayResize(cand_buff,CountCB);
   for(int i=CountPO-1; i>=0 ; i--)//&&!IsStopped()
      if(PO[i].PriorMA!=-1)
        {
         count=0;
         ArrayResize(index,count+1);
         index[count]=i;
         int _i=i;
         //--
         for(int j=i-1; j>=0; j--)//&& !IsStopped()
            if(PO[j].PriorMA!=-1)
              {
               int b1=PO[_i].bar;
               int b2=PO[j].bar;
               if(b1-b2==1)
                 {
                  int p1=PO[i].PeriodUr50-count;
                  if(MathAbs(p1-PO[j].PeriodUr50)<=1)
                    {
                     count++;
                     ArrayResize(index,count+1);
                     index[count]=j;
                     _i=j;
                     PO[j].PriorMA=-1;
                    }
                 }
              }
         //--
         countchain++;
         SignalPO1(rates_total,index,count,countchain,high,low,tf);
         ZeroMemory(index);
        }

  }
 
Алексей Тарабанов #:

Я вижу поверхность в трёхмерном пространстве. Двумерным массивом значений чего Вы хотите её описать? 

А понял ось ХY же двумерная

только массив двумерный - это значит описывает трех мерное пространство, ну я так понимаю, может это и не важно.
 

Ну, для начала - это не фракталы, а экстремумы. Задача, которую Вы решаете - задача динамической оптимизации. 

Общих методов решения по сей день не существует. Разве что, принцип максимальной свободы выбора Г. Крона. 

Можно попробовать, конечно, но, вряд - ли здесь сложится архитектура классов, уж больно всё единичное, иногда - особенное и пока никогда - всеобщее.