Алгоритм поиска фракталов. Вопрос по нему...

 

Здраствуйте! Вот алгоритм поиска последних фракталов. Вопрос заключается в следующем; Как можно узнать на каком баре он всё таки нашёл эти фракталы??? Ну и походу дела ещё один вопросик ;-) Как дописать его, чтоб он ещё и вторые, верхний и нижний, фракталы искал... Вот и сам алгоритм

//+-------------------------------------------------------------+
//| Пункт №1 алгоритма. Поиск верхнего и нижнего фракталов                   |
//+-------------------------------------------------------------+
  double UpFractal = 0;
  double DownFractal= 0;
  int i = 3;
  while((UpFractal == 0 || DownFractal == 0) && i<50)  
  {
  if(iFractals(NULL, 0, MODE_UPPER, i) != 0)
  if(UpFractal == 0)
  UpFractal = iFractals(NULL, 0, MODE_UPPER, i);
  if(iFractals(NULL, 0, MODE_LOWER, i) != 0)
  if(DownFractal == 0)
  DownFractal = iFractals(NULL, 0, MODE_LOWER, i);
  i++;  
  }
  if(UpFractal == 0 || DownFractal == 0)
  {
  Print("Ошибка в истории. Не найден один из фракталов !");
  return(0);
  }
// ***************** Фракталы найдены  *****************************


Заранее благодарен!!! Dimi.

 

---

//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. aka KimIV, http://www.kimiv.ru |
//+----------------------------------------------------------------------------+
//| Версия : 13.08.2008 |
//| Описание : Возвращает номер бара фрактала по его номеру. |
//+----------------------------------------------------------------------------+
//| Параметры: |
//| sy - наименование инструмента ("" или NULL - текущий символ) |
//| tf - таймфрейм ( 0 - текущий ТФ) |
//| nf - номер фрактала ( 0 - последний) |
//+----------------------------------------------------------------------------+
int GetFractalBar(string sy="0", int tf=0, int nf=0) {
if (sy=="" || sy=="0") sy=Symbol();
double f=0;
int i, k=iBars(sy, tf), kf;

for (i=2; i<k; i++) {
f=iFractals(sy, tf, MODE_LOWER, i);
if (f!=0) {
kf++;
if (kf>nf) return(i);
}
f=iFractals(sy, tf, MODE_UPPER, i);
if (f!=0) {
kf++;
if (kf>nf) return(i);
}
}
Print("GetFractalBar(): Фрактал не найден");
return(-1);
}

И вот тебе функции - для определения (нижний или верхний)

//--------------------------------------------------------
//если найден, возвращает номер бара, если нет, возвращает -1 

int isFractalUp()
{
for(int i=0; i != 10; i++)
{
if(iFractals(NULL, 0, MODE_UPPER, i)!= NULL) return(i);
}
return(-1);
}
//----------------------------------------------------------
int isFractalDn()
{
for(int i=0; i != 10; i++)
{
if(iFractals(NULL, 0, MODE_LOWER, i)!= NULL) return(i);
}
return(-1);
}

А второй фрактал можно попробовать найти, используя

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru/                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 10.06.2008                                                     |
//|  Описание : Возвращает количество баров между двумя последними фракталами. |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//+----------------------------------------------------------------------------+
int BarsBetweenLastFractals(string sy="", int tf=0) {
  double fu=0, fd=0;
  int    i, nu=0, nd=0;

  if (sy=="" || sy=="0") sy=Symbol();
  for (i=2; i<100; i++) {
    fu=iFractals(sy, tf, MODE_UPPER, i);
    if (fu!=0) {
      if (nu==0) nu=i;
    }
    fd=iFractals(sy, tf, MODE_LOWER, i);
    if (fd!=0) {
      if (nd==0) nd=i;
    }
    if (nu>0 && nd>0) return(MathAbs(nu-nd));
  }
  Print("BarsBetweenLastFractals(): Фракталы не найдены");
  return(-1);
}
 
leonid553 >>:

---

И вот тебе функции - для определения (нижний или верхний)

А второй фрактал можно попробовать найти, используя

Привет, Леонид! Спасиб за помошь!!! Но пока я не вижу подходящего варианта. Первая функция определяет номер бара фрактала, какого я задам в ней, но для неё нет разницы верхний он или нижний. А мне надо к примеру два нижних. В идеальном случае между ними есть один верхний. То есть можно задать 1 и 3, но не всегда это так. Бывают варианты два нижних, а между ними нет верхнего или два нижних, а между ними два верних. Здесь уже не прокатит этот вариант ;-(  Вторая функция в принципе ни чем не отличается от того алгоритма, что я выставил. По поводу третьей, честно говоря я не понял, как там можно вторую пару фракталов найти...

Всё равно спасиб и на этом!!! С уважением, Dimi.

 
В том алгоритме, что я выложил UpFractal - это максимальная цена верхнего фрактала, а DownFractal минимальная цена нижнего. Как я понимаю нужно как-то узнать чему равна " i "... Может как-то надо её в буфер вынести, если найден фрактал. Но как это сделать фиг его знает....
 

Всего один вопрос

Вот скажем берем фрактал на Дейли...Как найти цену при появлении которой заканчивается образование этого фрактала скажем на Н1 ….Желательно чтобы на цене появлялась стрелка ...

 
azfaraon:

Всего один вопрос

Вот скажем берем фрактал на Дейли...Как найти цену при появлении которой заканчивается образование этого фрактала скажем на Н1 ….Желательно чтобы на цене появлялась стрелка ...


https://forum.mql4.com/ru/38549/page7
 
//+------------------------------------------------------------------+
//| функция определения фракталов                                    |
//+------------------------------------------------------------------+  
double Fractal(int mode, int i) 
  {
//----
  bool fr=true;
  int a,b,count;
  double res;
  
  switch(mode)
    {
    
    case 1 : //поиск верхних фракталов
//справа от фрактала должно быть 2 бара с более низкими максимумами
//слева от фрактала пожет быть группа баров, которую завершат 2 бара с более низкими максимумами 
//максимум любого бара из группы не должен превысить максимум фрактального бара    
      {
      for(b=i-1;b>i-3;b--) 
        {
        if(High[i]<=High[b]) {fr=false; break;}
        }
      a=i+1; 
      while(count<2)
        {
        if(High[i]<High[a]) {fr=false; break;}
        else
          {
          if(High[i]>High[a]) count++;
          else count=0;
          }
        a++;
        }
      if(fr==true) res=High[i];
      break;
      }
      
    case 2 : //поиск нижних фракталов
//справа от фрактала должно быть 2 бара с более высокими минимумами
//слева от фрактала может быть группа баров, которую завершат 2 бара с более высокими минимумами 
//минимум любого бара из группы не должен быть ниже минимума фрактального бара 
      {
      for(b=i-1;b>i-3;b--) 
        {
        if(Low[i]>=Low[b]) {fr=false; break;}
        }
      a=i+1; 
      while(count<2)
        {
        if(Low[i]>Low[a]) {fr=false; break;}
        else
          {
          if(Low[i]<Low[a]) count++;
          else count=0;
          }
        a++;
        }
      if(fr==true) res=Low[i];
      }
    }
//----
  return(res);  
  } 
Стандартный индюк фракталов подглючивает на минутках (так как там чаще "плохие" ситуации), а этот нет.
 

Отдельная нумерация для верхних и нижних фракталов.

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 08.02.2009                                                     |
//|  Описание : Возвращает фрактал по его номеру.                              |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента        ("" или NULL - текущий символ)     |
//|    tf - таймфрейм                       (    0       - текущий ТФ)         |
//|    nf - номер фрактала                  (    0       - последний)          |
//+----------------------------------------------------------------------------+
double GetFractal(string sy="0", int tf=0, int nf=0, int mode=MODE_UPPER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int    i, k=iBars(sy, tf), kf;
  for (i=3; i<k; i++) {
    if(mode==MODE_LOWER){
    f=iFractals(sy, tf, MODE_LOWER, i);
    if (f!=0) {
      kf++;
      if (kf>nf) return(iLow(sy,tf,i));
     } 
    }
    if(mode==MODE_UPPER){
    f=iFractals(sy, tf, MODE_UPPER, i);
    if (f!=0) {
      kf++;
      if (kf>nf) return(iHigh(sy,tf,i));
      }
    }
  }
  Print("GetFractalBar(): Фрактал не найден");
  return(-1);
}
 
Извините,а как можно найдя верхний или нижний фрактал вывести на экран(желательно в формате double) полученное значение? и передать это все в советник(оптимально коммандой comment).Заранее спасибо тем кто поможет.
 
Вот кстати, интересная тема. Все сразу ударились в индикацию, а позвольте поинтересоваться - зачем оно вам надо? Я просто в этой области прорабатываю одну методику. Может смогу чем помочь, а может и вы мне что-то подскажете.
 
locol91:
... и вы мне что-то подскажете.

А что подсказать надо?
Причина обращения: