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

 
Youri Lazurenko:

Не могу решить казалось бы простую задачу.  Где-то на графике было пересечение МА. Находим бар после пересечения. Как посчитать количество баров от этого бара до текущего?

Номер того самого бара. Нет?
 
Youri Lazurenko:

Не могу решить казалось бы простую задачу.  Где-то на графике было пересечение МА. Находим бар после пересечения. Как посчитать количество баров от этого бара до текущего?


Кажется получилось (по крайней мере комментарий на экран выводит правильный). Благодаря "количество баров", кажется нашел решение. Для определения datetime нужного бара использовал функцию iTime. Набросок выглядит так:

void OnTick()

{

   int nBarsUp, nBarsDn;

   datetime date_dn = iTime(NULL, 0, IntersectionDN());

   datetime date_up = iTime(NULL, 0, IntersectionUp());

   datetime date_1  = iTime(NULL, 0, 1);

   

   nBarsUp = Bars(Symbol(), 0, date_up, date_1);

   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 

   

   Comment("Количество длинных баров: " + nBarsUp + "\n"+

           "Количество коротких баров: " + nBarsDn);     

}

//+------------------------------------------------------------------+

int IntersectionDN()

{

   for(int i = 0; i < 36; i++)

   {

      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)

         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

         return(i-1);

   }  

   return(-1);

}

int IntersectionUp()

{

   for(int i = 0; i < 36; i++)

   {

      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)

         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))

         return(i-1);

   } 

   return(-1);  

}

 
Youri Lazurenko:

Кажется получилось (по крайней мере комментарий на экран выводит правильный). Благодаря "количество баров", кажется нашел решение. Для определения datetime нужного бара использовал функцию iTime. Набросок выглядит так:

void OnTick()

{
   int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
   
   Comment("Количество длинных баров: " + nBarsUp + "\n"+
           "Количество коротких баров: " + nBarsDn);     
}

//+------------------------------------------------------------------+

int IntersectionDN()

{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   }  
   return(-1);
}

int IntersectionUp()
{
   for(int i = 0; i < 36; i++)
   {
      if(iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i) < iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i)
         && iMA(Symbol(), 0, 5, 0, MODE_EMA, PRICE_CLOSE, i-1) > iMA(Symbol(), 0, 21, 0, MODE_EMA, PRICE_CLOSE, i-1))
         return(i-1);
   } 
   return(-1);  

}

Вы же ищете в цикле пересечение. Причём от нулевого бара вглубь истории. Так вам ф-ция IntersectionXX() возвращает номер бара.

Зачем всё это?

int nBarsUp, nBarsDn;
   datetime date_dn = iTime(NULL, 0, IntersectionDN());
   datetime date_up = iTime(NULL, 0, IntersectionUp());
   datetime date_1  = iTime(NULL, 0, 1);
  
   nBarsUp = Bars(Symbol(), 0, date_up, date_1);
   nBarsDn = Bars(Symbol(), 0, date_dn, date_1); 
 
Artyom Trishkin:

Вы же ищете в цикле пересечение. Причём от нулевого бара вглубь истории. Так вам ф-ция IntersectionXX() возвращает номер бара.

Зачем всё это?


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

P.S. Как в текст вставить код на языке MQL4 (как у вас, а не так как я)?
 

Никто не подскажет как бороться с такой проблемой?


после смены ТФ панель коробит

 
Youri Lazurenko:

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

P.S. Как в текст вставить код на языке MQL4 (как у вас, а не так как я)?
Если это десятый бар, то как узнать разницу между десятым и нулевым? 10-0=10
И зачем нужно вычитать?

 

Здравствуйте! Неправильно сравниваются два минусовых числа q и w, когда они равны, оператор иф считает, что одно больше другого.В чем ошибка?   Когда q = -0,0002 и w тоже -0,0002, то res12=false, почему? 

 

Здравствуйте! Неправильно сравниваются два минусовых числа q и w, когда они равны, оператор иф считает, что одно больше другого.В чем ошибка?   Когда q = -0,0002 и w тоже -0,0002, то res12=false, почему? 

static bool res12=true;

start()
{   

double SPREAD=MarketInfo(Symb,MODE_SPREAD);// Спред

   double q=High[0]-3.0*Point-High[1];
   double w=-SPREAD*Point;
      
   if (New_Bar==true&&ticket1<=0)
     {
      if(q>w)
       {
        res12=false; 
        Alert("res12=false");
        Alert (q);
        Alert (w);
       }
     }
      if (New_Bar==true&&ticket1<=0)
     {
        if(q<=w)
        {
         res12=true;
         Alert("res12=true");
         Alert (q);
         Alert (w);
        }
      }





}
 
Jenya77769:

Здравствуйте! Неправильно сравниваются два минусовых числа q и w, когда они равны, оператор иф считает, что одно больше другого.В чем ошибка?   Когда q = -0,0002 и w тоже -0,0002, то res12=false, почему? 


мне кажется, надо нормализовать и все, вроде как double между собой без нормализации сравнить нельзя.

if NormalizeDouble (q<=w)
 
Vyacheslav Kornev:

мне кажется, надо нормализовать и все, вроде как double между собой без нормализации сравнить нельзя.


спасибо, получилось, только я нормализировал отдельно q и w!

if(NormalizeDouble(q,4)> NormalizeDouble(q,4))
Причина обращения: