V-TBv6





//+------------------------------------------------------------------+
//|                                                        V-T&B.mq4 |
//|                                           Don Lawson (don_forex) |
//+------------------------------------------------------------------+
#property copyright "Coded by Don Lawson (don_forex)"
#property link      "d_n_d_enterprises@sbcglobal.net"
//----
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_width1 2
#property indicator_color2 Green
#property indicator_width2 2
//----
extern double  WickRatio     =0.5;
extern double  WickPercent   =50;
extern int     JuicePeriod   =7;
extern int JuiceLevelForAlert=5;
//----
extern bool Notify=false;
extern bool UseNew=true;
//----
double VTop[];
double VBottom[];
double DistanceFromCandle;
int    Level=5;
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0, DRAW_ARROW, EMPTY);
   SetIndexArrow(0, 234);
   SetIndexBuffer(0, VTop);
   SetIndexStyle(1, DRAW_ARROW, EMPTY);
   SetIndexArrow(1, 233);
   SetIndexBuffer(1, VBottom);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
//----
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetVTop(int index)
  {
   double Juice, JuiceLevel;
   // Check for Juice
   JuiceLevel=Level*Point;
   if (Period()==5)JuiceLevel=JuiceLevel/2;
//----
   Juice=iStdDev  (NULL,0,JuicePeriod,MODE_EMA,0,PRICE_CLOSE,index)-JuiceLevel;
     if (Juice > JuiceLevelForAlert*Point) {
      VTop[index]=High[index]+ DistanceFromCandle;
      if (Notify) PlaySound("V-Top.wav");
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void SetVBottom(int index)
  {
   double Juice, JuiceLevel;
   // Check for Juice
   JuiceLevel=Level*Point;
   if (Period()==5)JuiceLevel=JuiceLevel/2;
//----
   Juice=iStdDev  (NULL,0,JuicePeriod,MODE_EMA,0,PRICE_CLOSE,index)-JuiceLevel;
     if (Juice > JuiceLevelForAlert*Point) 
     {
      VBottom[index]=Low[index]- DistanceFromCandle;
      if (Notify) PlaySound("V-Bottom.wav");
     }
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int limit, i,State;
   double WickPenetration;
   double BullWickPenHi,BullWickPenLow;
   double BearWickPenHi,BearWickPenLow;
   double BullWickHi,BullWickLow,BullBody;
   double BearWickHi,BearWickLow,BearBody;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//----
   WickPenetration=WickPercent/100.0;
   DistanceFromCandle=Point*8;
     for(i=1; i<=limit; i++) 
     {
      bool  CurrentBull    =false,
      CurrentBear    =false,
      Bull           =false,
      Bear           =false,
      HiWick         =false,
      LoWick         =false;
//----
      if (Open[i-1]<Close[i-1])
         CurrentBull=true;
      else
         CurrentBear=true;
      if (Open[i]<Close[i])
         Bull=true;
      else
         Bear=true;
//----
      BullWickHi=High[i] - Close[i];
      BullWickLow=Open[i] - Low[i];
      BullBody=Close[i] - Open[i];
      BearWickHi=High[i] - Open[i];
      BearWickLow=Close[i] - Low[i];
      BearBody=Open[i] - Close[i];
      // Check for VTOP
      if (High[i] > High[i+1])
        {
           if (Bull) 
           {
            if ((BullWickHi > BullBody * WickRatio))// && (BullWickHi > BullWickLow)
               HiWick=true;
           }
           if (Bear)
           {
            if ((BearWickHi > BearBody * WickRatio))// && (BearWickHi > BearWickLow)
               HiWick=true;
           }
        }
      // Check for VBottom
      if (Low[i] < Low[i+1])
        {
           if (Bull)
           {
            if ((BullWickLow > BullBody * WickRatio))// && (BullWickLow > BullWickHi)
               LoWick=true;
           }
           if (Bear)
           {
            if ((BearWickLow > BearBody * WickRatio))// && (BearWickLow > BearWickHi)
               LoWick=true;
           }
        }
      // Set up State Table
      if (CurrentBear && Bull) State=1;
      if (CurrentBear && Bear) State=2;
      if (CurrentBull && Bull) State=3;
      if (CurrentBull && Bear) State=4;
      // Set Arrow
        if (HiWick) 
        {
         BullWickPenHi=Close[i] + BullWickHi * WickPenetration;
         BearWickPenHi=Open[i] + BearWickHi * WickPenetration;
         switch(State)
           {
            case 1 : // CurrentBear && Bull 
               if (UseNew)
                 {
                  if(Open[i-1] < BullWickPenHi) SetVTop(i);
                 }
               else
                 {
                  SetVTop(i);
                 }

               break;
            case 2 : // CurrentBear && Bear 
               if (UseNew)
                 {
                  if (Open[i-1] < BearWickPenHi) SetVTop(i);
                 }
               else
                 {
                  SetVTop(i);
                 }
               break;
            case  3 : // CurrentBull && Bull
               if (UseNew)
                 {
                  if (Close[i-1] < BullWickPenHi) SetVTop(i);
                 }
               else
                 {
                  SetVTop(i);
                 }
               break;
            case 4 : // CurrentBull && Bear
               if (UseNew)
                 {
                  if (Close[i-1] < BearWickPenHi)  SetVTop(i);
                 }
               else
                 {
                  SetVTop(i);
                 }
               break;
           }
        }
        if (LoWick) 
        {
         BullWickPenLow=Open[i] - BullWickLow * WickPenetration;
         BearWickPenLow=Close[i] - BearWickLow * WickPenetration;
//----
         switch(State)
           {
            case 1 : // CurrentBear && Bull
               if (UseNew)
                 {
                  if (Close[i-1] > BullWickPenLow) SetVBottom(i);
                 }
               else
                 {
                  SetVBottom(i);
                 }
               break;
            case 2 : // CurrentBear && Bear
               if (UseNew)
                 {
                  if (Close[i-1] > BearWickPenLow) SetVBottom(i);
                 }
               else
                 {
                  SetVBottom(i);
                 }
               break;
            case 3 : // CurrentBull && Bull
               if (UseNew)
                 {
                  if (Open[i-1] > BullWickPenLow) SetVBottom(i);
                 }
               else
                 {
                  SetVBottom(i);
                 }
               break;
            case 4 : //CurrentBull && Bear)
               if (UseNew)
                 {
                  if (Open[i-1] > BearWickPenLow) SetVBottom(i);
                 }
               else
                 {
                  SetVBottom(i);
                 }
               break;
           }
        }
     }
   return(0);
  }
//+------------------------------------------------------------------+



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
Series array that contains open prices of each bar


Indicator Curves created:

Implements a curve of type DRAW_ARROW


Indicators Used:



Custom Indicators Used:

Order Management characteristics:

Other Features:

It plays sound alerts