[АРХИВ] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 3. - страница 170

 
splxgf:
Ваш вариант можно свести к этим двум строчкам добавленным в авторский вариант, и с некоторыми переделками условий в принципе вполне должно ускорить.
Уверены??
 
MaxZ:
Уверены??

По сути ваше предложение исключить из проверок и расчетов свечи которые не попадают в диапазон UPPprice/LOWprice... это исключается двумя строчками. Если выкидывания из цикла не произошло, значит цена в нужном нам диапазоне и делаем стандартные проверки. Ваш код может быстрее работать только в ущерб результатам поскольку логика работы с INS сильно перемудрена использовать значение этой переменной с предыдущей итерации это бред.

 
splxgf:

По сути ваше предложение исключить из проверок и расчетов свечи которые не попадают в диапазон UPPprice/LOWprice... это исключается двумя строчками. Если выкидывания из цикла не произошло, значит цена в нужном нам диапазоне и делаем стандартные проверки. Ваш код может быстрее работать только в ущерб результатам поскольку логика работы с INS сильно перемудрена использовать значение этой переменной с предыдущей итерации это бред.

Значит уверены! :))))


Вы ранее приводили код:

splxgf:
        if (LOWprice > iHigh(NULL,60,i)) continue;
        if (UPPprice < iLow (NULL,60,i)) continue;

Если цена находится ниже Low, то зачем Нам проверять находится ли цена Выше High? В Вашем варианте это условие не исключается. В предложенном же Мной варианте:

         if (UPP)
            ... // не выполнится
         if (LOW)
            if (LOWprice < iLow (NULL,60,i))
               continue;
            else
            ..

исключается.

Я не отрицаю того, что Мой код может быть и не самый оптимальный.

Но как думаете, во сколько раз быстрее:

         if (UPP)

сработает, чем

         if (LOWprice > iHigh(NULL,60,i))

?

Ведь по сути:

UPP = LOWprice > iHigh(NULL, 60, i);

Только Я это заведомо знаю (за исключением тех случаев, когда bid внутри текущего исторического бара), а Вы это рассчитываете...

 
abolk:


да уж.

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

если у вас возникла идея разделения проверки iLow, iHigh, то можно было сразу разделить:

и ничего не мудрить

