PureBytes Links
Trading Reference Links
|
I agree that using a small compression (ex. 5 mins) to get spread values is
the best way to get more accurate daily highs and lows for a spread. Data1
and data2 make their highs and lows for the day at different times so
spread highs/lows based on day bars are way off.
Here's what I do to make accurate, historical daily spread bars. This
might work for you since you mentioned you want EOD spread high/low for use
in an ATR study.
Don't let the process turn you off, it's very quick and easy and the
resultant data stream is excellent. You can actually use the resultant
data with the built-in TS2k ATR or any other built-ins. I got the basic
idea some time ago from Alex Matulich.
1.Create a chart of 5min bars for data1. Insert data2 5min bars in
subgraph2. Toggle the Data Window open and right click on it. Select to
send the chart data to a file. Select and send one symbol at a time. The
procedure will send an ascii file that is perfect for TS and Excel to the
location, and with the name, you specify. Do it for both data1 & 2.
2.Open each new data file in XL. Each one will open in a separate
workbook. Copy/paste the Date/Time/O/H/L/C columns from the data2
worksheet onto the data1 worksheet. I leave an empty column or two between
the set of data1 columns and the data2 columns.
3.After that, it's easy to confirm that the times/bars for both data
match-up, and to fix any mis-matches. Then you do the calcs to create the
spread h/l/o/c for each bar. You end up with a data stream of the actual
spread bars' D/T/O/H/L/C that you save in a format that TS reads. After
you do the initial batch, adding a new day's worth of data after the close
takes less time than drinking your first Sam Adams.
4.The "artificial" spread data you created can then be used in a TS chart
of any equal or bigger time compression you choose. That includes Daily,
and the most accurate daily spread high/low is automatically charted when
you make the chart. For example, I use 24 hr. data so I found that
plotting daily spread bars made of hourly spread bars from using the
process described, gives me the daily spread high/low within pennies of
what 5min bars gave me. You can apply any built in study to that
artificial spread data.
5. If you want to use the XL method, let me know and I'll give you the
actual how-to. The XL work is very easy with just a few tips on
selecting/copying/pasting/saving in XL.
With my, I call them traps, trap code, I don't know how to populate an
array. Functions seems to be the way to go, it would be a piece of cake if
there was a highD for a spread.
Usually a loop is used to populate an array. If you look at one of the
built-in (or other) studies/functions that use an array you'll see how it's
done. I forget what the limit is for the number of elements permitted in
an array. If you're using a very small compression in a long market
session you might exceed the limit?
It seems like each day the functions you submitted would need to clear
themselves each morning and store the data at the end of the day for
reference purposes.
My functions will clear/initialize at the beginning of each new bar, no
matter what compression the bars are. As above, the bigger the bar
compression the less accurate the spread values will be, so applying the
functions on daily data are not accurate.
So, a "real time" XL alternative idea off the top of my head....
At the end of a session use your BarsBack calc
(if barInterval<>0 then BarsBack = timeBack/barInterval)
in
Highest(SprdTrueHigh(adj1,adj2),BarsBack) and
Lowest(SprdTrueLow(adj1,adj2),BarsBack)
Even though you're using 5min bars, the end of each session will show you
the highest/lowest spread values that occurred during that session. You
can plug them into whatever study you like.
I hope one of these ideas is helpful. Admittedly, I'm the lee RUBE
Goldberg of the Olist.
Lee
Lee Goldberg <best-revenge@xxxxxxx> wrote:
Sorry. The indicator needs the function inputs so it is
SprdTR = average(SprdTrueRange(Adj1,Adj2) ,N);
*******************************************************
Hi Doug,
I took the easy way out (maybe the wrong way out?) and made 3 user
functions like so:
{SpreadTrueHigh user function}
Inputs: Adj1(numeric), Adj2(numeric) ;
Vars: SprdC(0), SprdH(0) ;
SprdC = (C data1)*Adj1 - (C data2)*Adj2 ;
SprdH = (H data1)*Adj1 - (H data2)*Adj2 ;
If SprdC[1] > SprdH Then
SprdTrueHigh = SprdC[1]
Else
SprdTrueHigh = SprdH ;
*********************************************************
{SpreadTrueLow user function}
Inputs: Adj1(numeric), Adj2(numeric) ;
Vars: SprdC(0), SprdL(0) ;
SprdC = (C data1)*Adj1 - (C data2)*Adj2 ;
SprdL = (L data1)*Adj1 - (L data2)*Adj2 ;
If SprdC[1] < SprdL Then
SprdTrueLow = SprdC[1]
Else
SprdTrueLow = SprdL ;
****************************************************
{SpreadTrueRange user function}
Inputs: Adj1(numeric), Adj2(numeric);
SprdTrueRange = SprdTrueHigh(Adj1,Adj2)-SprdTrueLow(Adj1,Adj2) ;
**********************************************************
Then you can do something like
SprdTR = average(SprdTrueRange,N) ;
Regards,
Lee
At 10:55 AM 6/29/2004 -0700, you wrote:
>Hello all,
>
>I am a spread trader of stock pairs. I am trying to
>create some tradestation code for average true range
>of a spread relationship.
>
>Below is my attempt, but it is flawed, and gets even
>more flawed when 1/2 days are in the mix.
>
>What I wish to do is create an array and during the
>day capture the high of the spread on say a 5 min
>basis, and the low of the spread on a 5 min basis, as
>well as the close. The close should be no problem.
>
>What I want to do is mimic the highD, lowD function,
>for a spread relationship, and be able to call back 20
>days of data. I know how to capture the hi and low,
>see below, for the day, but I don't know how to
>successively store those values in an array.
>
>Can anyone help me adapt this code into a more stable
>and dynamic array format?
>
>inputs: spreadMultiple(1) , rangePct(1),
>timeBack(390);
>variables: hSpread(0), lSpread(0), spreadRange(0),
>spreadRange2(0), spreadRange3(0), spreadRange4(0),
>spreadRange5(0), avgRange5(0), spread(0), barsBack(0)
>;
>
>spread=(close data1*spreadMultiple) - close data2;
>
>if date<>date[1] then
>begin
> hSpread=-999999;
> lSpread=999999;
>
>
>if currentBar>500 then
>begin
>
>spreadRange=absValue(absValue(hSpread[barsBack+1])-absValue(lSpread[bars
Bac
> k+1]));
>
>spreadRange2=absValue(absValue(hSpread[barsBack+2])-absValue(lSpread[bar
sBa
> ck+2]));
>
>spreadRange3=absValue(absValue(hSpread[barsBack+3])-absValue(lSpread[bar
sBa
> ck3]));
>
>spreadRange4=absValue(absValue(hSpread[barsBack+4])-absValue(lSpread[bar
sBa
> ck+4]));
>
>spreadRange5=absValue(absValue(hSpread[barsBack+5])-absValue(lSpread[bar
sBa
> ck+5]));
>
>avgRange5=spreadRange+spreadRange2+spreadRange3+spreadRange4+spreadRange
5)/5;
>end;
>
>if spread>hSpread then hSpread=spread;
>
>if spread>
>if currentBar>300 then
>begin
> value1=hSpread-(avgRange5*rangePct);
> value2=lSpread+(avgRange5*rangePct);
>
> plot1(spread,"spread",magenta);
> plot2(value1,"ar-",green );
> plot3(value2,"ar+",green );
>end;
>
>Thanks,
>Doug
At 10:55 AM 6/29/2004 -0700, Doug Johnson wrote:
>Hello all,
>
>I am a spread trader of stock pairs. I am trying to
>create some tradestation code for average true range
>of a spread relationship.
>
>Below is my attempt, but it is flawed, and gets even
>more flawed when 1/2 days are in the mix.
>
>What I wish to do is create an array and during the
>day capture the high of the spread on say a 5 min
>basis, and the low of the spread on a 5 min basis, as
>well as the close. The close should be no problem.
>
>What I want to do is mimic the highD, lowD function,
>for a spread relationship, and be able to call back 20
>days of data. I know how to capture the hi and low,
>see below, for the day, but I don't know how to
>successively store those values in an array.
>
>Can anyone help me adapt this code into a more stable
>and dynamic array format?
>
>inputs: spreadMultiple(1) , rangePct(1),
>timeBack(390);
>variables: hSpread(0), lSpread(0), spreadRange(0),
>spreadRange2(0), spreadRange3(0), spreadRange4(0),
>spreadRange5(0), avgRange5(0), spread(0), barsBack(0)
>;
>
>spread=(close data1*spreadMultiple) - close data2;
>
>if date<>date[1] then
>begin
> hSpread=-999999;
> lSpread=999999;
>
>if barInterval<>0 then barsBack =
>timeBack/barInterval;
>
>if currentBar>500 then
>begin
>
>spreadRange=absValue(absValue(hSpread[barsBack+1])-absValue(lSpread[bars
Bac
> k+1]));
>
>spreadRange2=absValue(absValue(hSpread[barsBack+2])-absValue(lSpread[bar
sBa
> ck+2]));
>
>spreadRange3=absValue(absValue(hSpread[barsBack+3])-absValue(lSpread[bar
sBa
> ck3]));
>
>spreadRange4=absValue(absValue(hSpread[barsBack+4])-absValue(lSpread[bar
sBa
> ck+4]));
>
>spreadRange5=absValue(absValue(hSpread[barsBack+5])-absValue(lSpread[bar
sBa
> ck+5]));
>
>avgRange5=spreadRange+spreadRange2+spreadRange3+spreadRange4+spreadRange
5)/5;
>end;
>
>if spread>hSpread then hSpread=spread;
>
>if spread>
>if currentBar>300 then
>begin
> value1=hSpread-(avgRange5*rangePct);
> value2=lSpread+(avgRange5*rangePct);
>
> plot1(spread,"spread",magenta);
> plot2(value1,"ar-",green );
> plot3(value2,"ar+",green );
>end;
>
>Thanks,
>Doug
|