Hieronder het script van Auto Envelope Indicator van dr. Alexander Elder.
Een vraag over een scan mogelijkheid:
De prijs van een aandeel (bijv. Gartner) bevindt zich tussen de Middle Channel Line en Lower Channel Line (zie situatie in de bijlasge).
Is het mogelijk om dat naar voren te krijgen bij het scannen?
Uiteraard ook bij situatie tussen Upper Channel Line and Middle Channel Line
Het raken van beide lijnen moet dan niet in de scan mogelijkheid zitten, want die mogelijkheid heb je al gemaakt en werkt naar behoren.
Groet OT
Code: Selecteer alles
{- Filename: 4 TAR Auto Envelope -}
(**************************************************************
Indicator gemaakt op: 10-Nov-07
Auteur: <Wessel de Roode>
Indicator idee Dr. Alexander Elder: Come into my trading room
***************************************************************)
// Whipe start waarden
procedure CleanSeries(s: TSeries; Offset, Lookback: integer);
var
i: integer;
begin
for i:=0 to GetArrayLength(s)-1-Offset-Lookback do s[i] := NaN;
for i:=GetArrayLength(s)-Offset to GetArrayLength(s)-1 do s[i] := NaN;
end;
// QSort met dank aan Eric van ta-script forum
procedure _QSort(Data: TSeries; Lower, Upper: integer);
var
Left, Right: integer;
Pivot, tmp: real;
begin
if GetArrayLength(Data) = 0 then Exit;
Pivot := Data[(lower+upper) div 2];
Left := lower;
Right := upper;
while Left <= Right do
begin
while Data[Left] < Pivot do Left := Left+1; { Parting for left }
while Data[Right] > Pivot do Right := Right-1;{ Parting for right}
if Left <= Right then { Validate the change }
begin
tmp := Data[Left];
Data[left] := Data[Right];
Data[Right] := tmp;
Left := Left+1;
Right := Right-1;
end;
end;
if Right > Lower then _QSort(Data, lower, right); { Sort the LEFT part }
if Upper > Left then _QSort(Data, left, upper); { Sort the RIGHT part }
end;
function LastValidIndex(Values: TSeries): integer;
begin
Result := GetArrayLength(Values)-1;
while (Result > 0) and IsNaN(Values[Result]) do Result := Result-1;
end;
// QSort met dank aan Eric van ta-script forum
procedure QSort(Values: TSeries);
begin
_QSort(Values, FirstValidIndex(Values), LastValidIndex(Values));
end;
function CopySerie(S: TSeries; Offset, Lookback: integer): TSeries;
var
i, l: integer;
tmp: TSeries;
begin
tmp := CreateSeries(Lookback);
l := GetArrayLength(S);
if l < lookback then
begin
exit;
end;
for i:=0 to Lookback-1 do tmp[i] := S[l-Lookback+i-Offset];
Result := tmp;
end;
var
{ declaraties }
SlowEMAPeriod, i : integer; // parameterwaarde EMA
Count : integer; // Tel aantal doorprikkende bars
EMASeries, Maxies,Minies : TSeries; // Series
UpperChannel, LowerChannel : TSeries; // Series
Offset, LookBack : integer; // parameterwaarde Look back period
Pct : real; // Procent van de bars binnen het channel
ShiftUpper : real; // Upperband shift
ShiftLower : real; // Lowerband shift
MarkerType: integer;
begin
{ Indicator parameters }
SlowEMAPeriod := CreateParameterInteger('EMA', 1, 999, 22, true);
Offset := CreateParameterInteger('Offset', 0, 999, 0, true);
LookBack := CreateParameterInteger('Look back period', 1, 999, 100, true);
Pct := CreateParameterReal('% Bars Within Channel',0, 100, 95, true)/100.0;
MarkerType := CreateParameterSelect('Marker triggered by', 'No markers'#9'Lower band crossing'#9'Mid line crossing'#9'Upper band crossing'#9'Open above upper band'#9'Open below lower band', 0, false);
{ Indicator eigenschappen }
with Indicator do
begin
ShortName := 'AutoEnvelope'; // naam boven grafiek
RequiredBars := Offset+Lookback+5*SlowEMAPeriod; // aantal benodige koersen om eerste indicatorwaarde te berekenen
NewBand := false; // indicator komt door hoofdgrafiek heen
ScaleRange := srCommon; // indicatorschaal is identiek aan de hoofdgrafiek
CanUseParentDelta := true; // we kunnen ook het verschil met de hoofdgrafiek weergeven
SignalView := svShowInMain;
end;
Count := Round( LookBack * (1.0 - Pct) );
{ EMA Trend Line }
EMASeries := MA(Close, maExponential, SlowEmaPeriod);
Maxies := SubtractSeries(High, EMASeries);
Maxies := CopySerie(Maxies, Offset, Lookback);
QSort(Maxies);
Minies := SubtractSeries(EMASeries, Low);
Minies := CopySerie(Minies, Offset, Lookback);
QSort(Minies);
if (GetArrayLength(Maxies) > Count) and IsValid(Maxies[GetArrayLength(Maxies)-Count]) then
ShiftUpper := Maxies[GetArrayLength(Maxies)-Count];
UpperChannel := IncSeries(EMASeries, ShiftUpper);
CleanSeries(UpperChannel, Offset, Lookback);
if (GetArrayLength(Minies) > Count) and IsValid(Minies[ GetArrayLength(Minies)-Count]) then
ShiftLower := Minies[ GetArrayLength(Minies)-Count ];
LowerChannel := IncSeries(EMASeries,-ShiftLower);
CleanSeries(LowerChannel, Offset, Lookback);
for i:=FirstValidIndex(LowerChannel)+1 to BarCount-1 do
begin
case MarkerType of
1: if (Close[i-1] < LowerChannel[i]) and (High[i] > LowerChannel[i]) then Mark(i);
2: if (Close[i-1] < EMASeries[i]) and (High[i] > EMASeries[i]) then Mark(i);
3: if (Close[i-1] < UpperChannel[i]) and (High[i] > UpperChannel[i]) then Mark(i);
4: if (Open[i] > UpperChannel[i]) then Mark(i);
5: if (Open[i] < LowerChannel[i]) then Mark(i);
end;
end;
{ Upper Channel Trend Line }
with CreateLine(UpperChannel) do
begin
Name := 'UpperChannel';
Color := clLtGray;
LineType := ltClose;
Visible := true;
end;
{ EMA Trend Line }
with CreateLine(EMASeries) do
begin
Name := 'EMA';
Color := clYellow;
LineType := ltClose;
Visible := true;
end;
{ Lower Channel Trend Line }
with CreateLine(LowerChannel) do
begin
Name := 'LowerChannel';
Color := clLtGray;
LineType := ltClose;
Visible := true;
end;
end.