И Вы не думали, что извращённый громоздкий код может иногда работать быстрее простых трёх строчек? :)))
 
 INS = True;
   
   for (int i=1; i<=6000; i++)
   {
      if (INS)
      {
         if (LOWprice > iHigh(NULL,60,i))
         {
            INS = False;
            UPP = True;
            LOW = False;
            continue;

Рассмотрим этот участок кода

INS=True;

Цикл поехал

if (INS) полет нормальный

if (LOWprice...) к примеру условие выполнятеся, но тут получается опа поскольку мы получаем INS=False и перекидываемся на следующую итерацию

затем if (false) и приплыли, поскольку это уже другой бар, спрашивается какого...

Что касается моего кода, то я проверяю не цену, входимость бара в коридор +300/-300 пипсов от текущей цены, если входит, значит его надо считать. Все остальные оптимизации уже не столь критичны, поскольку первые две проверки отсеивают к примеру 90% ненужных баров.

 
splxgf:

затем if (false) и приплыли, поскольку это уже другой бар, спрашивается какого...

Не приплыли, а поплыли дальше по else { ... }.
 

а дальше действительно поплыли...

Вот с чего взято что булевые переменные дадут ускорение если после каждого условия идет еще одно вида if (LOWprice > iHigh(NULL,60,i)), т.е. те же яйца только сбоку плюс одно условие и куча присваиваний...

 

Опа!

Здесь споры разгорелись не нашутку.

Сделал пока так:

 extern int Distance = 3000;
 int CountH,NewCountH,CountL,NewCountL,CountB,NewCountB;
 
 double ResistH,ResistL,ResistB;
 
//======================================================================
int start(){


   double bid = Bid;
   double UPPprice = bid+Distance*Point;
   double LOWprice = bid-Distance*Point;
      NewCountH=0;
      NewCountL=0;
      NewCountB=0;
      ResistH=0;
      ResistL=0;
      ResistB=0;
  
   while(LOWprice<UPPprice)
    {
      CountH=0;
      CountL=0;
      for(int i=1; i<=6000; i++){  
          if(iHigh(NULL,60,i)>LOWprice) 
          if(LOWprice>iLow(NULL,60,i)) 
          if(LOWprice> bid) CountH++; else CountL++;
       }  
      if(CountH>NewCountH){NewCountH=CountH;ResistH=LOWprice;} 
      if(CountL>NewCountL){NewCountL=CountL;ResistL=LOWprice;}   
      LOWprice=LOWprice+25*Point;
    }
      CountB=0;
      for(i=1; i<=6000; i++){  
          if(iHigh(NULL,60,i)>=bid) if(bid>=iLow(NULL,60,i)) CountB++;
       }
      if(CountB>NewCountB){NewCountB=CountB;ResistB=bid;}  
 
     
   
    Comment("\n", 
      "\n",     
//      "\n", "     Spread                                ", MarketInfo(Symbol(), MODE_SPREAD),  
      "\n", "     Distance                             ", Distance, 
      "\n", "     CountH                               ", NewCountH, 
      "\n", "     CountB                               ", NewCountB, 
      "\n", "     CountL                                ", NewCountL, 
      "\n", "-------------------------------------------------- ",     
      "\n");
      

    if(ObjectFind("RH") == -1) {
      ObjectCreate("RH", OBJ_HLINE, 0, 0, ResistH);
      ObjectSet("RH", OBJPROP_COLOR, Magenta);
      ObjectSet("RH", OBJPROP_STYLE, STYLE_DOT);
     }else ObjectMove("RH", 0, iTime(NULL,0,0), ResistH);

    string text=DoubleToStr(NewCountH,0);
    ObjectDelete("RHtxt"); 
     if(ObjectFind("RHtxt") == -1) {
       ObjectCreate("RHtxt", OBJ_TEXT, 0, 0, 0);
       ObjectSetText("RHtxt", text , 8, "Arial", Aqua);
       ObjectMove("RHtxt", 0, iTime(NULL,0,0), ResistH);
      }else ObjectMove("RHtxt", 0, iTime(NULL,0,0), ResistH);
      
    string text3=DoubleToStr(NewCountB,0);
    ObjectDelete("RBtxt"); 
     if(ObjectFind("RBtxt") == -1) {
       ObjectCreate("RBtxt", OBJ_TEXT, 0, 0, 0);
       ObjectSetText("RBtxt", text3 , 8, "Arial", Aqua);
       ObjectMove("RBtxt", 0, iTime(NULL,60,0), ResistB);
      }else ObjectMove("RBtxt", 0, iTime(NULL,60,0), ResistB);

    if(ObjectFind("RL") == -1) {
      ObjectCreate("RL", OBJ_HLINE, 0, 0, ResistL);
      ObjectSet("RL", OBJPROP_COLOR, Magenta);
      ObjectSet("RL", OBJPROP_STYLE, STYLE_DOT);
     }else ObjectMove("RL", 0, iTime(NULL,0,0), ResistL);
     
    string text2=DoubleToStr(NewCountL,0);
    ObjectDelete("RLtxt");
    if(ObjectFind("RLtxt") == -1) {
      ObjectCreate("RLtxt", OBJ_TEXT, 0, 0, 0);
      ObjectSetText("RLtxt", text2 , 8, "Arial", Aqua);
      ObjectMove("RLtxt", 0, iTime(NULL,0,0), ResistL);
     }else ObjectMove("RLtxt", 0, iTime(NULL,0,0), ResistL);

 return (0);}            //====== THE END ======================

Очень интересно понаблюдать за движением цены. Всегда идет в сторону наименьшего сопротивления.

Можно даже предсказать ее будущее движение. Понаблюдайте.

Цена, как вода, течет по руслу.

Спасибо всем!

 

Подскажите, пожалуйста, как найти номер бара у которого самое большое значение хая.


Search_High=MathMax( High[i],High[1])

 
001:

Подскажите, пожалуйста, как найти номер бара у которого самое большое значение хая.


Search_High=MathMax( High[i],High[1])

Можно пройтись https://docs.mql4.com/ru/array/ArrayMaximum

по массиву High.

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