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

 

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

//+-------------------------------------------------------------+
//| Пункт №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:
... и вы мне что-то подскажете.

А что подсказать надо?