Я только учусь архитектуре классов, но то что я здесь надел это полное хов.о
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
Как бы мне определить эти фракталы имея двумерный массив значений
Я вижу поверхность в трёхмерном пространстве. Двумерным массивом значений чего Вы хотите её описать?
Так у меня на каждом баре есть 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); } }
Ну, для начала - это не фракталы, а экстремумы. Задача, которую Вы решаете - задача динамической оптимизации.
Общих методов решения по сей день не существует. Разве что, принцип максимальной свободы выбора Г. Крона.
Можно попробовать, конечно, но, вряд - ли здесь сложится архитектура классов, уж больно всё единичное, иногда - особенное и пока никогда - всеобщее.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
В общем задача:
Рассчитать фрактал двумерного массива вернее класса.
Есть значит у меня результат вычисления
Это вычисление нужно прогнать по алгоритму поиска фракталов.
С начала вычислить фрактал по
m[i]
потом на основе m[i] со смещением в одни шаг пройтись по верхушкам
d[j]