PureBytes Links
Trading Reference Links
|
There was some discussion a couple of weeks ago on ADX and the
code space problems it causes.
I took all the related functions ADX uses to calculate and incoporated
them into the ADX code itself thus reducing the redundancy of the
separate functions. WYSIWYG when using it this way. There are
no hidden function calls other than "absvalue" and "currentbar".
The code is in indicator form. The only input is "Length" which is
set to a default of 14.
dbs
{
Indicator: ADX_
Calculates and plots ADX with no function calls to
DMIPlus
DMIMinus
DMI
ADX.
last update: 8/9/2000
code by: david b. stanley
*****************************************}
inputs:
Length(14);
vars:
Counter(0),
TRange(0), MyRange(Length),
PlusDM(0),MinusDM(0),
Plus14(0),
Minus14(0),
DMIup(0),DMIdn(0),
DMI_(0),
CummDMI(0), Return(0),
ADX_(0);
{ZZZZZZZZZZZZ...DMIup/DMIdn...ZZZZZZZZZZZZZ}
if CurrentBar = 1 then begin
MyRange = Length;
DMIup = 0;
Plus14 = 0;
Minus14 = 0;
TRange = 0;
for Counter = 0 to MyRange-1 begin
if (High[Counter] - High[Counter+1] < 0) then PlusDM = 0
else
PlusDM = High[Counter] - High[Counter+1];
if (Low [Counter+1] - Low [Counter] < 0) then MinusDM = 0
else
MinusDM = Low [Counter+1] - Low [Counter];
if MinusDM >= PlusDM then PlusDM = 0;
if PlusDM >= MinusDM then MinusDM = 0;
TRange= TRange + TrueRange[Counter] ;
Plus14 = Plus14 + PlusDM ;
Minus14 = Minus14 + MinusDM ;
end;{...counter=0 to myrange-1}
if TRange <> 0 then begin
DMIup = 100 * Plus14 / TRange;
DMIdn = 100 * Minus14 / TRange;
end
else begin
DMIup = 0 ;
DMIdn = 0;
end;
end{...currentbar=1}
else if CurrentBar > 1 then begin
if High[0]-High[1] < 0 then PlusDM = 0
else
PlusDM = High[0]-High[1];
if Low [1]-Low [0] < 0 then MinusDM = 0
else
MinusDM = Low [1]-Low [0];
if MinusDM >= PlusDM then PlusDM = 0;
if PlusDM >= MinusDM then MinusDM = 0;
if MyRange > 0 then begin
TRange = TRange[1] - (TRange[1] / MyRange) + TrueRange;
Plus14 = Plus14[1] - (Plus14[1] / MyRange) + PlusDM;
Minus14 = Minus14[1] - (Minus14[1] / MyRange) + MinusDM;
end;
if TRange<>0 then begin
DMIup = 100 * Plus14 / TRange;
DMIdn = 100 * Minus14 / TRange;
end
else begin
DMIup = 0;
DMIdn = 0;
end;
end;{...currentbar>1}
{ZZZZZZZZZZZZZZZ...DMI_...ZZZZZZZZZZZZZZZZ}
if DMIup + DMIdn= 0 then DMI_ = 0
else
DMI_ = 100 * AbsValue(DMIup - DMIdn)
/ (DMIup + DMIdn);
{ZZZZZZZZZZZ...ADX_...ZZZZZZZZZZZZZ}
Return = 0 ;
if CurrentBar >= 1 and Length > 0 then begin
if CurrentBar < Length then begin
CummDMI = 0 ;
for Counter = 0 to CurrentBar - 1 begin
CummDMI = CummDMI + DMI_[Counter] ;
end ;
Return = CummDMI / CurrentBar ;
end
else
Return = (ADX_[1] * (Length - 1) + DMI_) / Length ;
end ;
ADX_ = Return ;
{ZZZZZZZZZZZZ...Plot...ZZZZZZZZZZZZZ}
plot1(adx_,"adx");
|