Последовательные свечи

 

Привет! Есть такое условие: если N последовательных свечей бычьи (или медвежьи) - открываем ордер.

я написал громоздкий код (функцию проверки последовательности) и хотел бы спросить вашего мнения или совета как его упростить...

bool BarsStreetUp(int N)
{
   if(N==1)
   {
      if(Open[1]<Close[1])
      return(true);
   }
   if(N==2)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2])
      return(true);
   }
   if(N==3)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3])
      return(true);
   }
   if(N==4)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3]&&Open[4]<Close[4])
      return(true);
   }
   if(N==5)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3]&&Open[4]<Close[4]&&Open[5]<Close[5])
      return(true);
   }
   if(N==6)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3]&&Open[4]<Close[4]&&Open[5]<Close[5]&&Open[6]<Close[6])
      return(true);
   }
   if(N==7)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3]&&Open[4]<Close[4]&&Open[5]<Close[5]&&Open[6]<Close[6]&&Open[7]<Close[7])
      return(true);
   }
   if(N==8)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3]&&Open[4]<Close[4]&&Open[5]<Close[5]&&Open[6]<Close[6]&&Open[7]<Close[7]
      &&Open[8]<Close[8])
      return(true);
   }
   if(N==9)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3]&&Open[4]<Close[4]&&Open[5]<Close[5]&&Open[6]<Close[6]&&Open[7]<Close[7]
      &&Open[8]<Close[8]&&Open[9]<Close[9])
      return(true);
   }
   if(N==10)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3]&&Open[4]<Close[4]&&Open[5]<Close[5]&&Open[6]<Close[6]&&Open[7]<Close[7]
      &&Open[8]<Close[8]&&Open[9]<Close[9]&&Open[10]<Close[10])
      return(true);
   }
   if(N==11)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3]&&Open[4]<Close[4]&&Open[5]<Close[5]&&Open[6]<Close[6]&&Open[7]<Close[7]
      &&Open[8]<Close[8]&&Open[9]<Close[9]&&Open[10]<Close[10]&&Open[11]<Close[11])
      return(true);
   }
   if(N==12)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3]&&Open[4]<Close[4]&&Open[5]<Close[5]&&Open[6]<Close[6]&&Open[7]<Close[7]
      &&Open[8]<Close[8]&&Open[9]<Close[9]&&Open[10]<Close[10]&&Open[11]<Close[11]&&Open[12]<Close[12])
      return(true);
   }
   if(N==13)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3]&&Open[4]<Close[4]&&Open[5]<Close[5]&&Open[6]<Close[6]&&Open[7]<Close[7]
      &&Open[8]<Close[8]&&Open[9]<Close[9]&&Open[10]<Close[10]&&Open[11]<Close[11]&&Open[12]<Close[12]&&Open[13]<Close[13])
      return(true);
   }
   if(N==14)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3]&&Open[4]<Close[4]&&Open[5]<Close[5]&&Open[6]<Close[6]&&Open[7]<Close[7]
      &&Open[8]<Close[8]&&Open[9]<Close[9]&&Open[10]<Close[10]&&Open[11]<Close[11]&&Open[12]<Close[12]&&Open[13]<Close[13]
      &&Open[14]<Close[14])
      return(true);
   }
   if(N==15)
   {
      if(Open[1]<Close[1]&&Open[2]<Close[2]&&Open[3]<Close[3]&&Open[4]<Close[4]&&Open[5]<Close[5]&&Open[6]<Close[6]&&Open[7]<Close[7]
      &&Open[8]<Close[8]&&Open[9]<Close[9]&&Open[10]<Close[10]&&Open[11]<Close[11]&&Open[12]<Close[12]&&Open[13]<Close[13]
      &&Open[14]<Close[14]&&Open[15]<Close[15])
      return(true);
   }
   if(N!=1&&N!=2&&N!=3&&N!=4&&N!=5&&N!=6&&N!=7&&N!=8&&N!=9&&N!=10&&N!=11&&N!=12&&N!=13&&N!=14&&N!=15)
   Comment("Incorrect value of the parameter ''Number of candles for signal analysis''! Valid value is from 1 to 15");
   return(false);   
}

и такой же (зеркальный) для медвежьих баров...

 
Maksim Neimerik:

Привет! Есть такое условие: если N последовательных свечей бычьи (или медвежьи) - открываем ордер.

я написал громоздкий код (функцию проверки последовательности) и хотел бы спросить вашего мнения или совета как его упростить...

и такой же (зеркальный) для медвежьих баров...


Цикл в помощь!

 
Evgeny Belyaev:

Цикл в помощь!

//+------------------------------------------------------------------+
bool BarsStreetDown()
  {
      int b=0;
      for(int i=0;i<=NumberOfBars;i++)
      {
         if(Close[i]<Open[i])
         b++;
      }
      if(b==NumberOfBars)
      {
      return(true);
      }
    return(false);
  }
  //+------------------------------------------------------------------+
bool BarsStreetUp()
  {
      int b=0;
      for(int i=0;i<=NumberOfBars;i++)
      {
         if(Close[i]>Open[i])
         b++;
      }
      if(b==NumberOfBars)
      {
      return(true);
      }
    return(false);
  }
NumberOfBars - это N;

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

 
Maksim Neimerik:

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

думаю вместо <= нужно просто < чтоб число элементов совпадало с количеством проходов цикла

 
Aleksey Semenov:

думаю вместо <= нужно просто < чтоб число элементов совпадало с количеством проходов цикла

там скорее надо с 1 начинать (i=1) чтобы текущий бар не был задействован (Сlose[] только к закрытым барам применяется же)...
 

А в условии открытия надо прописать:

if(BarsStreetDown()==NumberOfBars)

{

     OrderSend();

}

наверное так должно работать...

 
//===============================================================================================
//------------------------ Функция возвращает направление баров подряд -------------------------+
//===============================================================================================
int GetBearBull(string symb="0", ENUM_TIMEFRAMES 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);
 }

Применение:

if(GetBearBull(Symbol(),0,3) == 1) // 3 бычьих бара 
if(GetBearBull(Symbol(),PERIOD_M15,5) == 2) // 5 медвежьих бара на М15
if(GetBearBull("MVSUSD",PERIOD_M30,4) == 1) // 4 бычьих бара на символе "MVSUSD" период М30
 
int LastBars(int N)
  {
     //последовательность с бара номер N
     int dn=0,up=0,i;
     for(i=N;i<Bars;i++)
      {
         if(Close[i]<Open[i])dn--;
         if(Close[i]>Open[i])up++;
         if(up!=0 && dn!=0)break;         
      }
    if(up+dn>0)return(up+dn+1);
    if(up+dn<0)return(up+dn-1);
    return(0);
  }
Можно вызвать функцию два и более раз подряд изменяя N, чтобы анализ был более полным
Причина обращения: