Diver





//+------------------------------------------------------------------+
//|                                                        Diver.mq4 |
//|                                                          Mishell |
//|   Ôóíêöèè îïðåäåëÿþùèå íàëè÷èå äèâåðãååíöèè è åå âèä             |
//+------------------------------------------------------------------+
#property copyright "Mishell"
#property link      ""
#property library
 
int sAddpips;
int bAddpips;
int BearsPeriod=13;
int BullsPeriod=13;
// ----- Êîíñòàíòû-ñèãíàëû ------
   int Div;  // Ñ÷åò÷èê äèâåðãåíöèé
   int Div1Bar;
   int Div2Bar;
   int Div3Bar;
   int Div1Wave; // íîìåð ïèêà èíäèêàòîðà ñèëû áûêîâ äëÿ äèâåðãåíöèè 1
   int Div2Wave; 
   int Div3Wave; 
 int Div1Main=0;

   int Conv;  //Ñ÷åò÷èê êîíâåðãåíöèé
   int Conv1Bar;
   int Conv2Bar;
   int Conv3Bar;
   int Conv1Wave; // íîìåð ïèêà èíäèêàòîðà ñèëû ìåäâåäåé äëÿ  êîíâåðãåíöèè 1
   int Conv2Wave; 
   int Conv3Wave; 
   
   int BeginBar;  // áàð îò êîòîðîãî èùåòñÿ äèâåðãåíöèÿ
   int BeginBarDown;// áàð îò êîòîðîãî èùåòñÿ êîíâåðãåíöèÿ
   int ContinueBar;// òåêóùèé áàð ïîèñêà äèâåðãåíöèè 
   int ContinueBarDown; //òåêóùèé áàð ïîèñêà êîíâåðãåíöèè  

   int UpWaveNum=0 ;   // ñ÷åò÷èê âåðøèí BullsPower
   int DownWaveNum=0 ; // ñ÷åò÷èê ÿì BearsPower
   

//+--------------------------------------------------------------------------+
//| Îïðåäåëåíèå íàëè÷èÿ ñèãíàëà î ñìåíå âîñõîäÿùåãî òðåíäà èëè íà÷àëå îòêàòà
//+--------------------------------------------------------------------------+
int BreackUpTrendCondition (int TimeFrame, int MaxWaveNum)
{
  int TopBar;// òåêóùèé ïðîâåðÿåìûé áàð
  
 // Print("Begin div while");  
  
  TopBar=ContinueBar; //
  //Ïðîâåëÿåì íàëè÷èå äèâåðãåíöèè
      while (! ( ((iHigh(NULL,TimeFrame,BeginBar)+sAddpips*Point)>=iHigh(NULL,TimeFrame,TopBar) &&
                iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, BeginBar)<
                iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar)) ||
                (UpWaveNum==MaxWaveNum ||
                iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar)<0)
                )
             )
   { //while
//Äèâåðãåíöè íåò. Òîãäà,
// Åñëè ìû íàøëè ïèê èíäèêàòîðà, òî óâåëè÷èâàåì ñ÷åò÷èê ïèêîâ íà 1 

        if ( (iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar)>
              iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar-1)
               && 
              iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar)>
              iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar+1)) )
        {//1
          UpWaveNum++ ;  

         }//1
// Åñëè æå ïèêà íåò,  
// ïðè óñëîâèè, ÷òî ñ÷åò÷èê "áû÷üèõ" ïèêîâ  = 0 è äâèæåíèå îò ñîñåäíåãî áàðà - íèñõîäÿùåå
//  óñòàíàâëèâàåì ýòîò ñîñåäíèé áàð êàê íà÷àëüíûé
       else
       if ( (UpWaveNum==0 && Div==0) &&
            (iBullsPower(NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, BeginBar)<
             iBullsPower(NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, BeginBar+1) ) ) 
            {  BeginBar++;  }
             
      TopBar++; //ïåðåõîäèì íà ñëåäóþùèé áàð
     }//while
     

  if (UpWaveNum< MaxWaveNum ) 
  {//Åñëè äèâåðãåíöèÿ íàéäåíà óâåëè÷èâàåì ñ÷åò÷èê äèâåðãåíöèè
   Div++;
   // Ïðîâåðÿåì íå ïèê ëè ýòî èíäèêàòîðà
        if ( (iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar)>
              iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar-1)
               && 
              iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar)>
              iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE, TopBar+1)) )
         UpWaveNum++ ;  
  
      switch(Div)
   {//sw
   case 1 : Div1Bar=TopBar;
            Div1Wave=UpWaveNum;
            break;
   case 2 : Div2Bar=TopBar;
            Div2Wave=UpWaveNum;
            break;
   case 3 : Div3Bar=TopBar;
            Div3Wave=UpWaveNum;
            break;            
   }//switch
  }//div
//---------------------  
      return(TopBar); 
//---------------------  
 }
//+--------------------------------------------------------------------------+
//| Îïðåäåëåíèå íàëè÷èÿ ñèãíàëà î ñìåíå íèñõîäÿùåãî òðåíäà èëè íà÷àëå îòêàòà
//+--------------------------------------------------------------------------+
 int BreackDownTrendCondition (int TimeFrame, int WaveNum)
  {
  int TopBar;
 //  Print("Begin conv while");
  TopBar=ContinueBarDown; //
      while (!( 
             (iLow(NULL,TimeFrame,BeginBarDown)-bAddpips*Point<=iLow(NULL, TimeFrame,TopBar) &&
              iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, BeginBarDown)>
              iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar))
                ||
               ( DownWaveNum==WaveNum //cWaveTopNum 
                ||
                iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar)>0)
              ))
     { 
        if ( (iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar)<
              iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar-1) && 
              iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar)<
              iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar+1)) )
          { DownWaveNum++ ;
  
          }
        else 
         if (DownWaveNum==0 && Conv==0 &&
            (iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, BeginBarDown)>
             iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, BeginBarDown+1) ))
                 {BeginBarDown++;}
       
       TopBar++; 
      }
  
      
  if (DownWaveNum<WaveNum 
      ) 
  {Conv++; 
     if ( (iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar)<
           iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar-1) && 
           iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar)<
           iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE, TopBar+1)) )
           DownWaveNum++ ;

          
   switch(Conv)
   {
   case 1 : Conv1Bar=TopBar;
            Conv1Wave=DownWaveNum;
            break;
   case 2 : Conv2Bar=TopBar;
            Conv2Wave=DownWaveNum;
            break;
   case 3 : Conv3Bar=TopBar;
            Conv3Wave=DownWaveNum;
            break;            
   }//switch
  }//if
//---------------------  
      return(TopBar); 
//---------------------  
 }

//+------------------------------------------------------------------+
// Èùåì äèâåðãåíöèþ
//+------------------------------------------------------------------+
  bool SeachDiv(int TimeFrame, int MaxWaveNum, int StartBar=0)
   {int BullDivBar=0; // Áàð äèâåðãåíöèè áûêîâ
    dinstall(StartBar);
    
   while (!( UpWaveNum==MaxWaveNum || Div>2 ||
             iBullsPower( NULL, TimeFrame, BullsPeriod, PRICE_CLOSE,BullDivBar)<0 ) )
   { 
    BullDivBar=BreackUpTrendCondition (TimeFrame, MaxWaveNum);//íàõîäèì áàð äèâåðãåíöèè 
    //óñòàíàâëèâàåì  ñîïóòñòâóþùèå  ñèãíàëüíûå ïåðåìåííûå
    ContinueBar=BullDivBar+1;//óñòàíàâëèâàåì áàð äëÿ ñëåäóþùåãî ïîèñêà äèâåðãåíöèè
   }//end while
   
   // Èòîãîâûå ñîîáùåíèÿ
    if (UpWaveNum <  MaxWaveNum  && Div>0)
      {
    //    Alert(Symbol(),"Äèâåã1:Áàð ¹ ",Div1Bar," âîëíà ",Div1Wave,";Äèâåã2:Áàð ¹ ",Div2Bar," âîëíà ",Div2Wave,
    //    ";Äèâåã3:Áàð ¹ ",Div3Bar," âîëíà ",Div3Wave," Íà÷àëüíûé áàð=",BeginBar);
        
        return(true);
          }
       else   
    return(false);
    }

