Помогите с поиском фракталов

 

Возможно кому то вопрос покажется глупым, мне необходимо найти фракталы на графике, по типу Zig Zag.

Я использую сейчас вот такой код:

OnTick {
int trend_z;
int zi=2;
if(iBarShift(NULL,0,time_zig)>0){//Что бы ускорить, включаем проверку только раз в бар
        zi=2;
        time_zig=TimeCurrent();
+-----------------------------------------------------------------------+
                                                                        | Определим тренд что бы вычислить где верхний фрактал а где нижний     
+-----------------------------------------------------------------------+ Zig возвращает цену фрактала по ZigZag по фракталам а не по барам, Zig(индекс фрактала)

        if(zig(0)<zig(1)){trend_z=-1;}// Есил тренд  Zig Zag вниз, то индекс Zig(1) это верхние фракталы
        if(zig(0)>zig(1)){trend_z=1;}// Есил тренд  Zig Zag вверх, то индекс Zig(1) это нижние фракталы

+-----------------------------------------------------------------------+
                                                                        | Поскольку мы знаем на каких индексах верхние фракталы и нижние, мы начинаем перебор
+-----------------------------------------------------------------------+ 

if(trend_z==-1)
{
        zi=2;
        while(zi<48 && ti_c(zi,"LO")){zi=zi+2;}//Если при тренде вниз мы всегда будем прибавлять к индексу 2 +2, то всегда получим нижний.
        price_S=zig(zi); 
        zi=1;
        while(zi<48 && ti_c(zi,"HI")){zi=zi+2;}//Если при тренде вниз мы всегда будем прибавлять к индексу 1 +2 к индексу, то всегда получим верхний.
        price_B=zig(zi);
}
if(trend_z==1)
{
        zi=2;
        while(zi<48 && ti_c(zi,"HI")){zi=zi+2;}//Аналогично
        price_B=zig(zi);
        zi=1;
        while(zi<48 && ti_c(zi,"LO")){zi=zi+2;}
        price_S=zig(zi);
}
}
}

+-----------------------------------------------------------------------+
                                                                        | Определим, пробивала ли цена уровень фрактала который мы ищем или нет 
+-----------------------------------------------------------------------+ 

bool ti_c(int indx, string type_)

{
double zig = zig(indx,"value");
int date_zig = zig(indx,"date");
bool res=true;  
if(type_=="HI")
 {
   int hitest = iHighest(Symbol(),Period(),MODE_HIGH,date_zig,0);
   double hit = iHigh(Symbol(),Period(),hitest);
   //hit = NormalizeDouble(hit+(50*Point()),Digits());
   if(hit<=zig) res=false;
   if(hit>zig) res=true;
   //Print("Ищем HI до фрактала: "+indx+" в периоде "+ date_zig +"нашли, это № "+hitest+" он равен "+hit+" это "+res+" чем это" +zig);
   }
if(type_=="LO")
   {
   int hitest = iLowest(Symbol(),Period(),MODE_LOW,date_zig,0);
   double hit = iLow(Symbol(),Period(),hitest);
   //hit = NormalizeDouble(hit-(50*Point()),Digits());
   if(hit>=zig) res=false;
   if(hit<zig) res=true;
  // Print("Ищем LO до фрактала: "+indx+" в периоде "+ date_zig +"нашли, это № "+hitest+" он равен "+hit+" это "+res+" чем это" +zig);
   }


return(res);
}

+-----------------------------------------------------------------------+
                                                                        | Собственно сам Zig Zag        
+-----------------------------------------------------------------------+ 

double zig(int period_frac, string fun="value")  {

double wave_00=0.0;      

if(period_frac<40 && period_frac>-1 ){
        if(period_frac<period_frac+1){
        double swing_value[50]={0,0,0,0};
        datetime swing_date[50]={0,0,0,0};
        int found=0;
        int i=0;
        while(found<50){
         if(iCustom(Symbol(),Period(),"ZigZag",par12,par5,par3,0,i)!=0){
            swing_value[found]=iCustom(Symbol(),Period(),"ZigZag",par12,par5,par3,0,i);
            swing_date[found]=iTime(Symbol(),Period(),i);
            found++;
         }
         i++; 
        }


  double wave_0=swing_value[period_frac];
  if(fun=="date") {int wave_00_=swing_date[period_frac]; wave_00=iBarShift(Symbol(),Period(),wave_00_);}
  if(fun=="value"){wave_00=wave_0;}
   }}

return(wave_00);
   }

В моих каракулях вряд ли что то понятно, это я к тому что я слишком усложняю. К тому же этот код очень сильно тормозит из за самого индикатора ZigZag. Оптимизация вообще не проходит, просто зависает.
Вообщем вопрос такой, как определить индексы фракталов более тривиальным способом ?

Файлы:
ZigZag.mq4  9 kb
 
Gennady Sergienko:

Возможно кому то вопрос покажется глупым, мне необходимо найти фракталы на графике, по типу Zig Zag.

Я использую сейчас вот такой код:

В моих каракулях вряд ли что то понятно, это я к тому что я слишком усложняю. К тому же этот код очень сильно тормозит из за самого индикатора ZigZag. Оптимизация вообще не проходит, просто зависает.
Вообщем вопрос такой, как определить индексы фракталов более тривиальным способом ?

Усовершенствование сего алгоритма уже на уровне финансирования разработак. А наработки в этом направлении уже есть. 

А если упрощенно, то излом колена непременно фрактал. Выразить в коде. 

 

https://www.mql5.com/ru/forum/131859/page6#comment_3359703

из этой ветки - https://www.mql5.com/ru/forum/131859

там много всяких полезностей

Только "Полезные функции от KimIV".
Только "Полезные функции от KimIV".
  • 2011.02.18
  • www.mql5.com
Все функции взяты из этой ветки - http://forum.mql4...
 
Gennady Sergienko:

Возможно кому то вопрос покажется глупым, мне необходимо найти фракталы на графике, по типу Zig Zag.

Я использую сейчас вот такой код:

В моих каракулях вряд ли что то понятно, это я к тому что я слишком усложняю. К тому же этот код очень сильно тормозит из за самого индикатора ZigZag. Оптимизация вообще не проходит, просто зависает.
Вообщем вопрос такой, как определить индексы фракталов более тривиальным способом ?

Не очень понятна постановка задачи. Если Вам нужно вывести только вершины зигзага в виде значков, то самый простой способ - модифицировать код зигзага, изменив форму представления индикатора.