Okay, this is what I had come up with. The reason that I suggest that we do this, is to easily incorporate various indicators to our script. For example, we can make put this into the Indicator folder and then have a simple script that calls on this function to get the DUs, plot a MACD and stoch. This can be done with just a few lines. For you programming folks, this can be thought of as being OOish. 
function getDuAndScore() : TList;
begin
var BAR, F, X, DAYS, CYCLELENGTH, LASTLOWBAR, COUNT, DAYS1,DAYS2,DAYS3,
DAYS4,DAYS5, DIVIDEBY, mo1,mo2,mo3,mo4,mo5,thePrice,theVolume,AD: integer;
var AVG, VOL, N, DU, PV, BASE1,BASE2,BASE3,BASE4,BASE5,PEAK1,PEAK2,
PEAK3,PEAK4,PEAK5,GAIN1,GAIN2,GAIN3,GAIN4,GAIN5,AVERAGEGAIN,DU1,
DU2,DU3,DU4,DU5,AVERAGEDU : float;
var RETRACE, theMACD: integer;
if (not IsDaily) then
SetScaleDaily;
mo1:=BARCOUNT() -1 ;
mo2:=BARCOUNT() -21 ;
mo3:=BARCOUNT() -41 ;
mo4:=BARCOUNT() -61 ;
mo5:=BARCOUNT() -81 ;
RETRACE := 1;
F:=40;COUNT:=0;LASTLOWBAR :=1000000;
FOR BAR:= BARCOUNT() -1 DOWNTO BARCOUNT()-127 do
BEGIN
IF LASTLOWBAR < BAR THEN BAR:= LASTLOWBAR ;
//CHECK CYCLE AT SIX DAYS
X:= PEAKBAR(BAR, #HIGH, RETRACE) ;
N:= PEAK(BAR, #HIGH, RETRACE) - LOWEST(X-1, #LOW, 5) ;
IF N/LOWEST(X-1, #LOW, 5) >= 0.20 THEN CYCLELENGTH:= 5 ELSE
BEGIN
//RAISE CYCLE TO SEVEN
X:= PEAKBAR(BAR, #HIGH, RETRACE) ;
N:= PEAK(BAR, #HIGH, RETRACE) - LOWEST(X-1, #LOW, 6) ;
IF N/LOWEST(X-1, #LOW, 6) >= 0.20 THEN
CYCLELENGTH:= 6 ELSE
BEGIN
//RAISE CYCLE TO EIGHT
X:= PEAKBAR(BAR, #HIGH, RETRACE) ;
N:= PEAK(BAR, #HIGH, RETRACE) - LOWEST(X-1, #LOW, 7) ;
IF N/LOWEST(X-1, #LOW, 7) >= 0.20 THEN
CYCLELENGTH:= 7;
END;
END;
IF N/LOWEST(X-1, #LOW, CYCLELENGTH) >= 0.20 THEN
BEGIN
DAYS:= PEAKBAR(BAR, #HIGH, RETRACE) - LOWESTBAR(X-1, #LOW, CYCLELENGTH)+1 ;
IF PRICECLOSE(PEAKBAR(BAR, #HIGH, RETRACE) ) < PRICECLOSE(PEAKBAR(BAR, #HIGH, RETRACE)-1 ) THEN
PV:= VOLUME(PEAKBAR(BAR, #HIGH, RETRACE)-1 ) ELSE PV:= VOLUME(PEAKBAR(BAR, #HIGH, RETRACE) ) ;
F:=F+10;
LASTLOWBAR:=LOWESTBAR(X-1, #LOW, CYCLELENGTH)-1 ;
COUNT:= COUNT+1;
IF COUNT=1 THEN BEGIN
GAIN1:=N/LOWEST(X-1, #LOW, CYCLELENGTH) ;DAYS1:=DAYS;DU1:=LOWEST(mo1, #VOLUME, 20);
END;
IF COUNT=2 THEN BEGIN
GAIN2:=N/LOWEST(X-1, #LOW, CYCLELENGTH) ;DAYS2:=DAYS;DU2:=LOWEST(mo2, #VOLUME, 20);
END;
IF COUNT=3 THEN BEGIN
GAIN3:=N/LOWEST(X-1, #LOW, CYCLELENGTH) ;DAYS3:=DAYS;DU3:=LOWEST(mo3, #VOLUME, 20);
END;IF COUNT=4 THEN BEGIN
GAIN4:=N/LOWEST(X-1, #LOW, CYCLELENGTH) ;DAYS4:=DAYS;DU4:=LOWEST(mo4, #VOLUME, 20);
END;
IF COUNT=5 THEN BEGIN
GAIN5:=N/LOWEST(X-1, #LOW, CYCLELENGTH) ;DAYS5:=DAYS;DU5:=LOWEST(mo5, #VOLUME, 20);
AVERAGEGAIN:= (GAIN1+GAIN2+GAIN3+GAIN4+GAIN5)/5 ;
IF DU1>0 THEN DIVIDEBY:=1;
IF DU2>0 THEN DIVIDEBY:=2;
IF DU3>0 THEN DIVIDEBY:=3;
IF DU4>0 THEN DIVIDEBY:=4;
IF DU5>0 THEN DIVIDEBY:=5;
AVERAGEDU:= (DU1+DU2+DU3+DU4+DU5)/DIVIDEBY;
END;
IF COUNT = 5 THEN BREAK;
END;
END;
IF PRICECLOSE(BARCOUNT-1) >PRICECLOSE(BARCOUNT-2)THEN thePrice:=4;
IF VOLUME(BARCOUNT-1) >VOLUME(BARCOUNT-2)THEN theVolume:=2;
IF MACDEx( BARCOUNT-1, #CLOSE, 5, 13) > MACDEx(BARCOUNT-2, #CLOSE, 5, 13 )THEN AD:=1;
var num : float = AVERAGEGAIN;
var denum : float = (DAYS1+DAYS2+DAYS3+DAYS4+DAYS5)/5;
var Rank : float = 100*(num/denum);
var FRV : float = 3*AVERAGEDU;
var Pk : float = 2*(3*AVERAGEDU);
var Score : float = thePrice+theVolume+AD;
RestorePrimarySeries;
var lst : TList;
lst := TList.Create;
lst.Add(Rank);
lst.Add(AVERAGEDU);
lst.Add(FRV);
lst.Add(Pk);
lst.Add(Score);
Result := lst;
end;

function getDuAndScore() : TList;
begin
var BAR, F, X, DAYS, CYCLELENGTH, LASTLOWBAR, COUNT, DAYS1,DAYS2,DAYS3,
DAYS4,DAYS5, DIVIDEBY, mo1,mo2,mo3,mo4,mo5,thePrice,theVolume,AD: integer;
var AVG, VOL, N, DU, PV, BASE1,BASE2,BASE3,BASE4,BASE5,PEAK1,PEAK2,
PEAK3,PEAK4,PEAK5,GAIN1,GAIN2,GAIN3,GAIN4,GAIN5,AVERAGEGAIN,DU1,
DU2,DU3,DU4,DU5,AVERAGEDU : float;
var RETRACE, theMACD: integer;
if (not IsDaily) then
SetScaleDaily;
mo1:=BARCOUNT() -1 ;
mo2:=BARCOUNT() -21 ;
mo3:=BARCOUNT() -41 ;
mo4:=BARCOUNT() -61 ;
mo5:=BARCOUNT() -81 ;
RETRACE := 1;
F:=40;COUNT:=0;LASTLOWBAR :=1000000;
FOR BAR:= BARCOUNT() -1 DOWNTO BARCOUNT()-127 do
BEGIN
IF LASTLOWBAR < BAR THEN BAR:= LASTLOWBAR ;
//CHECK CYCLE AT SIX DAYS
X:= PEAKBAR(BAR, #HIGH, RETRACE) ;
N:= PEAK(BAR, #HIGH, RETRACE) - LOWEST(X-1, #LOW, 5) ;
IF N/LOWEST(X-1, #LOW, 5) >= 0.20 THEN CYCLELENGTH:= 5 ELSE
BEGIN
//RAISE CYCLE TO SEVEN
X:= PEAKBAR(BAR, #HIGH, RETRACE) ;
N:= PEAK(BAR, #HIGH, RETRACE) - LOWEST(X-1, #LOW, 6) ;
IF N/LOWEST(X-1, #LOW, 6) >= 0.20 THEN
CYCLELENGTH:= 6 ELSE
BEGIN
//RAISE CYCLE TO EIGHT
X:= PEAKBAR(BAR, #HIGH, RETRACE) ;
N:= PEAK(BAR, #HIGH, RETRACE) - LOWEST(X-1, #LOW, 7) ;
IF N/LOWEST(X-1, #LOW, 7) >= 0.20 THEN
CYCLELENGTH:= 7;
END;
END;
IF N/LOWEST(X-1, #LOW, CYCLELENGTH) >= 0.20 THEN
BEGIN
DAYS:= PEAKBAR(BAR, #HIGH, RETRACE) - LOWESTBAR(X-1, #LOW, CYCLELENGTH)+1 ;
IF PRICECLOSE(PEAKBAR(BAR, #HIGH, RETRACE) ) < PRICECLOSE(PEAKBAR(BAR, #HIGH, RETRACE)-1 ) THEN
PV:= VOLUME(PEAKBAR(BAR, #HIGH, RETRACE)-1 ) ELSE PV:= VOLUME(PEAKBAR(BAR, #HIGH, RETRACE) ) ;
F:=F+10;
LASTLOWBAR:=LOWESTBAR(X-1, #LOW, CYCLELENGTH)-1 ;
COUNT:= COUNT+1;
IF COUNT=1 THEN BEGIN
GAIN1:=N/LOWEST(X-1, #LOW, CYCLELENGTH) ;DAYS1:=DAYS;DU1:=LOWEST(mo1, #VOLUME, 20);
END;
IF COUNT=2 THEN BEGIN
GAIN2:=N/LOWEST(X-1, #LOW, CYCLELENGTH) ;DAYS2:=DAYS;DU2:=LOWEST(mo2, #VOLUME, 20);
END;
IF COUNT=3 THEN BEGIN
GAIN3:=N/LOWEST(X-1, #LOW, CYCLELENGTH) ;DAYS3:=DAYS;DU3:=LOWEST(mo3, #VOLUME, 20);
END;IF COUNT=4 THEN BEGIN
GAIN4:=N/LOWEST(X-1, #LOW, CYCLELENGTH) ;DAYS4:=DAYS;DU4:=LOWEST(mo4, #VOLUME, 20);
END;
IF COUNT=5 THEN BEGIN
GAIN5:=N/LOWEST(X-1, #LOW, CYCLELENGTH) ;DAYS5:=DAYS;DU5:=LOWEST(mo5, #VOLUME, 20);
AVERAGEGAIN:= (GAIN1+GAIN2+GAIN3+GAIN4+GAIN5)/5 ;
IF DU1>0 THEN DIVIDEBY:=1;
IF DU2>0 THEN DIVIDEBY:=2;
IF DU3>0 THEN DIVIDEBY:=3;
IF DU4>0 THEN DIVIDEBY:=4;
IF DU5>0 THEN DIVIDEBY:=5;
AVERAGEDU:= (DU1+DU2+DU3+DU4+DU5)/DIVIDEBY;
END;
IF COUNT = 5 THEN BREAK;
END;
END;
IF PRICECLOSE(BARCOUNT-1) >PRICECLOSE(BARCOUNT-2)THEN thePrice:=4;
IF VOLUME(BARCOUNT-1) >VOLUME(BARCOUNT-2)THEN theVolume:=2;
IF MACDEx( BARCOUNT-1, #CLOSE, 5, 13) > MACDEx(BARCOUNT-2, #CLOSE, 5, 13 )THEN AD:=1;
var num : float = AVERAGEGAIN;
var denum : float = (DAYS1+DAYS2+DAYS3+DAYS4+DAYS5)/5;
var Rank : float = 100*(num/denum);
var FRV : float = 3*AVERAGEDU;
var Pk : float = 2*(3*AVERAGEDU);
var Score : float = thePrice+theVolume+AD;
RestorePrimarySeries;
var lst : TList;
lst := TList.Create;
lst.Add(Rank);
lst.Add(AVERAGEDU);
lst.Add(FRV);
lst.Add(Pk);
lst.Add(Score);
Result := lst;
end;