Помогите с расчетом бара

 

Здравствуйте уважаемые программисты. При написании кода возникла проблема. Мне нужен расчет N последовательно  восходящих или нисходящих баров. N задается в настройках.

Код

input int     NCandle          = 3;

bool Cand_Up(){
int cnt=0;
  for(int i=0; i<=NCandle; i++){
   if(Open[i]<Close[i])cnt++;
   if(Open[i]>Close[i])cnt=0;
   }
   if(cnt==NCandle)return(true);
  return(false);
}
bool Cand_Dn(){
int cnt=0;
  for(int i=0; i<=NCandle; i++){
   if(Open[i]>Close[i])cnt++;
   if(Open[i]<Close[i])cnt=0;
   }
   if(cnt==NCandle)return(true);
  return(false);

}


Выдает не понять что. Мне нужно, что бы при трех последовательных Up или Dn баров функция Cand_Up() или Cand_Dn() возвращала true, при появлении противоположного бара возвращала false.

Другой код мне не подходит, так как в настройках нельзя будет изменить количество обсчитываемых баров!

bool Cand_Up(){
  if(Open[3]<Close[3])
  if(Open[2]<Close[2])
  if(Open[1]<Close[1])
  return(true);
return(false);
}

Подскажите правильное решение! Заранее благодарю!

 
Vadim Kazakevich:

Здравствуйте уважаемые программисты. При написании кода возникла проблема. Мне нужен расчет N последовательно  восходящих или нисходящих баров. N задается в настройках.

Код

input int     NCandle          = 3;

bool Cand_Up(){
int cnt=0;
  for(int i=0; i<=NCandle; i++){
   if(Open[i]<Close[i])cnt++;
   if(Open[i]>Close[i])cnt=0;
   }
   if(cnt==NCandle)return(true);
  return(false);
}
bool Cand_Dn(){
int cnt=0;
  for(int i=0; i<=NCandle; i++){
   if(Open[i]>Close[i])cnt++;
   if(Open[i]<Close[i])cnt=0;
   }
   if(cnt==NCandle)return(true);
  return(false);

}


Выдает не понять что. Мне нужно, что бы при трех последовательных Up или Dn баров функция Cand_Up() или Cand_Dn() возвращала true, при появлении противоположного бара возвращала false.

Другой код мне не подходит, так как в настройках нельзя будет изменить количество обсчитываемых баров!

bool Cand_Up(){
  if(Open[3]<Close[3])
  if(Open[2]<Close[2])
  if(Open[1]<Close[1])
  return(true);
return(false);
}

Подскажите правильное решение! Заранее благодарю!

G попробуйте так
input int     NCandle=3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Cand_Up()
  {
   int cnt=0;
   for(int i=1; i<NCandle+1; i++)
     {
      if(Open[i]<Close[i])cnt++;
      if(Open[i]>=Close[i])cnt=0;
     }
   if(cnt==NCandle)return(true);
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Cand_Dn()
  {
   int cnt=0;
   for(int i=1; i<NCandle+1; i++)
     {
      if(Open[i]>Close[i])cnt++;
      if(Open[i]<=Close[i])cnt=0;
     }
   if(cnt==NCandle)return(true);
   return(false);
  }
//+------------------------------------------------------------------+
...
 
Vadim Kazakevich:

Здравствуйте уважаемые программисты. При написании кода возникла проблема. Мне нужен расчет N последовательно  восходящих или нисходящих баров. N задается в настройках.

Подскажите правильное решение! Заранее благодарю!

Вот тут с проверкой на гэпы, так-же можно получить данные с другого символа

//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull(string symb="0", int tf=0, int ne=2) {
if(symb=="0") { symb=Symbol();}
  double open1=0,close1=0,open2=0,close2=0;
  int b=1,s=1;
   for(int i=1; i<ne; i++) {
    open1=iOpen(symb,tf,i);
    close1=iClose(symb,tf,i);
    open2= iOpen(symb,tf,i+1);
    close2= iClose(symb,tf,i+1);
     if(open2<close2 && open1<close1 && open2<open1) {  // бычьи
      b++;
      if(b==ne) { return(1);}
     }
     if(open2>close2 && open1>close1 && open2>open1) { // медвежьи
      s++;
      if(s==ne) { return(2);}
     }
  }
  return(0);
}

Применение:

GetBearBull(_Symbol,0,4)==1  // 4 бычьих бара
GetBearBull(_Symbol,0,3)==2  // 3 медвежьих бара


 

 
Sergey Gritsay:
G попробуйте так
input int     NCandle=3;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Cand_Up()
  {
   int cnt=0;
   for(int i=1; i<NCandle+1; i++)
     {
      if(Open[i]<Close[i])cnt++;
      if(Open[i]>=Close[i])cnt=0;
     }
   if(cnt==NCandle)return(true);
   return(false);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Cand_Dn()
  {
   int cnt=0;
   for(int i=1; i<NCandle+1; i++)
     {
      if(Open[i]>Close[i])cnt++;
      if(Open[i]<=Close[i])cnt=0;
     }
   if(cnt==NCandle)return(true);
   return(false);
  }
//+------------------------------------------------------------------+
...
Спасибо! Это работает правильно!!!
Причина обращения: