Version 1.00 (08/09/2013) Initial release.
Version 1.10 (10/25/2013) Bug negative time duration when a swing spans multiple days fixed.
Version 1.11 (11/02/2013) Correction on bug fix version 1.10.
This indicator is inspired on the Weis Wave with its cumulative wave volume. It plots a cumulative
ZigZag volume histogram, a ZigZag line and the cumulative volume, price change and/or duration of
the up/down swing at the swing high/low.
The ZigZag line can be based on point, percentage, ATR or UTC retracements.
The UTC retracement method is based on John R. Hill, George Pruitt, and Lundy Hill's description
in their book The Ultimate Trading Guide, page 39: "A top pivot point is the highest price in a
movement prior to penetration of the low of the top bar. A bottom pivot point is the lowest price
in a movement prior to penetration of the high of the low bar."
The UTC version is an improved version in which the highs and lows are calculated over a period.
Longer periods make the ZigZag UTC less sensitive. The default period for the UTC is 2 bars.}
Inputs:
Offset (0.2),
Font_Size(10),
HiPrice( close ), // price field for high swings
LoPrice( close ), // price field for low swings
RetraceMethod( 1 ), // 1=Pnt, 2=%, 3=ATR, 4=UTC
Period( 2 ), // number of bars over which ATR or UTC is calculated
Retrace( 0 ), // retracement in Pnt, % or ATR multiple
PlotVolume( true ), // plots cumulative volume histogram
PlotSwings( true ), // plots ZigZag lines
PlotVolumeText( true ), // plots cumulative volume of up/down swing at swing high/low
ScaleVolumeBy( 1 ), // divides cumulative volume text by the number of this input
PlotPriceText( false ), // plots price change of up/down swing at swing high/low
PlotTimeText( false ), // plots duration of up/down swing at swing high/low
LineWidth( 0 ), // line width of ZigZag lines: 0,1,2,3,4,5,6
LineStyle( tool_solid), // line style of ZigZag lines: tool_solid, tool_dotted, tool_dashed, tool_dashed2, tool_dashed3
UpColor( red ), // line color of upswings: PowerLanguage colors
DnColor( red ), // line color of downswings: PowerLanguage colors
TextColor( black ); // text color: PowerLanguage colors
Vars:
dailyTF( false ),
dir( 0 ),
hi( HiPrice ),
lo( LoPrice ),
lastLoBar( 1 ),
lastHiBar( 1 ),
lastHi( HiPrice ),
lastLo( LoPrice ),
swingHiCondition( false ),
swingLoCondition( false ),
vol( 0 ),
volUp( 0 ),
volDn( 0 ),
barsBack( 0 ),
x( 0 ),
tl( 0 ),
plotText( "" ),
waveTxt( 0 );
// Initialize variables
dailyTF = BarType >= 2 and BarType < 5;
hi = iff( RetraceMethod = 4, Highest( HiPrice, Period ), HiPrice );
lo = iff( RetraceMethod = 4, Lowest( LoPrice, Period ), LoPrice );
vol = iff( dailyTF, Volume, Ticks);
// set initial trend direction (dir will become non-zero after the first couple of bars)
if dir = 0 then
begin
if hi[0] > lastHi then // higher high
begin
lastHi = hi[0];
lastHiBar = CurrentBar;
if lo[0] > lo[1] then // higher low
dir = 1; // initial trend direction is up
end;
if lo[0] < lastLo then // lower low
begin
lastLo = lo[0];
lastLoBar = CurrentBar;
if hi[0] < hi[1] then // lower high
dir = -1; // initial trend direction is down
end;
end;
// look for swing points and draw lines
if dir > 0 then // trend is up, look for new swing high
begin
if RetraceMethod = 1 then swingHiCondition = lo[0] < lastHi - Retrace; // condition for swing high pnt
if RetraceMethod = 2 then swingHiCondition = lo[0] < lastHi * (1 - Retrace * 0.01 ); // condition for swing high %
if RetraceMethod = 3 then swingHiCondition = lo[0] < lastHi - ( Retrace * AvgTrueRange( Period ) ); // condition for swing high ATR
if RetraceMethod = 4 then swingHiCondition = hi[0] < lastHi and lo[0] < lo[1]; // condition for swing high UTC
if not swingHiCondition then
begin
if hi[0] > lastHi then // found a higher high
begin
lastHi = hi[0];
lastHiBar = CurrentBar;
end;
// update cumulative volume of upswing
volUp = 0;
barsBack = ( CurrentBar - lastLoBar - 1 );
for x = barsBack downto 0
begin
volUp = volUp + vol[x];
if PlotVolume then
begin
NoPlot[x]( 2 );
Plot1[x]( VolUp, "Volume Up" );
end;
end;
// update current upswing line and text from lastLoBar
if PlotSwings then
TL_SetEnd_Dt( tl, datetime[0], lastHi );
plotText =
iffString( PlotTimeText, iffString( dailyTF, NumToStr( CurrentBar - lastLoBar, 0 ) + " bar(s)",
DateTimeToHMS( ( ELDateToDateTime( Date[0] ) - ELDateToDateTime( Date[CurrentBar - lastLoBar] ) ) +
ELTimeToDateTime_s( Time_s[0] ) - ELTimeToDateTime_s( Time_s[CurrentBar - lastLoBar] ) ) ), "" ) +
iffString( PlotVolumeText, NewLine + NumToSTr( volUp + Offset / ScaleVolumeBy, 0 ), "" ) +
iffString( PlotPriceText, NewLine + "+" + NumToSTr( ( lastHi - lastLo ) * PriceScale, 0 ), "" );
Text_SetLocation_Dt( waveTxt, datetime[0], High[0] + Offset );
Text_SetString( waveTxt, plotText );
end
else if swingHiCondition then // found a swing high
begin
// update cumulative volume of upswing
volUp = 0;
barsBack = ( CurrentBar - lastLoBar - 1 );
for x = barsBack downto ( CurrentBar - lastHiBar )
begin
volUp = volUp + vol[x];
if PlotVolume then
begin
NoPlot[x]( 2 );
Plot1[x]( VolUp, "Volume Up" );
end;
end;
// update current upswing line from lastLoBar
if PlotSwings then
TL_SetEnd_Dt( tl, datetime[CurrentBar - lastHiBar], lastHi );
plotText =
iffString( PlotTimeText, iffString( dailyTF, NumToStr( lastHiBar - lastLoBar, 0 ) + " bar(s)",
DateTimeToHMS( ( ELDateToDateTime( Date[CurrentBar - lastHiBar] ) - ELDateToDateTime( Date[CurrentBar - lastLoBar] ) ) +
ELTimeToDateTime_s( Time_s[CurrentBar - lastHiBar] ) - ELTimeToDateTime_s( Time_s[CurrentBar - lastLoBar] ) ) ), "" ) +
iffString( PlotVolumeText, NewLine + NumToSTr( volUp / ScaleVolumeBy, 0 ), "" ) +
iffString( PlotPriceText, NewLine + "+" + NumToSTr( ( lastHi - lastLo ) * PriceScale, 0 ), "" );
Text_SetLocation_Dt( waveTxt, datetime[CurrentBar - lastHiBar], High[CurrentBar - lastHiBar] + Offset );
Text_SetString( waveTxt, plotText );
dir = -1; // trend direction is now down
lastLo = lo[0];
lastLoBar = CurrentBar; // now seeking new lows
volDn = 0;
barsBack = ( CurrentBar - lastHiBar - 1 );
for x = barsBack downto 0
begin
volDn = volDn + vol[x];
if PlotVolume then
begin
NoPlot[x]( 1 );
Plot2[x]( VolDn, "Volume Down" );
end;
end;
if PlotSwings then // start new trendline from new swing high to most recent low
begin
tl = TL_New_Dt( datetime[CurrentBar - lastHiBar], lastHi, datetime[CurrentBar - lastLoBar], lastLo );
TL_SetExtLeft( tl, false );
TL_SetExtRight( tl, false );
TL_SetSize( tl, LineWidth );
TL_SetStyle( tl, LineStyle );
TL_SetColor( tl, DnColor );
end;
plotText =
iffString( PlotPriceText, NumToSTr( ( lastLo - lastHi ) * PriceScale, 0 ), "" ) +
iffString( PlotVolumeText, NewLine + NumToSTr( volDn / ScaleVolumeBy, 0 ), "" ) +
iffString( PlotTimeText, NewLine + iffString( dailyTF, NumToStr( lastLoBar - lastHiBar, 0 ) + " bar(s)",
DateTimeToHMS( ( ELDateToDateTime( Date[CurrentBar - lastLoBar] ) - ELDateToDateTime( Date[CurrentBar - lastHiBar] ) ) +
ELTimeToDateTime_s( Time_s[CurrentBar - lastLoBar] ) - ELTimeToDateTime_s( Time_s[CurrentBar - lastHiBar] ) ) ), "" );
waveTxt = Text_New_Dt( datetime[CurrentBar - lastLoBar], Low[CurrentBar - lastLoBar], plotText );
Text_SetStyle( waveTxt, 2, 0 );
Text_SetSize( waveTxt, Font_Size );
Text_SetColor( waveTxt, TextColor );
end;
end
else
begin // dir < 0, trend is down, look for new swing low
if RetraceMethod = 1 then swingLoCondition = hi[0] > lastLo + Retrace; // condition for swing low pnt
if RetraceMethod = 2 then swingLoCondition = hi[0] > lastLo * (1 + Retrace * 0.01 ); // condition for swing low %
if RetraceMethod = 3 then swingLoCondition = hi[0] > lastLo + ( Retrace * AvgTrueRange( Period ) ); // condition for swing low ATR
if RetraceMethod = 4 then swingLoCondition = lo[0] > lastLo and hi[0] > hi[1]; // condition for swing low UTC
if not swingLoCondition then
begin
if lo[0] < lastLo then // found a lower low
begin
lastLo = lo[0];
lastLoBar = CurrentBar;
end;
// update cumulative volume of downswing
volDn = 0;
barsBack = ( CurrentBar - lastHiBar - 1 );
for x = barsBack downto 0
begin
volDn = volDn + vol[x];
if PlotVolume then
begin
NoPlot[x]( 1 );
Plot2[x]( VolDn, "Volume Down" );
end;
end;
// update current downswing line and text from lastHiBar
if PlotSwings then
TL_SetEnd_Dt( tl, datetime[0], lastLo );
plotText =
iffString( PlotPriceText, NumToSTr( ( lastLo - lastHi ) * PriceScale, 0 ) + NewLine, "" ) +
iffString( PlotVolumeText, NumToSTr( volDn / ScaleVolumeBy, 0 ) + NewLine, "" ) +
iffString( PlotTimeText, iffString( dailyTF, NumToStr( CurrentBar - lastHiBar, 0 ) + " bar(s)",
DateTimeToHMS( ( ELDateToDateTime( Date[0] ) - ELDateToDateTime( Date[CurrentBar - lastHiBar] ) ) +
ELTimeToDateTime_s( Time_s[0] ) - ELTimeToDateTime_s( Time_s[CurrentBar - lastHiBar] ) ) ), "" );
Text_SetLocation_Dt( waveTxt, datetime[0], Low[0] - Offset );
Text_SetString( waveTxt, plotText );
end
else if swingLoCondition then // found a swing low
begin
// update cumulative volume of downswing
volDn = 0;
barsBack = ( CurrentBar - lastHiBar - 1 );
for x = barsBack downto ( CurrentBar - lastLoBar )
begin
volDn = volDn + vol[x];
if PlotVolume then
begin
NoPlot[x]( 1 );
Plot2[x]( VolDn, "Volume Down" );
end;
end;
// update current downswing line from lastHiBar
if PlotSwings then
TL_SetEnd_Dt( tl, datetime[CurrentBar - lastLoBar], lastLo );
plotText =
iffString( PlotPriceText, NumToSTr( ( lastLo - lastHi ) * PriceScale, 0 ) + NewLine, "" ) +
iffString( PlotVolumeText, NumToSTr( volDn / ScaleVolumeBy, 0 ) + NewLine, "" ) +
iffString( PlotTimeText, iffString( dailyTF, NumToStr( lastLoBar - lastHiBar, 0 ) + " bar(s)",
DateTimeToHMS( ( ELDateToDateTime( Date[CurrentBar - lastLoBar] ) - ELDateToDateTime( Date[CurrentBar - lastHiBar] ) ) +
ELTimeToDateTime_s( Time_s[CurrentBar - lastLoBar] ) - ELTimeToDateTime_s( Time_s[CurrentBar - lastHiBar] ) ) ), "" );
Text_SetLocation_Dt( waveTxt, datetime[CurrentBar - lastLoBar], Low[CurrentBar - lastLoBar] - Offset );
Text_SetString( waveTxt, plotText );
dir = 1; // trend direction is now up
lastHi = hi[0];
lastHiBar = CurrentBar; // now seeking new highs
volUp = 0;
barsBack = ( CurrentBar - lastLoBar - 1 );
for x = barsBack downto 0
begin
volUp = volUp + vol[x];
if PlotVolume then
begin
Plot1[x]( VolUp, "Volume Up" );
NoPlot[x]( 2 );
end;
end;
if PlotSwings then // start new trendline from new swing low to most recent high
begin
tl = TL_New_Dt( datetime[CurrentBar - lastLoBar], lastLo, datetime[CurrentBar - lastHiBar], lastHi );
TL_SetExtLeft( tl, false );
TL_SetExtRight( tl, false );
TL_SetSize( tl, LineWidth );
TL_SetStyle( tl, LineStyle );
TL_SetColor( tl, UpColor );
end;
plotText =
iffString( PlotTimeText, iffString( dailyTF, NumToStr( lastHiBar - lastLoBar, 0 ) + " bar(s)",
DateTimeToHMS( ( ELDateToDateTime( Date[CurrentBar - lastHiBar] ) - ELDateToDateTime( Date[CurrentBar - lastLoBar] ) ) +
ELTimeToDateTime_s( Time_s[CurrentBar - lastHiBar] ) - ELTimeToDateTime_s( Time_s[CurrentBar - lastLoBar] ) ) ), "" ) +
iffString( PlotVolumeText, NewLine + NumToSTr( volUp / ScaleVolumeBy, 0 ), "" ) +
iffString( PlotPriceText, NewLine + "+" + NumToSTr( ( lastHi - lastLo ) * PriceScale, 0 ), "" );
waveTxt = Text_New_Dt( datetime[CurrentBar - lastHiBar], High[CurrentBar - lastHiBar], plotText );
Text_SetStyle( waveTxt, 2, 1 );
Text_SetSize( waveTxt, Font_Size );
Text_SetColor( waveTxt, TextColor );
end;
end;
|