Can Someone Compile This TS Indicator For Me? - futures io
futures io futures trading



Can Someone Compile This TS Indicator For Me?


Discussion in TradeStation

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




Welcome to futures io: the largest futures trading community on the planet, with well over 125,000 members
  • Genuine reviews from real traders, not fake reviews from stealth vendors
  • Quality education from leading professional traders
  • We are a friendly, helpful, and positive community
  • We do not tolerate rude behavior, trolling, or vendors advertising in posts
  • We are here to help, just let us know what you need
You'll need to register in order to view the content of the threads and start contributing to our community.  It's free and simple.

-- Big Mike, Site Administrator

(If you already have an account, login at the top of the page)

 
Search this Thread
 

Can Someone Compile This TS Indicator For Me?

(login for full post details)
  #1 (permalink)
garopaba + santa catarina
 
 
Posts: 37 since Aug 2019
Thanks: 8 given, 35 received

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

Journal Challenge February 2021 results (so far):
Competing for $1500 in prizes from Topstep
looks_oneSBtrader82 's Trading Journalby SBtrader82
(170 thanks from 31 posts)
looks_twoJust BEING a Trader: Letting Go!!by iqgod
(116 thanks from 33 posts)
looks_3Wisdom is Emptinessby Mtype
(68 thanks from 25 posts)
looks_4Deetee’s DAX Trading Journal (time based)by Deetee
(31 thanks from 17 posts)
looks_5Journal for peanuts1956by peanuts1956
(23 thanks from 13 posts)
 
 
(login for full post details)
  #2 (permalink)
garopaba + santa catarina
 
 
Posts: 37 since Aug 2019
Thanks: 8 given, 35 received

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
 
(login for full post details)
  #3 (permalink)
garopaba + santa catarina
 
 
Posts: 37 since Aug 2019
Thanks: 8 given, 35 received


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
The following user says Thank You to Gauer for this post:


futures io Trading Community Platforms and Indicators TradeStation > Can Someone Compile This TS Indicator For Me?


Last Updated on February 5, 2021


Upcoming Webinars and Events
 

NinjaTrader Indicator Challenge!

Ongoing
 

Journal Challenge w/$1500 prizes from Topstep!

February
 

Battlestations! Show us your trading desk - $1,500 in prizes!

March
 

Call Option Buying: The New Pain Trade? w/Carley Garner

Elite only
     



Copyright © 2021 by futures io, s.a., Av Ricardo J. Alfaro, Century Tower, Panama, +507 833-9432, info@futures.io
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.
no new posts