Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Узнай самые обсуждаемые темы на форуме. Заходи в раздел Стена!
Dimi715
58
Dimi715 2008.11.16 14:45 

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

//+-------------------------------------------------------------+
//| Пункт №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.

Leonid Borsky
2382
Leonid Borsky 2008.11.16 15:08  

---

//+----------------------------------------------------------------------------+
//| Автор : Ким Игорь В. 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);
}
Dimi715
58
Dimi715 2008.11.16 20:30  
leonid553 >>:

---

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

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

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

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

Dimi715
58
Dimi715 2008.11.16 20:52  
В том алгоритме, что я выложил UpFractal - это максимальная цена верхнего фрактала, а DownFractal минимальная цена нижнего. Как я понимаю нужно как-то узнать чему равна " i "... Может как-то надо её в буфер вынести, если найден фрактал. Но как это сделать фиг его знает....
Movlat Baghiyev
4387
Movlat Baghiyev 2012.04.13 11:28  

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

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

Алексей Тарабанов
7222
Алексей Тарабанов 2012.04.13 11:39  
azfaraon:

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

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


https://forum.mql4.com/ru/38549/page7
George
505
George 2012.04.13 11:41  
//+------------------------------------------------------------------+
//| функция определения фракталов                                    |
//+------------------------------------------------------------------+  
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);  
  } 
Стандартный индюк фракталов подглючивает на минутках (так как там чаще "плохие" ситуации), а этот нет.
khorosh
8099
khorosh 2012.04.13 13:15  

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

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. 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);
}
Евгений
47
Евгений 2013.04.28 08:07  
Извините,а как можно найдя верхний или нижний фрактал вывести на экран(желательно в формате double) полученное значение? и передать это все в советник(оптимально коммандой comment).Заранее спасибо тем кто поможет.
locol91
270
locol91 2013.04.28 21:49  
Вот кстати, интересная тема. Все сразу ударились в индикацию, а позвольте поинтересоваться - зачем оно вам надо? Я просто в этой области прорабатываю одну методику. Может смогу чем помочь, а может и вы мне что-то подскажете.
Victor Nikolaev
Модератор
14207
Victor Nikolaev 2013.04.29 07:15  
locol91:
... и вы мне что-то подскажете.

А что подсказать надо?
/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий