NexusFi: Find Your Edge


Home Menu

 





Can Someone Compile This TS Indicator For Me?


Discussion in TradeStation

Updated
    1. trending_up 1,780 views
    2. thumb_up 1 thanks given
    3. group 1 followers
    1. forum 2 posts
    2. attach_file 0 attachments




 
Search this Thread

Can Someone Compile This TS Indicator For Me?

  #1 (permalink)
Gauer
garopaba + santa catarina
 
Posts: 45 since Aug 2019
Thanks Given: 9
Thanks Received: 62

Hi there guys, I am a newcomer to Tradestation, in fact I haven´t even installed it yet, but I am looking for the indicators I use (that are not available natively in TS) and I found the code for it, but I have no clue of how to compile it in TS.

The indicator is called Swing Volume (or ZigZag volume or Weis Wave), all the same thing.

Here is the code a friend provided:

 
Code
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;


And he also said that I needed to create a function first (that the indicator will reference), otherwise it won´t work. Again, I have no clue of how doing that. Here is the code for the function:

 
Code
inputs: XDateTime_s( numericsimple );

var: var0(0),var1(0),var2(0);

var0 = 24 * IntPortion( XDateTime_s ) + IntPortion( 24 * FracPortion( XDateTime_s ) ); // hours
var1 = IntPortion( 60 * FracPortion( 24 * XDateTime_s ) ); // minutes
var2 = IntPortion( 60 * FracPortion( 60 * FracPortion( 24 * XDateTime_s ) ) ); // seconds
                           
DateTimeToHms = NumToStr( var0, 0 ) + "h" + NumToStr( var1, 0 ) + "m" + NumToStr( var2, 0 ) + "s";


If you know how to do this, I ask please just compile it and then upload the files ready to use and just tell me in which folder I should put them.

And if I am not asking too much, can you please add an extra option in indicator settings to choose the type of volume to be used in the calculation? As it is it uses the total volume per bar for the summation. I would also like to have the delta of the wave. I noticed that Tradestation have the Bid-Ask indicator natively (which gives you the delta per bar), so it is already there, just needs to be added as an option in this swing volume code.

Best regards

Reply With Quote

Can you help answer these questions
from other members on NexusFi?
My NT8 Volume Profile Split by Asian/Euro/Open
NinjaTrader
Better Renko Gaps
The Elite Circle
The space time continuum and the dynamics of a financial …
Emini and Emicro Index
Exit Strategy
NinjaTrader
NexusFi Journal Challenge - April 2024
Feedback and Announcements
 
Best Threads (Most Thanked)
in the last 7 days on NexusFi
Get funded firms 2023/2024 - Any recommendations or word …
61 thanks
Funded Trader platforms
39 thanks
NexusFi site changelog and issues/problem reporting
26 thanks
The Program
18 thanks
GFIs1 1 DAX trade per day journal
18 thanks
  #2 (permalink)
Gauer
garopaba + santa catarina
 
Posts: 45 since Aug 2019
Thanks Given: 9
Thanks Received: 62

Ok so I discovered that I just needed to add Upticks-DownTicks in to the Initialize Variables part of the code

// 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, Upticks-DownTicks );


But I am not completely sure if this really means Bid-Ask volume, it was a friend who sent me this tip, but to me seems it is calculating tick volume (unless that In Tradestation easy language upticks-downticks means bid-ask)


So I wonder if it shouldn´t be like this instead:

// 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, Bid-Ask );

Reply With Quote
  #3 (permalink)
Gauer
garopaba + santa catarina
 
Posts: 45 since Aug 2019
Thanks Given: 9
Thanks Received: 62


I think I won´t even bother learning Tradestation and will give up migrating, it seems that the platform won´t do what I need.

I just found out that Tradestation servers do not store bid and ask volume data, only total volume. Well it stores, but only for the last 5 days.

So there is no point in having a cumulative delta or delta indicator because it won´t plot historically. For such a "famous" professional platform I find that unbelievable.

Volume UpDn (Indicator)
About the TradeStation Data Network


The tick by tick data only goes back 6 months from present day, and the bid ask volume only 5 days. Only data that goes far back in time is 1 minute.

Reply With Quote
Thanked by:




Last Updated on February 5, 2021


© 2024 NexusFi™, s.a., All Rights Reserved.
Av Ricardo J. Alfaro, Century Tower, Panama City, Panama, Ph: +507 833-9432 (Panama and Intl), +1 888-312-3001 (USA and Canada)
All information is for educational use only and is not investment advice. There is a substantial risk of loss in trading commodity futures, stocks, options and foreign exchange products. Past performance is not indicative of future results.
About Us - Contact Us - Site Rules, Acceptable Use, and Terms and Conditions - Privacy Policy - Downloads - Top
no new posts