Accumlative Swing Index

This script implements the Swing Index and the Accumulative Swing Index from the formulas in Welles Wilder's book, "New Concepts in Technical Trading Systems".   This plots in a study panel below the chart.  You can adjust the range of the panel plot and the panel labels to suit the charts you typically will put the plot on.   My present range of -300 to 300 seems adequate for the charts I tested with.

// Accumulation Swing Index
// reference: New Concepts in Technical Trading Systems
// author:  Welles Wilder

function SwingIndex(i: integer; limit: real): real;
var
  r,r1,r2,r3,r4,k,l,si,c1,c2,o1,o2,h1,h2,l1,l2: real;
begin
  if i>1 then begin
    c2:=Last(i);  {this bar}
    o2:=Open(i);
    h2:=High(i);
    l2:=Low(i);
    dec(i);
    c1:=Last(i);  {prior bar}
    o1:=Open(i);
    h1:=High(i);
    l1:=Low(i);

    if limit<=1 then limit:=10000; {assign a default for limit}

    r1:=abs(h2-c1);      {used in finding R equation}
    r2:=abs(l2-c1);
    r3:=abs(h2-l2);
    r4:=abs(c1-o1);
    k:=Max(r1,r2);

    if r1>=Max(r2,r3) then r:=r1-r2/2+r4/4
    else if r2>=Max(r1,r3) then r:=r2-r1/2+r4/4
    else r:=r3+r4/4;
 
    if r=0 then Result:=0
    else Result:=50*((c2-c1+0.5*(c2-o2)+0.25*(c1-o1))/r)*k/limit;
  end
  else Result:=0;
end;

procedure Accumulation;
var
  i: integer;
  rg,hi,nhi,lo,nlo,si,limit: real;
  s: string;
begin
  if BarBegin=2 then begin {initialization}
    RegisterStudy('Accum Swing Index',53);
    s:=GetVariable(eSymbol);
    if length(s)>2 then s:=Copy(s,1,length(s)-2);
    s:=Trim(s); {remove space in eSignal symbol}

    {this table of daily limits should be expanded}
    if s='SP' then limit:=10000 else
    if s='LC' then limit:=1500 else
    if s='PB' then limit:=3000 else
    if s='C' then limit:=12 else
    if s='W' then limit:=20 else
    if s='S' then limit:=30
    else limit:=10000;

    SetUser(6,limit,3);
    SetUser(6,-999,1); {high scale}
    SetUser(6,999,2);  {low scale}
    SetUser(ePercent,true);
    SetUser(ePlot2,True);  SetUser(eShow2,True);  SetUser(eShow3,True);
    SetUser(eSpread,0);
    SetUser(eClose,False);
    SetUser(eWindow,2); {plot in 2nd study panel}
    SetUser(2,GetUser(2,2),1);
    SetUser(3,0,1);
  end
  else limit:=GetUser(6,3);

  nhi:=GetUser(6,1); nlo:=GetUser(6,2);
  for i:=BarBegin to BarEnd do begin
    si:=SwingIndex(i,limit)+GetUser(3,pred(i));
    SetUser(3,si,i); 
  end;

    rg:=BarEnd-BarLeft;
  hi:=Highest(3,BarEnd,rg,i,1,0);
  lo:=Lowest(3,BarEnd,rg,i,1,0);
  SetUser(6,hi,1); {save high scale}
  SetUser(6,lo,2); {save low scale}
  rg:=(hi-lo)/100;
  if rg>0 then for i:=BarBegin to BarEnd do 
    Plot(2,(GetUser(3,i)-lo)/rg,i); {ASI as %}
  Plot(2,GetUser(2,BarEnd),succ(BarEnd));
  if BarBegin=BarEnd then 
    if (hi<>nhi) or (lo<>nlo) then begin
      if rg>0 then for i:=BarLeft to BarEnd do 
        Plot(2,(GetUser(3,i)-lo)/rg,i); 
      Plot(2,GetUser(2,BarEnd),succ(BarEnd));
      Refresh(True,eRSI);
    end;
end;

{*********Main Program***********}
begin
  if ESPL=52 then Accumulation;
end;

You will cut the procedures and paste them into the library of your existing script and add the  ESPL=52  statement to your existing Main Program.   To use, click ESPL button 52 button.   This will also register the study so from then on it will show by the name of Accum Swing Index on the bottom of the study list, and you can click on the study name instead of the ESPL button after that.

The formula needs the daily limit for the commodity the study is applied to.  I started a small look-up table in the script for a few common futures as an example.  You can add more to the table to cover the markets you want to use the study with.