// Downloaded From https://www.WiseStockTrader.com
_SECTION_BEGIN("TDREI-w-TDPOQ");
/* 
* TD's Range Expansion Index (TD REI)
* with Price Oscillator Qualifier (TD POQ)
*
* Notes: Code was modified to follow TD's rules.
* Improvements: plenty of bug fixes.
*
* Buy when the "varPrimaryBuySetupSignal" is 1
* Sell when the "varPrimarySellSetupSignal" is 1
*
*/

varPeriod = Param("Periods", 5, 1, 8, 1); //default is 5.
varSignal = Param("Signal", 40, 35, 45, 1);// default is 40.

varOversoldSignal = (0-1)*varSignal;
varOverboughtSignal = varSignal;
// End set variables

HighMom = H - Ref( H, -2 );
LowMom = L - Ref( L, -2 );

Cond1 = ( H >= Ref( L,-5) OR H >= Ref( L, -6 ) ) OR ( Ref( H, -2 ) >= Ref( C,-7 ) OR Ref( H, -2 ) >= Ref( C, -8 ) ); 
Cond2 = ( L <= Ref( H, -5 ) OR L <= Ref( H, -6) ) OR ( Ref( L, -2 ) <= Ref( C,-7 ) OR Ref( L, -2 ) <= Ref( C, -8 ) );

Cond = ( Cond1 AND Cond2 );

Num = IIf( Cond, HighMom + LowMom, 0 );
Den = abs( HighMom ) + abs( LowMom );

TDREI = 100 * Sum( Num, varPeriod )/Sum( Den, varPeriod ) ;

// Identify oversold conditions
nOversold = 0;
nOverbought = 0;
nOversold = Sum( TDREI <= varOversoldSignal, 6 ) == 6 OR
			Sum( TDREI <= varOversoldSignal, 5 ) == 5 OR
			Sum( TDREI <= varOversoldSignal, 4 ) == 4 OR
			Sum( TDREI <= varOversoldSignal, 3 ) == 3 OR
			Sum( TDREI <= varOversoldSignal, 2 ) == 2 OR
			TDREI <= varOversoldSignal
			;

// Identify overbought conditions
nOverbought = Sum( TDREI >= varOverBoughtSignal, 6) == 6 OR
				Sum( TDREI >= varOverBoughtSignal, 5) == 5 OR
				Sum( TDREI >= varOverBoughtSignal, 4) == 4 OR
				Sum( TDREI >= varOverBoughtSignal, 3) == 3 OR
				Sum( TDREI >= varOverBoughtSignal, 2) == 2 OR
				TDREI >= varOverBoughtSignal
				;

// Tom DeMark Price Oscillator Qualifier (TD POQ)
// Primary and Secondary Buy Setups apply to EOD of today
// Buy = H > (H,-1)

varPrimaryCheck = 0;
varPrimaryBuySetup = 0;
varSecondaryBuySetup = 0;
varPrimaryBuySetup = (
						Ref(C,-1) > Ref (C,-2) AND O <= Ref(H,-1)
						AND O<= Ref(H,-2) AND O<=Ref(H,-1)
						AND O<=L
						AND (H > Ref(H,-1) OR H > Ref(H,-2))
						);
varPrimarySellSetup = (
						Ref(C,-1) > Ref(C,-2)
						AND O >= Ref(L,-1)
						AND O >= Ref(L,-2)
						AND O >= H
						AND (L < Ref(L,-1) OR L < Ref(L,-2))
						);

varPrimaryBuySetupSignal = IIf(varPrimaryBuySetup AND Ref( nOversold,-1),1,0);
varPrimarySellSetupSignal = IIf(varPrimarySellSetup AND Ref(nOverbought,-1),1,0);

// Start: Plot all lines
Graph0=TDREI;
Graph0Style=styleThick;
Graph0Color=colorRed;
Graph1=varOverboughtSignal;
Graph1Style=styleLine;
Graph1Color=colorBlue;
Graph2=varOversoldSignal;
Graph2Style=styleLine;
Graph2Color=colorBlue;

IIf(varPrimaryBuySetupSignal>0,
	PlotShapes(shapeUpArrow*varPrimaryBuySetupSignal,colorGreen),0);
IIf(varPrimarySellSetupSignal>0,
	PlotShapes(shapeDownArrow*varPrimarySellSetupSignal,colorRed),0);

// End: plot all lines

Title =Name() + " -TDREI: " + "("+ WriteVal ( Graph0,format=1.2)+")";
_SECTION_END();