//+------------------------------------------------------------------+
// Èùåì êîíâåðãåíöèþ
//+------------------------------------------------------------------+
  bool SeachConv(int TimeFrame, int cMaxWaveNum, int StartBar=0)
   { int BearConvBar=0;  //Áàð êîíâåðãåíöèè ìåäâåäåé
  //Print("Íà÷àëî áîëüøîãî öèêëà ïîèñêà êîâåðãåíöèè");
  cinstall(StartBar);
   while (!( DownWaveNum==cMaxWaveNum 
             || Conv>2 ||
             iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE,BearConvBar)>0 )
             //iBearsPower( NULL, TimeFrame, BearsPeriod, PRICE_CLOSE,ContinueBarDown)>0 )//ïðîïóñêàåò "óòîïëåííûõ" ìåäâåäåé
             )
   { BearConvBar=BreackDownTrendCondition(TimeFrame, cMaxWaveNum );
     ContinueBarDown=BearConvBar+1;
    }//end while
 
 
   // Èòîãîâûå ñîîáùåíèÿ  
    if (DownWaveNum<cMaxWaveNum 
       && Conv>0)
        {
     //   Alert(Symbol()," ",TimeFrame," ",buyADX," ",WaitUp ," Êîíâåã1:Áàð ¹ ",Conv1Bar," âîëíà ",Conv1Wave,";Êîíâåã2:Áàð ¹ ",Conv2Bar,
     //    " âîëíà ",Conv2Wave,";Êîíâåã3:Áàð ¹ ",Conv3Bar," âîëíà ",Conv3Wave," Íà÷àëüíûé áàð=",BeginBarDown);
        return(true);
         }
      else   
     return(false); 
}    

bool DiverKind(int SeekBar, int TimeFrame)
{double MetaClose;
 if (SeekBar==0)
  MetaClose=Close[0]+sAddpips*Point;
  else
  MetaClose = iHigh(NULL,TimeFrame,SeekBar)+sAddpips*Point;
if( BeginBar<SeekBar+1
        &&
      (//1&&
      (Div==1
       && MetaClose>iHigh(NULL,TimeFrame,Highest(NULL,TimeFrame,MODE_HIGH,Div1Bar,1))
       &&
       Div1Bar==Highest(NULL,TimeFrame,MODE_HIGH,3,Div1Bar-1)
       )
        ||
      (Div==2
       && MetaClose>iHigh(NULL,TimeFrame,Highest(NULL,TimeFrame,MODE_HIGH,Div2Bar,1))
       &&
       (Div2Bar==Highest(NULL,TimeFrame,MODE_HIGH,3,Div2Bar-1)
       ||
       Div1Bar==Highest(NULL,TimeFrame,MODE_HIGH,3,Div1Bar-1)
       )
       )
      ||
      (Div>=3
      &&  
      MetaClose>iHigh(NULL,TimeFrame,Highest(NULL,TimeFrame,MODE_HIGH,Div3Bar,1) )
      &&  
      (Div2Bar==Highest(NULL,TimeFrame,MODE_HIGH,3,Div2Bar-1)
       //&&
       ||                 
       Div3Bar==Highest(NULL,TimeFrame,MODE_HIGH,3,Div3Bar-1)
      )
      )
      )//1&&
      )
      return(true);
      else
      return(false);
  }
  

//+------------------------------------------------------------------+
// Òðåáîâàíèÿ ê êîíâåðãåíöèè
//+------------------------------------------------------------------+
  bool ConvKind(int SeekBar, int TimeFrame)
  { double lowLevel;
  
        if (SeekBar==0)
         lowLevel=Close[0]-bAddpips*Point;
         else
         lowLevel=iLow(NULL,TimeFrame,SeekBar)-bAddpips*Point;
   if ( BeginBarDown<SeekBar+1
        &&
     (//1
      (Conv==1 
      && lowLevel< iLow(NULL,TimeFrame,Lowest(NULL,TimeFrame,MODE_LOW,Conv1Bar,SeekBar+1))
      && 
      Conv1Bar==Lowest(NULL,TimeFrame,MODE_LOW,3,Conv1Bar-1))
        ||
      (Conv==2 
      && lowLevel< iLow(NULL,TimeFrame,Lowest(NULL,TimeFrame,MODE_LOW,Conv2Bar,SeekBar+1))
      && 
      (Conv1Bar==Lowest(NULL,TimeFrame,MODE_LOW,3,Conv1Bar-1)
         || 
       Conv2Bar==Lowest(NULL,TimeFrame,MODE_LOW,3,Conv2Bar-1)
       )	
           )   
       ||
      (Conv>2 //2 
      && lowLevel< iLow(NULL,TimeFrame,Lowest(NULL,TimeFrame,MODE_LOW,Conv3Bar,SeekBar+1))
       && 
         (//3
         Conv1Bar==Lowest(NULL,TimeFrame,MODE_LOW,3,Conv1Bar-1)
	       ||
	       Conv2Bar==Lowest(NULL,TimeFrame,MODE_LOW,3,Conv2Bar-1)
	       ||
	      Conv3Bar==Lowest(NULL,TimeFrame,MODE_LOW,3,Conv3Bar-1)
	       )//3
           )//2	   
	       )//1
	   )
	    return(true);
      else
       return(false);
      
 }

//+------------------------------------------------------------------+
//| expert initialization variables                                   |
//+------------------------------------------------------------------+
   void dinstall(int StrBar)
  {  Div=0;  // Èçíà÷àëüíî ñ÷èòàåì, ÷òî äèâèðãåíöèè íåò
    Div1Bar=0;
    Div2Bar=0;
    Div3Bar=0;
    Div1Wave=0; // íîìåð âîëíû äèâåðãåíöèè 1
    Div2Wave=0; // íîìåð âîëíû äèâåðãåíöèè 2
    Div3Wave=0;  // íîìåð âîëíû äèâåðãåíöèè 3
    UpWaveNum=0 ;

//=== áàðû ñ êîòîðûìè îïðåäåëÿþòñÿ äèâåðãåíöèÿ è êîíâåðãåíöèÿ ===
    BeginBar=StrBar;
    ContinueBar=BeginBar+1;
  return;
  }  
  
  void cinstall(int StrBar)
  {
     Conv =0 ;  
    Conv1Bar=0;
    Conv2Bar=0;
    Conv3Bar=0;
    Conv1Wave=0   ; // íîìåð âîëíû êîíâåðãåíöèè 1
    Conv2Wave=0; // íîìåð âîëíû êîíâåðãåíöèè 2
    Conv3Wave=0;  // íîìåð âîëíû êîíâåðãåíöèè 3
    DownWaveNum=0 ;
    BeginBarDown=StrBar;
    ContinueBarDown=StrBar+1;  
    return;
  }	   

void AddpipsInit(int spips,int bpips)
{
sAddpips=spips;
bAddpips=bpips;
return;
}


void PeriodInit(int P1,int P2)
{
BearsPeriod=P1;
BullsPeriod=P2;
return;
}

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



Sample





Analysis



Market Information Used:

Series array that contains the highest prices of each bar
Series array that contains the lowest prices of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:

Bulls Power indicator
Bears Power indicator


Custom Indicators Used:

Order Management characteristics:

Other Features: