William36HistogramWallerTest1_1
Download scriptThis technical indicator is designed to monitor price momentum and provide visual signals regarding potential "Buy" or "Sell" opportunities based on historical price ranges. It functions by analyzing the relationship between current closing prices and the highest highs and lowest lows over a specific period.
Core Logic and Mechanics
The tool operates using a modified momentum calculation that evaluates where the current price sits within its recent high-to-low boundaries. It essentially measures "oversold" or "overbought" conditions by calculating the distance of the current price from the peak relative to the total range of the period.
Visual Representation: To make the data easy to interpret, the script splits the results into two distinct visual components:
- Positive Momentum (Green): When the calculated momentum stays above a neutral zero point, it is displayed as a green histogram.
- Negative Momentum (Red): When the calculated momentum drops below the neutral zero point, it is displayed as a red histogram.
- Neutral Reference: A gray line marks the "Zero" level, serving as the primary axis to distinguish between upward and downward momentum trends.
Automated Alert System
Beyond simply plotting data, the script includes an intelligent "Switch" logic designed to identify specific turning points in the market:
- Trend Detection: The script constantly monitors for "crosses." If the momentum moves from positive to negative (or vice versa), it identifies a shift in market pressure.
- Threshold Validation: To filter out minor market noise, the tool uses specific threshold levels (set at 15 and -15). It looks for significant movements that exceed these boundaries.
- Alert Triggers: When the script detects a confirmed momentum shift combined with a significant price movement, it triggers an audible alert and a text notification on your screen. These alerts are labeled as "BUY" or "SELL" signals based on whether the momentum has shifted into a positive or negative state.
- Real-time Feedback: The tool provides continuous status updates on the chart, identifying whether a "Buy Switch," a "Sell Switch," or no active switch is currently triggered, allowing for a clear view of the current market sentiment at a glance.
/*
original formula)
WH:=HHV(HIGH,5);
WL:=LLV(LOW,5);
//WRD:=(( HHV( WH,36 )-c ) /( HHV(WH,36 ) - LLV( WL,36) ) ) *- 100,
//WDo:=WRD+50;
//WU:=IF(WDo>0,WDo,0);
//WD:=IF(WDo<0,WDo,0);
//{- this will give you the william's when it is below zero and it is plotted red}
//LN:=0;
*/
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 LimeGreen
#property indicator_color2 Red
#property indicator_color3 Gray
#property indicator_maximum 50
#property indicator_minimum -50
#property indicator_level1 0
#property indicator_level2 15
#property indicator_level3 -15
extern bool UseAlert = True;
double alertBar;
//---- input parameters
//---- buffers
double WU[],WD[],W[],Zero[];
int Ssw=0,Bsw=0;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int init()
{
string short_name;
//---- 3 additional buffers are used for counting.
IndicatorBuffers(4);
SetIndexBuffer(3,W);
//---- indicator lines
SetIndexStyle(0,DRAW_HISTOGRAM,0,2);
SetIndexBuffer(0,WU);
SetIndexStyle(1,DRAW_HISTOGRAM,0,2);
SetIndexBuffer(1,WD);
SetIndexStyle(2,DRAW_LINE,0,2);
SetIndexBuffer(2,Zero);
//---- name for DataWindow and indicator subwindow label
short_name="William%R36 With Alert";
IndicatorShortName(short_name);
//---- indicator lines
//----
SetIndexDrawBegin(0,40);
//----
return(0);
}
//+------------------------------------------------------------------+
//| BSPVolume
//+------------------------------------------------------------------+
int start()
{
int i,k,counted_bars=IndicatorCounted();
if(Bars<=40) return(0);
//---- initial zero
/*
if(counted_bars<1)
{
for(i=1;i<=CCIPeriod;i++) CCIBuffer[Bars-i]=0.0;
for(i=1;i<=CCIPeriod;i++) DevBuffer[Bars-i]=0.0;
for(i=1;i<=CCIPeriod;i++) MovBuffer[Bars-i]=0.0;
}
*/
//---- last counted bar will be recounted
int limit=Bars-counted_bars;
if (counted_bars>0) limit++; else if (limit>3000) limit=3000;
for(i=0; i<limit; i++)
W[i]=50+(-100)*(High[Highest(NULL,0,MODE_HIGH,40,i)]-Close[i])/(High[Highest(NULL,0,MODE_HIGH,40,i)]-Low[Lowest(NULL,0,MODE_LOW,40,i)]);
for(i=0; i<limit; i++) Zero[i]=0;
for(i=0; i<limit; i++)
{
if (W[i]<0 && W[i+1]>0 && i<2)
{
Ssw=1;
Bsw=0;
}
if (W[i]>0 && W[i+1]<0 && i<2)
{
Ssw=0;
Bsw=1;
}
if (Bsw==1 && i<2 && W[i]>=15 && UseAlert==1 && Bars>alertBar)
{
Ssw=0;
Bsw=0;
Alert (Symbol()," ",Period()," Willy Says B U Y");alertBar = Bars;
}
if (Ssw==1 && i<2 && W[i]<=-15 && UseAlert==1 && Bars>alertBar)
{
Ssw=0;
Bsw=0;
Alert (Symbol()," ",Period()," Willy Says S E L L");alertBar = Bars;
}
if (Ssw==1) Comment ("SELL SWITCH ON","i ",i,"W[i] ",W[i],"W[i+1] ",W[i+1]);
if (Bsw==1) Comment ("BUY SWITCH ON","i ",i,"W[i] ",W[i],"W[i+1] ",W[i+1]);
if (Bsw==0 && Ssw==0) Comment ("NO SWITCH ON","i ",i,"W[i] ",W[i],"W[i+1] ",W[i+1]);
if (W[i]>0)
{WU[i]=W[i];WD[i]=0;}
else if (W[i]<0)
{WU[i]=0;WD[i]=W[i];}
else {WU[i]=0;WD[i]=0;}
}
return(0);
}
Comments