Скачать MetaTrader 5

Как сравнить одно значение со всеми элементами массива?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Размести программу в Маркете - это 7 миллионов потенциальных клиентов
Evgeniy Zhdan
5541
Evgeniy Zhdan 2014.01.12 08:11 
Надо сравнить значение N с ценами ХАЙ, допустим 15 предыдущих свечей. И при N больше ВСЕХ ХАЙов вывести алерт.

Делаю вот так:

for ( i = 1; i <=AmountCandle; i++)  // AmountCandle и есть значение N - количество баров у которых берем ХАЙ
    {
     if (diapazon1candle > raznitca[i]) //diapazon1candle  - хай 1 свечи, который сравниваем с предыдущими.  raznitca[i] - в этом массиве  содержатся ХАЙ цены N баров
          {
      Print ( "Есть подтверждение");
       }
    }

Но на деле получается, что НА КАЖДОМ баре в массиве где выполняется это условие выполняется Принт. А надо - чтобы он выполнялся только если выполняется условие на ВСЕХ барах, а не по отдельности.

Допустим, AmountCandle = 15, надо чтобы Принт срабатывал когда diapazon1candle был больше ВСЕХ 15 баров.

Вот как это реализовать? У же голова кипит. Как только не пробовал...

Нужно именно это сравнение. ArrayMaximum и ArrayMinimum не предлагать, мне не подходит. Надо именно как сравнить со всеми элементами в массиве ВМЕСТЕ

o_o
Модератор
23701
o_o 2014.01.12 08:26  
remon:
Надо сравнить значение N с ценами ХАЙ, допустим 15 предыдущих свечей. И при N больше ВСЕХ ХАЙов вывести алерт.


bool b=true;
for (i=0; i<AmountCandle; i++) if (diapazon1candle <= raznitca[i]) { b=false; break; }
if (b) Print ( "Есть подтверждение");
Evgeniy Zhdan
5541
Evgeniy Zhdan 2014.01.12 08:32  
sergeev:


Искреннее Спасибо. Работает.
Evgeniy Zhdan
5541
Evgeniy Zhdan 2014.01.12 08:50  

А если быть точнее - не работает как надо.

Например, AmountCandle = 15.

Он находит, что, допустим 3 бара, соответствует условиям, и делает Принт. А следующие 12 баров сбрасывает. Но надо, чтобы он проверил эти ВСЕ бары и только потом давал Принт!

o_o
Модератор
23701
o_o 2014.01.12 09:28  
remon:

Он находит, что, допустим 3 бара, соответствует условиям, и делает Принт. А следующие 12 баров сбрасывает. Но надо, чтобы он проверил эти ВСЕ бары и только потом давал Принт!

приведенный мой код так не работает.

он обрывает проверку если встречает неподходящее условие. и ставит флаг = false.

инчае проверяет все до конца и при b=true выдает вам принт.

Evgeniy Zhdan
5541
Evgeniy Zhdan 2014.01.12 09:37  
sergeev:

приведенный мой код так не работает.

он обрывает проверку если встречает неподходящее условие. и ставит флаг = false.

инчае проверяет все до конца и при b=true выдает вам принт.


Именно так он и делает - не обрывает проверку. Проверьте пожалуйста у себя.

extern string A1           = "Поглощение";
extern int    TF1          = 60; // текущий ТФ
extern int    TF2          = 240; // h1
extern int    TF3          = 1440;// h4
extern int    TF4          = 10080; // D1
extern int    AmountCandle = 5; // сколько брать предыдущих свечей для сравнения
extern int    PersentA1    = 5; // процент от диапазона свечи
extern bool   SignalAlert  = true;
extern bool   SignalEmail  = false;
extern string InputEmail   = "";

//========объявляем переменные
double alow [200]; // значения ЛОУ свечей в массиве
double ahigh [200]; // Значения ХАЙ свечей в массиве
double raznitca [200]; // Значения хай минус лоу

double low2TF1, low1TF1, high1TF1, high2TF1, diapazon1candle,Close1Candle,
       Open1Candle  ;

int init()
  {
   return(0);
  }
  
int deinit()
  {
   return(0);
  }
  
int start()
  {
      //===2 свеча TF1
      high2TF1  = iHigh  (Symbol(),TF1,2); // цена открытия второй свечи 1 символ
      low2TF1   = iLow   (Symbol(),TF1,2); // цена закрытия второй свечи 1 символ
      //===1 свеча TF1
      high1TF1  = iHigh  (Symbol(),TF1,1); // цена открытия второй свечи 1 символ
      low1TF1   = iLow   (Symbol(),TF1,1); // цена закрытия второй свечи 1 символ
 
      Close1Candle = iClose(Symbol(),TF1,1);
      Open1Candle = iOpen(Symbol(),TF1,1);
      
 //=====Вычисляем диапазон первой свечи для сравнения с массивом
   diapazon1candle  =  high1TF1 - low2TF1;
  // Print ("Диапазон первой свечи - " + diapazon1candle);
   
//=====циклы      
  for (int i = 1; i <=AmountCandle; i++) // задействуем цикл для ЛОУ свечей. AmountCandle - количество свечей для обработки
   {
  double iii = Low[i]; // присваиваем iii значения лоу этих  свечей
  alow [i] = iii; // передаем все значения в массив
   }
  // ====Аналогичный цикл для ХАЙ свечей 
   
  for ( i = 1; i <=AmountCandle; i++) 
  {
  double hh = High[i]; // присваиваем hh значения лоу этих  свечей
  ahigh [i] = hh; // передаем все значения в массив
  }
 //======== вычисление разницы хай минус лоу 
  for ( i = 1; i <=AmountCandle; i++) 
   {
   raznitca[i] = (ahigh [i] - alow [i]); // делаем разницу в пунктах
   }

//************** ВОТ ВАШ КОД
   bool b=true;
   for (i=2; i<=AmountCandle; i++) // тут i = 2 потому что во второй свечи начинаем сравнивать с первой
   {
      if (diapazon1candle <= raznitca[i]) 
    { 
      b=false; 
      break; 
    }
      if (b == true) 
    {
      Print ("Свеча " + i + " Диапазон 1 свечи: " + diapazon1candle*1000 + " разница: "  + raznitca[i]*1000);
     }
   } return(0);
  }


Он по очереди проверяет, нашел 1 условие - пропустил его на принт, не нашел второе - сбросил и так по кругу

o_o
Модератор
23701
o_o 2014.01.12 09:53  

у вас с индексацией все в порядке?

во первых, вся ваша писанина по циклам выглядит в итое так -

//=====циклы      
for (int i = 1; i <=AmountCandle; i++)  raznitca[i] = (High[i] - Low[i]); // делаем разницу в пунктах

а этого текста не понял

// тут i = 2 потому что во второй свечи начинаем сравнивать с первой

где та первая?

Evgeniy Zhdan
5541
Evgeniy Zhdan 2014.01.12 10:04  
sergeev:

у вас с индексацией все в порядке?

во первых, вся ваша писанина по циклам выглядит в итое так -


Ну на данном ТФ конечно так. Но я еще на этом графике буду брать данные с других ТФ, а там уже (High[i] - Low[i]) не сработает.

Поэтому, сделал так чтоб потом копи-пастом проще было.

А что с индексацией не так?

А вообще меня просто интересует первый вопрос. Остальное я сам доделаю.

o_o
Модератор
23701
o_o 2014.01.12 10:06  

в третьих

вы почто всунули условие внутрь цикла?

      if (b == true) 
    {
      Print ("Свеча " + i + " Диапазон 1 свечи: " + diapazon1candle*1000 + " разница: "  + raznitca[i]*1000);
     }
Evgeniy Zhdan
5541
Evgeniy Zhdan 2014.01.12 10:07  
sergeev:

у вас с индексацией все в порядке?

во первых, вся ваша писанина по циклам выглядит в итое так -

а этого текста не понял

// тут i = 2 потому что во второй свечи начинаем сравнивать с первой

где та первая?


а тут без разницы где она. Основной вопрос остается в первом посте
Sergey Dzyublik
4817
Sergey Dzyublik 2014.01.12 11:01  
remon:
Надо сравнить значение N с ценами ХАЙ, допустим 15 предыдущих свечей. И при N больше ВСЕХ ХАЙов вывести алерт.

Делаю вот так:

Но на деле получается, что НА КАЖДОМ баре в массиве где выполняется это условие выполняется Принт. А надо - чтобы он выполнялся только если выполняется условие на ВСЕХ барах, а не по отдельности.

если верно понял что надо. (оформив в пользовательскую функцию можно избежать ненужной проверки (count ==AmountCandle) при else return(-1)):
if (newbar==true)                          // делайте проверку при появлении только нового бара, чтобы не захламлять 
{
int count;                                 // счетчик количества
count=0;                            
for ( i = 1; i <=AmountCandle; i++)        // AmountCandle и есть значение N - количество баров у которых берем ХАЙ
    {
     if (diapazon1candle > raznitca[i])    //diapazon1candle  - хай 1 свечи, который сравниваем с предыдущими.  raznitca[i] - в этом массиве  содержатся ХАЙ цены N баров
        {
         сount++;
        }
     else break;
    }
if (count ==AmountCandle) 
   Print ( "Есть подтверждение");
}
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий