Choppiness Index Programing
The following code is an example of the Choppiness Index Programing
var
Plot1 : TPlot;
ATRData : TDataList;
ChopPeriod : TIntegerProperty;
procedure DefineTool(Tool : TTool);
begin
Tool.Name := 'Choppiness Index';
Tool.Key := '210189E5-77AF-4616-B5A1-04829030C11E';
Tool.MouseClicks := 0;
Tool.Hint := '';
Tool.ToolGroup := 'Price';
Tool.ToolType := ttDataView;
end;
procedure Init(Tool : TTool);
var
aLine : TLine;
begin
Plot1 := Tool.AddPlot();
Plot1.Color := 2;
Plot1.PlotStyle := Line;
Plot1.FillColor := 2;
Plot1.Caption := 'Choppiness Plot';
aLine := Tool.AddHLine(61.8, 2);
aLine := Tool.AddHLine(50, 3);
aLine := Tool.AddHLine(38.2, 1);
ChopPeriod := Tool.AddInteger('CHOP', 'Choppiness Period', 14);
end;
function Sum(aList : TDataList; iStartIndex : Integer; iCount : Integer) : Double;
var
j : integer;
begin
Result := 0;
for j := iStartIndex downto iStartIndex - iCount + 1 do
begin
if (j >= 0) and (j aList.Count) then
Result := Result + aList[j].Close;
end;
end;
function Max(aList : TDataList; iStartIndex : Integer; iCount : Integer) : Double;
var
j : integer;
rMax : Real;
begin
Result := 0;
for j := iStartIndex downto iStartIndex - iCount + 1 do
begin
if (j >= 0) and (j aList.Count) then
begin
rMax := aList.Row[j].High;
if (j > 0) and (aList.Row[j-1].Close > rMax) then
rMax := aList.Row[j-1].Close;
if Result rMax then
Result := rMax;
end;
end;
end;
function Min(aList : TDataList; iStartIndex : Integer; iCount : Integer) : Double;
var
j : integer;
rMin : Real;
begin
Result := 1E1000;
for j := iStartIndex downto iStartIndex - iCount + 1 do
begin
if (j >= 0) and (j aList.Count) then
begin
rMin := aList.Row[j].Low;
if (j > 0) and (aList.Row[j-1].Close rMin) then
rMin := aList.Row[j-1].Close;
if Result > rMin then
Result := rMin;
end;
end;
end;
procedure Process(Tool : TTool; ProcessStart : Integer; ProcessEnd : Integer; DataIn : TDataList);
var
i : Integer;
rAtr, rMaxHi, rMinLo : Double;
begin
ATRData := ATR('BARS=1');
for i:= ProcessStart to ProcessEnd do
begin
rAtr := Sum(ATRData, i, ChopPeriod.Variable);
rMaxHi := Max(DataIn, i, ChopPeriod.Variable);
rMinLo := Min(DataIn, i, ChopPeriod.Variable);
Plot1.Row[i].Date := DataIn.Row[i].Date;
Plot1.Row[i].Hidden := i ChopPeriod.Variable;
if (rAtr 0) and (rMaxHi rMinLo) then
Plot1.Row[i].Close := 100 *Log10(rAtr/(rMaxHi-rMinLo))/Log10(ChopPeriod.Variable)
else
Plot1.Row[i].Close := 0;
end;
end;