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

 
Alexey Viktorov:

1. Я говорил проверить, а не заменить. iFractals возвращает 0 если нет фрактала. Я этим регулярно не пользуюсь и естественно не забиваю не высохшие остатки памяти такими мелочами.

2. Функция, хоть и написана ужасно, но всё-же работает исправно.

3. В Comment отображается последнее значение. Замените на

и посмотрите сколько раз будет напечатано

Много, но ни разу false. Как будто условие всегда выполнено. Но должно быть false.

 
Ghabo:

Много, но ни разу false. Как будто условие всегда выполнено. Но должно быть false, на скрине, ситуация противоречит условию, но true.


На скрине отмечены первый фрактал и второй. Но по условию функция ищет дальше, пока не найдёт тот который ниже первого. А четвёртый фрактал ниже первого... Что и написано в условии.

Если условие дополнить

      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1)
         return(true);
          else break;
        }

То будет печатать и false.

 
Alexey Viktorov:

На скрине отмечены первый фрактал и второй. Но по условию функция ищет дальше, пока не найдёт тот который ниже первого. А четвёртый фрактал ниже первого... Что и написано в условии.

Если условие дополнить

То будет печатать и false.

Перевернул условие
 if(fr2>fr1) return(true);
        else break;

Печатает false, но условие выполнено.

aqa1

 

Второй цикл всегда возвращает цену фрактала найденного в первом цикле.

   for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        return(NormalizeDouble(fr2, d));
        //if(fr2>fr1) return(true);
        //else break;
        }
     }
 
Ghabo:

Второй цикл всегда возвращает цену фрактала найденного в первом цикле.

У вас, по-моему, с логикой беда.

Попробуйте себе простыми словами описать порядок поиска. Подумайте - всё ли верно вы написали. И уже потом делайте функцию поиска, которая будет возвращать цену найденного по его порядковому номеру фрактала. Как сделаете её, и она будет вам возвращать верную цену заданного по порядковому номеру фрактала, так начинайте делать логику поиска цены следующего по счёту фрактала (функция, возвращающая его цену на тот момент у вас уже будет). И потом останется лишь сравнить эти цены.

А вы всё в кучу городите сразу.

 

Может быть я неправильно понимаю как это работает?

Сначала нахожу фрактал, первый попавшийся выше МА - (на скрине помечен №1),

int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=EMPTY_VALUE) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }

от него ищу, дальше, в историю, первый попавшийся - фрактал (на скрине помечен  №2). Если фрактал №2 больше фрактал№1 возвращаю true.

      for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        if(fr2>fr1) return(true);
        else break;
        }
     }

Всё ли верно?

aq11

 
Artyom Trishkin:

будет возвращать цену найденного по его порядковому номеру фрактала.

Не по номеру, ищу по условию что фрактал выше  МА, порядковый номер может быть любым.  Цена этого фрактала в  первом цикле пишется в переменную "fr1" верно.

Проблема во втором цикле, если конечно правильно понимаю. Почему не находит цену фрактала №2, непонятно

 
Ghabo:

Не по номеру, ищу по условию что фрактал выше  МА, порядковый номер может быть любым.  Цена этого фрактала в  первом цикле пишется в переменную "fr1" верно.

Проблема во втором цикле, если конечно правильно понимаю. Почему не находит цену фрактала №2, непонятно

Всю логику приходится вам пересказывать. Хоть что-то можно самостоятельно обдумать?

1. В первом цикле находим фрактал выше МА. Номер бара пишем в переменную num_bar (на скрине бар №11)

2. Во втором цикле начинаем искать второй фрактал удовлетворяющий условию. Начинаем искать с бара num_bar... то-есть с бара №11 потому, что nf равно нулю.

3. Фрактал найден. Значение равно предыдущему. Условие не будет выполнено, ведь в условии то > то < но не равно. А если поставить == то будет та-же белиберда только с другой стороны.

Видимо надо искать второй фрактал со следующего бара num_bar+1 или даже +2.

 
Alexey Viktorov:

Всю логику приходится вам пересказывать. Хоть что-то можно самостоятельно обдумать?

1. В первом цикле находим фрактал выше МА. Номер бара пишем в переменную num_bar (на скрине бар №11)

2. Во втором цикле начинаем искать второй фрактал удовлетворяющий условию. Начинаем искать с бара num_bar... то-есть с бара №11 потому, что nf равно нулю.

3. Фрактал найден. Значение равно предыдущему. Условие не будет выполнено, ведь в условии то > то < но не равно. А если поставить == то будет та-же белиберда только с другой стороны.

Видимо надо искать второй фрактал со следующего бара num_bar+1 или даже +2.

В общем то действия в первых двух пунктах, я так и озвучил)

За "num_bar+1" спасибо. 

Минимум не получается найти.

Условие не выполнено, стрелка ставится, выполнено не ставится.

Условие такое, если между пересечениями цены и МА расстояние от минимума свечи пересекшей МА, до минимума iLowest больше или равно 100, ставлю стрелку.

   if(limit>60)limit=60;
   for(int i=limit; i>0; i--)
     {
      M11=iMA(NULL,0,period,shift_,method,price,i+1);
      if(open[i+1]>M11 && close[i+1]<M11){time_1=time[i+1];}

      indexS1=iBarShift(NULL,PERIOD_CURRENT,time_1,false);

      if(open[i+1]<M11 && close[i+1]>M11){time_2=time[i+1];}

      indexS2=iBarShift(NULL,PERIOD_CURRENT,time_2,false);

      //
      double val=0;
      //--- расчет минимального значения цены на indexS1 последовательных барах 
      //--- с индекса indexS2 по индекс indexS1 включительно на текущем графике 
      int val_index=iLowest(NULL,0,MODE_LOW,indexS1,i+indexS2);
      if(val_index!=-1) val=Low[val_index];
      else PrintFormat("Ошибка вызова iLowest. Код ошибки=%d",GetLastError());

      if(low[indexS1]-val>=100*Point)
        {
        BufferPointDn1[i]=high[i];
        }
      //
     }

От В до А нахожу минимум С.

А-С=100 pips в точке В, должен поставить стрелку.

Почему не ставит?

low1

 
Ghabo:

В общем то действия в первых двух пунктах, я так и озвучил)

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

Ghabo:

Минимум не получается найти.

Условие не выполнено, стрелка ставится, выполнено не ставится.

Условие такое, если между пересечениями цены и МА расстояние от минимума свечи пересекшей МА, до минимума iLowest больше или равно 100, ставлю стрелку.

От В до А нахожу минимум С.

А-С=100 pips в точке В, должен поставить стрелку.

Почему не ставит?

В этом коде что-то тоже логику трудно уловить.

Как минимум надо знать где и как объявлены переменные indexS1 и indexS2 не обнуляются-ли они на каждом тике.

А что произойдёт если пересечение МА попадёт в гэп?


И ещё один вопрос: Вы умеете пользоваться отладчиком?

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