Page 1 of 2
TRO_DYNAMIC_SR2CAN - How it works
Posted: Fri May 18, 2007 9:33 am
by alichambers
Hi TRO,
I've been looking at the DynamicS/R threads and this looks like a really useful indicator.
However, I don't own TS or ES software - I own Amibroker, and am used to coding in this.
I would like to port the indicator over, but don't understand how the DynamicS/R works.
Would you be able to explain please.
Thanks, AC
Posted: Fri May 18, 2007 5:20 pm
by TheRumpledOne
Code: Select all
{ _TRO_Dynamic_SR2can - draw fibs between the Support/Resistance lines }
{Attn: TradeStation
if this indicator is posted on the TradeStation Forum, I, TheRumpledOne, did NOT post it there,
so I can't be blamed for this indicator having my contact info.}
{Programmer: Avery T. Horton, Jr. aka TheRumpledOne,
gifts and donations accepted, PO Box 43575, Tucson, AZ 85733 }
{ ? Copyright 2006 Avery T. Horton, Jr.}
inputs:
iAlert(false),
iStartDate(1070101), // if not intraday, date to start counting
iPlotFibs(true),
iPlotSR(true),
iPrice( Close ),
iDecimals(2),
iPeriods(5),
// iHigh( HighD(0) ),
// iLow( LowD(0) ),
iFibPlot("R"), // "P" = projections, "R" = retracements
iFib1(.24),
iFib2(.38),
iFib3(.50),
iFib4(.62),
iFib5(.76),
iFib1Color(darkcyan ),
iFib2Color(darkbrown),
iFib3Color(darkgray),
iFib4Color(darkbrown ),
iFib5Color(darkcyan ),
HighColor( red),
LowColor( blue),
idummy("");
variables:
fg8(white),
bg8(black),
xAppType(0),
sFirstPass(true),
tInd(""),
tAlert(""),
xFib1(iFib1),
xFib2(iFib2),
xFib3(iFib3),
xFib4(iFib4),
xFib5(iFib5),
tFib(""),
xLowestLow(0),
xHighestHigh(0),
xRange(0),
xPosition(0),
oExtremeVal( 0 ),
oExtremeBar( 0 ) ;
variables:
Dynamic2_R( 0 ),
Dynamic2_S( 0 ),
OldDynamic2_R( 0 ),
OldDynamic2_S( 0 ),
PrevDynamic2_R( 0 ),
PrevDynamic2_S( 0 ),
xBars( 0 ),
xPeriods(05),
xOldPeriods(0),
Dynamic_R( 0 ),
Dynamic_S( 0 ),
OldDynamic_R( 0 ),
OldDynamic_S( 0 ),
PrevDynamic_R( 0 ),
PrevDynamic_S( 0 ) ;
{commentary variables}
variables:
xcomm(0),
oComm1( "" ),
oComm2( "" ),
oComm3( "" ),
oComm4( "" ),
oComm5( "" ),
oComm6( "" ),
oComm7( "" ),
oComm8( "" ),
oComm9( "" ),
oComm10( "" );
{first time through}
if sFirstPass
then begin
sFirstPass = false;
{ APP TYPE TEST }
sFirstPass = false;
xAppType = GetAppInfo(aiApplicationType); // cUnknown = 0 cChart = 1 cRadarScreen = 2 cOptionStation = 3
end; {if sFirstPass}
{ INITIALIZE }
tInd = "";
tAlert = "";
{ CALCULATIONS }
If date this bar >= iStartDate
then begin
{save old values}
If Dynamic_R <> PrevDynamic_R
then OldDynamic_R = PrevDynamic_R;
If Dynamic_S <> PrevDynamic_S
then OldDynamic_S = PrevDynamic_S ;
OldDynamic_R = PrevDynamic_R ;
OldDynamic_S = PrevDynamic_S ;
PrevDynamic_R = Dynamic_R ;
PrevDynamic_S = Dynamic_S ;
If Dynamic2_R <> PrevDynamic2_R
then OldDynamic2_R = PrevDynamic2_R;
If Dynamic2_S <> PrevDynamic2_S
then OldDynamic2_S = PrevDynamic2_S ;
OldDynamic2_R = PrevDynamic2_R ;
OldDynamic2_S = PrevDynamic2_S ;
PrevDynamic2_R = Dynamic2_R ;
PrevDynamic2_S = Dynamic2_S ;
{ high / low for period }
xBars = xBars + 1;
oExtremeVal = Extremes( L, iPeriods, -1, Dynamic_S , oExtremeBar ) ; // lowest low
oExtremeVal = Extremes( H, iPeriods, 1, Dynamic_R , oExtremeBar ) ; // highest high
If Dynamic_R <> H
and Dynamic_R < PrevDynamic_R
then if PrevDynamic_R <> 0
then Dynamic_R = PrevDynamic_R;
If Dynamic_S <> L
and Dynamic_S > PrevDynamic_S
then if PrevDynamic_S <> 0
then Dynamic_S = PrevDynamic_S;
oExtremeVal = Extremes( L of data2 , iPeriods, -1, Dynamic2_S , oExtremeBar ) ; // lowest low
oExtremeVal = Extremes( H of data2, iPeriods, 1, Dynamic2_R , oExtremeBar ) ; // highest high
If Dynamic2_R <> H
and Dynamic2_R < PrevDynamic2_R
then if PrevDynamic2_R <> 0
then Dynamic2_R = PrevDynamic2_R;
If Dynamic2_S <> L
and Dynamic2_S > PrevDynamic2_S
then if PrevDynamic2_S <> 0
then Dynamic2_S = PrevDynamic2_S;
{
If iLow <> iLow[1]
Or iHigh <> iHigh[1]
then begin
}
If iFibPlot = "R"
Or iFibPlot = "r"
then begin
xLowestLow = Dynamic2_S ;
xRange = Dynamic2_R - Dynamic2_S ;
xFib1 = iFib1 * xRange + xLowestLow;
xFib2 = iFib2 * xRange + xLowestLow;
xFib3 = iFib3 * xRange + xLowestLow;
xFib4 = iFib4 * xRange + xLowestLow;
xFib5 = iFib5 * xRange + xLowestLow;
end // If iFibPlot = "R"...
else Begin
// oExtremeVal = Extremes( iLow[iPeriods], iPeriods, -1, xLowestLow , oExtremeBar ) ; // lowest low
// oExtremeVal = Extremes( iHigh[iPeriods], iPeriods, 1, xHighestHigh , oExtremeBar ) ; // highest high
xLowestLow = Dynamic2_S ;
xHighestHigh = Dynamic2_R ;
xRange = xHighestHigh - xLowestLow;
If close > OpenD(0)
then begin
xFib1 = iFib1 * xRange + xHighestHigh; // high projections
xFib2 = iFib2 * xRange + xHighestHigh;
xFib3 = iFib3 * xRange + xHighestHigh;
xFib4 = iFib4 * xRange + xHighestHigh;
xFib5 = iFib5 * xRange + xHighestHigh;
end
else begin
xFib1 = xLowestLow - iFib1 * xRange ; // low projections
xFib2 = xLowestLow - iFib2 * xRange ;
xFib3 = xLowestLow - iFib3 * xRange ;
xFib4 = xLowestLow - iFib4 * xRange ;
xFib5 = xLowestLow - iFib5 * xRange ;
end;
end;
// end; { If iLow <> iLow[1]... }
{ Alert criteria }
If high >= Dynamic_R
then begin
Fg8 = red;
Bg8 = white;
tAlert = "Price touched Resistance" ;
end
else
If Low <= Dynamic_S
then begin
Fg8 = blue;
Bg8 = white;
tAlert = "Price touched Support" ;
end;
{ Alert }
if iAlert
and tAlert <> ""
//and tAlert <> tAlert[1]
then Alert( tAlert ) ;
if iPlotFibs
then begin
Plot1(xFib1 , "fib1", iFib1Color ) ;
Plot2(xFib2 , "fib2", iFib2Color ) ;
Plot3(xFib3 , "fib3", iFib3Color ) ;
Plot4(xFib4 , "fib4", iFib4Color ) ;
Plot5(xFib5 , "fib5", iFib5Color ) ;
end; // iPlotFibs
if iPlotSR
then begin
Plot6(Dynamic_R , "Resistance", HighColor ) ;
Plot7(Dynamic_S , "Support", LowColor ) ;
Plot8(Dynamic2_R , "Res", HighColor ) ;
Plot9(Dynamic2_S , "Sup", LowColor ) ;
end; // iPlotSR
end; // If date >= xStartDate
if xAppType = 2
then begin
Plot18(tAlert , "Alert", yellow ) ;
end;
CommentaryCl( "Dynamic_R: ", NumToStr( Dynamic_R , iDecimals) );
CommentaryCl( "Dynamic_S: ", NumToStr( Dynamic_S , iDecimals) );
There's the code.
Posted: Sat May 19, 2007 12:04 pm
by alichambers
Thank you.
I can understand the following - I do not know Tradestation. Could you add in bits where needed please.
1. It goes back 5 bars and finds the highest high/lowest low
I am unsure what this is doing:
If Dynamic_R <> H
and Dynamic_R < PrevDynamic_R
then if PrevDynamic_R <> 0
then Dynamic_R = PrevDynamic_R;
If Dynamic_S <> L
and Dynamic_S > PrevDynamic_S
then if PrevDynamic_S <> 0
then Dynamic_S = PrevDynamic_S;
2. Key fib levels are calculated between the highest high and lowest low
3. These fib levels are plotted - but I am not sure which bar they start from
Posted: Sat May 19, 2007 3:51 pm
by TheRumpledOne
#1. I don't know how to explain that. <> means not equal to. < means less than and = means equal to. Prev means previous. To understand, you could construct a decision tree. That might help you.
#2 and #3. The fib levels are plotted each bar between dynamic support and resistance.
Posted: Sat May 19, 2007 5:11 pm
by alichambers
OK-do you have an explanation of how Dynamic S/R is calculated - non-code. I could then use that as a base.
AC
Posted: Sat May 19, 2007 10:17 pm
by TheRumpledOne
NO. The code is the explanation.
Posted: Mon May 21, 2007 6:40 pm
by cvax
what does the extremes function return?
Code: Select all
oExtremeVal = Extremes( L, iPeriods, -1, Dynamic_S , oExtremeBar ) ; // lowest low
Posted: Mon May 21, 2007 7:19 pm
by TheRumpledOne
oExtremeVal = Extremes( L, iPeriods, -1, Dynamic_S , oExtremeBar ) ; // lowest low
IT RETURNS THE LOWEST LOW or the HIGHEST HIGH for iPeriods
Posted: Fri May 25, 2007 8:02 pm
by jvp
alichambers wrote:OK-do you have an explanation of how Dynamic S/R is calculated - non-code. I could then use that as a base.
AC
I struggled to understand this code myself. After some cogitation I realized that the Dynamic_SR calculations boil down to this:
Code: Select all
{ Initialize }
if Dynamic_R = 0 then begin
Dynamic_R = Highest(High, iPeriods);
Dynamic_S = Lowest(Low, iPeriods);
end;
{ every pass }
if High = Highest(High, iPeriods) then Dynamic_R = High;
if Low = Lowest(Low, iPeriods) then Dynamic_S = Low;
Expressed in words, if the high of the current bar is equal to the highest high of the last iPeriods, set the dynamic high to the current high; otherwise just leave the dynamic high at whatever value it was before this bar. Similarly for dynamic support. The test of Dynamic_R equal to zero is there only to initialize dynamic support and resistance at the left edge of the chart.
- Jim
Posted: Thu Aug 02, 2007 7:42 pm
by TheRumpledOne
Jim:
You left out this part, which is the most important!!
If Dynamic_R <> H
and Dynamic_R < PrevDynamic_R
then if PrevDynamic_R <> 0
then Dynamic_R = PrevDynamic_R;
If Dynamic_S <> L
and Dynamic_S > PrevDynamic_S
then if PrevDynamic_S <> 0
then Dynamic_S = PrevDynamic_S;