//+------------------------------------------------------------------+ //| 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(); if(counted_bars < 0) return(-1); if(counted_bars > 0) counted_bars--; limit = Bars - counted_bars; if(counted_bars==0) limit-=1+1; //---- 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] 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); } //+------------------------------------------------------------------+