Inputs:

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 swing volume histogram

PlotSwings( true ), // plots ZigZag lines

PlotVolumeText( true ), // plots swing volume text of up/down swing at swing high/low

AvgVolume( false ), // shows average swing volume text in stead of cumulative swing volume text

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

dis(3); //distance of text frome the high/low, added by Qin H Jia 20171213

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 an equal high or 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

begin

if AvgVolume and ( lastHiBar - lastLoBar ) <> 0 then volUp = volUp / ( lastHiBar - lastLoBar );

TL_SetEnd_Dt( tl, datetime[0], lastHi );

end;

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 / ScaleVolumeBy, 0 ), "" ) +

iffString( PlotPriceText, NewLine + "+" + NumToSTr( ( lastHi - lastLo ) * PriceScale, 0 ), "" );

Text_SetLocation_Dt( waveTxt, datetime[0], High[0]+dis);

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

begin

if AvgVolume and ( lastHiBar - lastLoBar ) <> 0 then volUp = volUp / ( lastHiBar - lastLoBar );

TL_SetEnd_Dt( tl, datetime[CurrentBar - lastHiBar], lastHi );

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 ), "" );

Text_SetLocation_Dt( waveTxt, datetime[CurrentBar - lastHiBar], High[CurrentBar - lastHiBar]+dis );

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

if AvgVolume and ( lastLoBar - lastHiBar ) <> 0 then volDn = volDn / ( lastLoBar - lastHiBar );

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, 8 );

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 an equal low or 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

begin

if AvgVolume and ( lastLoBar - lastHiBar ) <> 0 then volDn = volDn / ( lastLoBar - lastHiBar );

TL_SetEnd_Dt( tl, datetime[0], lastLo );

end;

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]-dis );

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

begin

if AvgVolume and ( lastLoBar - lastHiBar ) <> 0 then volDn = volDn / ( lastLoBar - lastHiBar );

TL_SetEnd_Dt( tl, datetime[CurrentBar - lastLoBar], lastLo);

end;

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]-dis);

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

if AvgVolume and ( lastHiBar - lastLoBar ) <> 0 then volUp = volUp / ( lastHiBar - lastLoBar );

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, 8 );

Text_SetColor( waveTxt, TextColor );

end;

end;