Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 2262

 
Tretyakov Rostyslav #:

А как работает эта функция?

Извиняюсь, забыл прикрепить, пока разбирался как вставить код. 

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает ближайший верхний фрактал                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL - текущий символ)                 |
//|    tf - таймфрейм                  ( 0 - текущий таймфрейм)                |
//|    nl - количество баров слева                                             |
//|    nr - количество баров справа                                            |
//+----------------------------------------------------------------------------+
double GetNearestUpFractal(string sy="0", int tf=0, int nl=2, int nr=2) {
  bool f;
  int  fb, i, nb=-1;

  if (sy=="" || sy=="0") sy=Symbol();
  if (nl<1) nl=1;
  if (nr<1) nr=1;

  fb=nr;
  while (nb<0) {
    fb++;
    f=True;
    for (i=fb; i>fb-nr; i--) {
      if (iHigh(sy, tf, i)<iHigh(sy, tf, i-1)) { f=False; break; }
    }
    if (f) {
      for (i=fb; i<fb+nl; i++) {
        if (iHigh(sy, tf, i)<iHigh(sy, tf, i+1)) { f=False; break; }
      }
      if (f) { nb=fb; break; }
    }
  }

  return(iHigh(sy, tf, nb));
}

Но, эту функцию можно заменить на стандартный код расчета фрактала 

double val=iFractals(NULL,0,MODE_UPPER,3);

 И цикл наверное на for заменить.  
 
Vyacheslav.K #:

Извиняюсь, забыл прикрепить


Эта функция работает в режиме реального времени и видит только последний фрактал

Ваш перебор в 100 баров ничего не дает

PS Сделайте цикл for и используйте

double val=iFractals(NULL,0,MODE_UPPER,i+3);
 
Tretyakov Rostyslav #:

Эта функция работает в режиме реального времени и видит только последний фрактал

Ваш перебор в 100 баров ничего не дает

PS Сделайте цикл for и используйте

Да, я это в процессе обращения увидел и понял, но боюсь у меня и здесь будет косяк. Я сейчас постараюсь написать часть кода и выложу, а вы если вам будет не трудно, подскажите правильно ли я написал.

С уважением, Вячеслав.

 

Вот подправил.

   int    i=0;
   double lastupfr=0;
   double lastdnfr=0;

   for (i=0; i<100; i++)
   {
      double upfr=iFractals(NULL,0,MODE_UPPER,i+2);
      if(upfr!=0)
      {
         if(upfr>lastupfr) lastupfr=upfr;
         i++;
      }
   }
   Print("Biggest UpFractal = ",lastupfr);   

   for (i=0; i<100; i++)
   {
      double dnfr=iFractals(NULL,0,MODE_LOWER,i+2);
      if(dnfr!=0)
      {
         if(dnfr>lastdnfr) lastdnfr=dnfr;
         i++;
      }
   }
   Print("Biggest DnFractal = ",lastdnfr);
 
Vyacheslav.K #:

Вот подправил.

Это не надо

         i++;
 
Tretyakov Rostyslav #:

Это не надо

Понял, спасибо, буду тестировать. 

 
Tretyakov Rostyslav #:

Эта функция работает в режиме реального времени и видит только последний фрактал

Ваш перебор в 100 баров ничего не дает

PS Сделайте цикл for и используйте

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

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает ближайший верхний фрактал                           |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (NULL - текущий символ)                 |
//|    tf - таймфрейм                  ( 0 - текущий таймфрейм)                |
//|    nl - количество баров слева                                             |
//|    nr - количество баров справа                                            |
//+----------------------------------------------------------------------------+
double GetNearestUpFractal(string sy="0", int tf=0, int nl=2, int nr=2) {
  bool f;
  int  fb, i, nb=-1;

  if (sy=="" || sy=="0") sy=Symbol();
  if (nl<1) nl=1;
  if (nr<1) nr=1;

  fb=nr;
  while (nb<0) {
    fb++;
    f=True;
    for (i=fb; i>fb-nr; i--) {
      if (iHigh(sy, tf, i)<iHigh(sy, tf, i-1)) { f=False; break; }
    }
    if (f) {
      for (i=fb; i<fb+nl; i++) {
        if (iHigh(sy, tf, i)<iHigh(sy, tf, i+1)) { f=False; break; }
      }
      if (f) { nb=fb; break; }
    }
  }

  return(iHigh(sy, tf, nb));
}

//+----------------------------------------------------------------------------+
//|  Автор    : Ким Игорь В. aka KimIV,  http://www.kimiv.ru                   |
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Возвращает ближайший нижний фрактал                            |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   ("" или NULL - текущий символ)          |
//|    tf - таймфрейм                  (    0       - текущий таймфрейм)       |
//|    nl - количество баров слева                                             |
//|    nr - количество баров справа                                            |
//+----------------------------------------------------------------------------+
double GetNearestDownFractal(string sy="0", int tf=0, int nl=2, int nr=2) {
  bool f;
  int  fb, i, nb=-1;

  if (sy=="" || sy=="0") sy=Symbol();
  if (nl<1) nl=1;
  if (nr<1) nr=1;

  fb=nr;
  while (nb<0) {
    fb++;
    f=True;
    for (i=fb; i>fb-nr; i--) {
      if (iLow(sy, tf, i)>iLow(sy, tf, i-1)) { f=False; break; }
    }
    if (f) {
      for (i=fb; i<fb+nl; i++) {
        if (iLow(sy, tf, i)>iLow(sy, tf, i+1)) { f=False; break; }
      }
      if (f) { nb=fb; break; }
    }
  }

  return(iLow(sy, tf, nb));
}

С уважением, Вячеслав.

 
Или вот из такой функции...
//+----------------------------------------------------------------------------+
//|  Версия   : 07.10.2006                                                     |
//|  Описание : Поиск ближайшего фрактала.                                     |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy   - наименование инструмента      ("" или NULL - текущий символ)     |
//|    tf   - таймфрейм                     (    0       - текущий ТФ)         |
//|    mode - тип фрактала                  (MODE_LOWER|MODE_UPPER)            |
//+----------------------------------------------------------------------------+
double FindNearFractal(string sy="0", int tf=0, int mode=MODE_LOWER) {
  if (sy=="" || sy=="0") sy=Symbol();
  double f=0;
  int    d=MarketInfo(sy, MODE_DIGITS), s;
  if (d==0) if (StringFind(sy, "JPY")<0) d=4; else d=2;

  for (s=2; s<100; s++) {
    f=iFractals(sy, tf, mode, s);
    if (f!=0) return(NormalizeDouble(f, d));
  }
  Print("FindNearFractal(): Фрактал не найден");
  return(0);
}
Из какой будет проще...
 
Vyacheslav.K #:
но пока улучшений не вижу.
Какие улучшения Вы хотите увидеть?
 
Tretyakov Rostyslav #:
Какие улучшения Вы хотите увидеть?

При формировании фракталов (макс и мин) и при пробитие их ценой открывается позиция. Например, из 10 последних нижних фракталов определяется самый минимальный и при пробитии его ценой Аск открывается ордер на покупку. Но вот из 10 нижних фракталов ордер может открываться не на самом нижнем. Вот примерно так. Поэтому я и попросил вас переделать любую из представленных функций для определения максимального и минимального фрактала, поскольку нужна цена этих фракталов. Я перерыл весь интернет и не могу найти такой функции, которая бы определяла макс/мин фрактал за заданное количество баров. У И.Кима есть функции, которые определяют макс/мин,  но для зигзагов. Вот как то так.

Причина обращения: