ATR Channels

Stel hier uw vragen over TA-script, of help anderen met het oplossen van hun probleem
Plaats reactie
Optiontrader
Berichten: 368
Lid geworden op: ma jan 01, 2007 9:41 pm

ATR Channels

Bericht door Optiontrader »

Hallo Eric,

Het onderstaande script van de Keltner Channels (filename).

In het script staat op de 1e regel Filename ATR Channels en de 2e regel Keltner etc.

Deze Keltner Channels hebben 7 lijnen. Ik wil graag een bounce toevoegen. M.a.w.: Wanneer de koers gedurende de dag één van de lijnen raakt, wil ik graag via de scanner een selectie zien van bijv. de S&P 500. Het betekent bijv 7 scannen indien ik alleen de indicator gebruik. Raken betekent of de high, low, open of close. Zie bijlage.

Overigens gaat de huidige indicator uit van het gewone gemiddelde. Kan hier bij het gewogen en exponentieel gewogen gemiddelde?

Het is hetzelfde idee als de bekende EMA Bounce.

Het komt voort uit de ideas van dr. Alexander Elder.

Groet OT

Code: Selecteer alles

{- Filename: ATR Channels -}

    {- Filename: Keltner Channel -}

    function KeltnerChannel (Price:TSeries; Length:Integer; Factor:Real):TSeries;

    begin

             Result:= AddSeries(MA(Price,MASimple, Length) ,MultiplySeriesBy( MA(TrueRange(High, Low, Close), maSimple, Length) ,Factor));
    end;


    Var
        Avg, Price                :TSeries;
        UpperK1, LowerK1, UpperK2,
        LowerK2, UpperK3, LowerK3 :TSeries;
        Length,Displace,PriceType :Integer;
       _Const1, _Const2, _Const3  :Real;

    Begin

        Length                    :=  CreateParameterInteger('Length'   , 1, 999, 22 , true);
        _Const1                   :=  CreateParameterReal   ('Const'    , 1 , 99, 1, true);
        _Const2                   :=  CreateParameterReal   ('Const'    , 1 , 99, 2, true);
        _Const3                   :=  CreateParameterReal   ('Const'    , 1 , 99, 3, true);
        Displace                  :=  CreateParameterInteger('Displace', -1, 999, 0  , true);
        PriceType                 :=  CreateParameterSelect ('PriceType', 'Open'#9'High'#9'Low'#9'Close', 3, true);

    with Indicator do
      begin
        ShortName                 :='Keltner Channel';
        RequiredBars              := Length;
        Indicator.NewBand         := false;
        Indicator.ScaleRange      := srCommon;
      end;

        if PriceType=0 then Price := Open;
        if PriceType=1 then Price := High;
        if PriceType=2 then Price := Low;
        if PriceType=3 then Price := Close;
       

        Avg                       := ShiftSeries(MA(Price,MASimple, Length),Displace);
        UpperK1                   := ShiftSeries(KeltnerChannel(Price, Length,  _Const1),Displace);
        LowerK1                   := ShiftSeries(KeltnerChannel(Price, Length, -_Const1),Displace);
        UpperK2                   := ShiftSeries(KeltnerChannel(Price, Length,  _Const2),Displace);
        LowerK2                   := ShiftSeries(KeltnerChannel(Price, Length, -_Const2),Displace);
        UpperK3                   := ShiftSeries(KeltnerChannel(Price, Length,  _Const3),Displace);
        LowerK3                   := ShiftSeries(KeltnerChannel(Price, Length, -_Const3),Displace);

       
      with CreateLine(Avg) do
      begin
        Name                      :='Average';
        Color                     := clRed;
      end;
      with CreateLine(UpperK1) do
      begin
        Name                      :='UpperK-1';
        Color                     := clBlue;
      end;
      with CreateLine(LowerK1) do
      begin
        Name                      :='LowerK-1';
        Color                     := clBlue;
      end;
      with CreateLine(UpperK2) do
      begin
        Name                      :='UpperK-2';
        Color                     := clPurple;
      end;
      with CreateLine(LowerK2) do
      begin
        Name                      :='LowerK-2';
        Color                     := clPurple;
      end;
      with CreateLine(UpperK3) do
      begin
        Name                      :='UpperK-3';
        Color                     := clRed;
      end;
      with CreateLine(LowerK3) do
      begin
        Name                      :='LowerK-3';
        Color                     := clRed;
      end;
    END.
Bijlagen
Keltner Channels.GIF
Eric
Berichten: 3573
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: ATR Channels

Bericht door Eric »

Bedoel je dit? De indicator heet nu Keltner Channels trouwens, die twee namen vond ik wat verwarrend.

Code: Selecteer alles

{- Filename: Keltner Channels -}

Var
  Avg, Price, TR:TSeries;
  UpperK1, LowerK1, UpperK2,
  LowerK2, UpperK3, LowerK3 :TSeries;
  Length,Displace,PriceType, AvgType, i :Integer;
  _Const1, _Const2, _Const3  :Real;

Begin

        Length                    :=  CreateParameterInteger('Length'   , 1, 999, 22 , true);
        _Const1                   :=  CreateParameterReal   ('Const'    , 1 , 99, 1, true);
        _Const2                   :=  CreateParameterReal   ('Const'    , 1 , 99, 2, true);
        _Const3                   :=  CreateParameterReal   ('Const'    , 1 , 99, 3, true);
        Displace                  :=  CreateParameterInteger('Displace', -1, 999, 0  , true);
        PriceType                 :=  CreateParameterSelect ('PriceType', 'Open'#9'High'#9'Low'#9'Close', 3, true);
        AvgType := CreateParameterSelect('MA type', 'Gewoon'#9'Gewogen'#9'Exponentieel', 0, true);

    with Indicator do
      begin
        RequiredBars              := Length;
        NewBand         := false;
        ScaleRange      := srCommon;
        SignalView := svShowInMain;
      end;

      case PriceType of
        0: Price := Open;
        1: Price := High;
        2: Price := Low;
        else Price := Close;
      end;

      case AvgType of
        1: Avg := ShiftSeries(MA(Price, MAWeighted, Length),Displace);
        2: Avg := ShiftSeries(MA(Price, MAExponential, Length),Displace);
        else Avg := ShiftSeries(MA(Price, MASimple, Length),Displace);
      end;

  TR := MA(TrueRange(High, Low, Close), maSimple, Length);
  UpperK1 := AddSeries(Avg, MultiplySeriesBy(TR, _Const1));
  LowerK1 := AddSeries(Avg, MultiplySeriesBy(TR, -_Const1));
  UpperK2 := AddSeries(Avg, MultiplySeriesBy(TR, _Const2));
  LowerK2 := AddSeries(Avg, MultiplySeriesBy(TR, -_Const2));
  UpperK3 := AddSeries(Avg, MultiplySeriesBy(TR, _Const3));
  LowerK3 := AddSeries(Avg, MultiplySeriesBy(TR, -_Const3));

  for i:=FirstValidIndex(UpperK1) to BarCount-1 do
  begin
   if IsValid(UpperK1[i]) then
    if ((Low[i] <= UpperK1[i]) and (High[i] >= UpperK1[i])) or
       ((Low[i] <= UpperK2[i]) and (High[i] >= UpperK2[i])) or
       ((Low[i] <= UpperK3[i]) and (High[i] >= UpperK3[i])) or
       ((Low[i] <= LowerK1[i]) and (High[i] >= LowerK1[i])) or
       ((Low[i] <= LowerK2[i]) and (High[i] >= LowerK2[i])) or
       ((Low[i] <= LowerK3[i]) and (High[i] >= LowerK3[i])) or
       (IsValid(Avg[i]) and (Low[i] <= Avg[i]) and (High[i] >= Avg[i])) then Mark(i);
  end;

      with CreateLine(Avg) do
      begin
        Name                      :='Average';
        Color                     := clRed;
      end;
      with CreateLine(UpperK1) do
      begin
        Name                      :='UpperK-1';
        Color                     := clBlue;
      end;
      with CreateLine(LowerK1) do
      begin
        Name                      :='LowerK-1';
        Color                     := clBlue;
      end;
      with CreateLine(UpperK2) do
      begin
        Name                      :='UpperK-2';
        Color                     := clPurple;
      end;
      with CreateLine(LowerK2) do
      begin
        Name                      :='LowerK-2';
        Color                     := clPurple;
      end;
      with CreateLine(UpperK3) do
      begin
        Name                      :='UpperK-3';
        Color                     := clRed;
      end;
      with CreateLine(LowerK3) do
      begin
        Name                      :='LowerK-3';
        Color                     := clRed;
      end;
End.
---
Eric
Optiontrader
Berichten: 368
Lid geworden op: ma jan 01, 2007 9:41 pm

Re: ATR Channels

Bericht door Optiontrader »

Hallo Eric,

Ik bedoel het principe van de EMA Bounce. Op het moment dat de koers de EMA 22 raakt, krijg je via de scanner (na het einde van de handelsdag) een signaal dat de koers van een aandeel gedurende de dag de EMA 22 heeft geraakt.

Ik wil dat graag bij de Keltner Channels die 7 lijnen heeft (zie eerdere bijlage). Ik scan dan weliswaar even 7 keren, maar dat is no issue.

Huidige bijlage vertegenwoordigt het EMA Bounce principe

Groet OT

Het script van de EMA Bounce is:
{- Filename: 3 EMA Bounce -}

var
nEMA, i: integer;
sEMA: TSeries;
begin
{ Parameters }
nEMA := CreateParameterInteger('EMA periode', 1, 999, 22, true);

{ Indicator eigenschappen }
with Indicator do
begin
RequiredBars := 5*nEMA; // Aantal benodigde koersen om eerste indicatorwaarde te berekenen
NewBand := false; // indicator standaard in nieuwe sectie plaatsen
ScaleRange := srCommon; // indicatorschaal automatisch
SignalView := svShowInMain;
end;

{ Berekening }
sEMA := MA(Close, maExponential, nEMA);
for i:=FirstValidIndex(sEMA) to BarCount-1 do
begin
if (sEMA > Low) and (sEMA < High) then Mark(i);
end;

{ Weergave }
with CreateLine(sEMA) do
begin
Name := 'EMA';
Color := clYellow;
end;
end.
Bijlagen
EMA Bounce.GIF
Eric
Berichten: 3573
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: ATR Channels

Bericht door Eric »

Dat doet de indicator van 26 okt ook volgens mij, in een keer voor alle 7 lijnen. Als je liever per lijn de signalen ziet kan dat met deze:

Code: Selecteer alles

{- Filename: Keltner Channels -}

Var
  Avg, Price, TR:TSeries;
  UpperK1, LowerK1, UpperK2,
  LowerK2, UpperK3, LowerK3 :TSeries;
  Length,Displace,PriceType, AvgType, i :Integer;
  _Const1, _Const2, _Const3  :Real;
  BounceType: integer;
Begin

        Length                    :=  CreateParameterInteger('Length'   , 1, 999, 22 , true);
        _Const1                   :=  CreateParameterReal   ('K1'    , 1 , 99, 1, true);
        _Const2                   :=  CreateParameterReal   ('K2'    , 1 , 99, 2, true);
        _Const3                   :=  CreateParameterReal   ('K3'    , 1 , 99, 3, true);
        Displace                  :=  CreateParameterInteger('Displace', -1, 999, 0  , true);
        PriceType                 :=  CreateParameterSelect ('PriceType', 'Open'#9'High'#9'Low'#9'Close', 3, true);
        AvgType := CreateParameterSelect('MA type', 'Gewoon'#9'Gewogen'#9'Exponentieel', 0, true);
        BounceType := CreateParameterSelect('Signals', 'All'#9'UpperK3'#9'UpperK2'#9'UpperK1'#9'Middle'#9'LowerK1'#9'LowerK2'#9'LowerK3', 0, false);

    with Indicator do
      begin
        RequiredBars              := Length;
        NewBand         := false;
        ScaleRange      := srCommon;
        SignalView := svShowInMain;
      end;

      case PriceType of
        0: Price := Open;
        1: Price := High;
        2: Price := Low;
        else Price := Close;
      end;

      case AvgType of
        1: Avg := ShiftSeries(MA(Price, MAWeighted, Length),Displace);
        2: Avg := ShiftSeries(MA(Price, MAExponential, Length),Displace);
        else Avg := ShiftSeries(MA(Price, MASimple, Length),Displace);
      end;

  TR := MA(TrueRange(High, Low, Close), maSimple, Length);
  UpperK1 := AddSeries(Avg, MultiplySeriesBy(TR, _Const1));
  LowerK1 := AddSeries(Avg, MultiplySeriesBy(TR, -_Const1));
  UpperK2 := AddSeries(Avg, MultiplySeriesBy(TR, _Const2));
  LowerK2 := AddSeries(Avg, MultiplySeriesBy(TR, -_Const2));
  UpperK3 := AddSeries(Avg, MultiplySeriesBy(TR, _Const3));
  LowerK3 := AddSeries(Avg, MultiplySeriesBy(TR, -_Const3));

  for i:=0 to BarCount-1 do
  begin
   if IsValid(UpperK1[i]) then
   begin
    case BounceType of
      1: if (Low[i] <= UpperK3[i]) and (High[i] >= UpperK3[i]) then Mark(i);
      2: if (Low[i] <= UpperK2[i]) and (High[i] >= UpperK2[i]) then Mark(i);
      3: if (Low[i] <= UpperK1[i]) and (High[i] >= UpperK1[i]) then Mark(i);
      4: if (Low[i] <= Avg[i]) and (High[i] >= Avg[i]) then Mark(i);
      5: if (Low[i] <= LowerK1[i]) and (High[i] >= LowerK1[i]) then Mark(i);
      6: if (Low[i] <= LowerK2[i]) and (High[i] >= LowerK2[i]) then Mark(i);
      7: if (Low[i] <= LowerK3[i]) and (High[i] >= LowerK3[i]) then Mark(i);
      else
      begin
        if ((Low[i] <= UpperK1[i]) and (High[i] >= UpperK1[i])) or
         ((Low[i] <= UpperK2[i]) and (High[i] >= UpperK2[i])) or
         ((Low[i] <= UpperK3[i]) and (High[i] >= UpperK3[i])) or
         ((Low[i] <= LowerK1[i]) and (High[i] >= LowerK1[i])) or
         ((Low[i] <= LowerK2[i]) and (High[i] >= LowerK2[i])) or
         ((Low[i] <= LowerK3[i]) and (High[i] >= LowerK3[i])) or
         ((Low[i] <= Avg[i]) and (High[i] >= Avg[i])) then Mark(i);
      end;
    end;
   end;
  end;

      with CreateLine(Avg) do
      begin
        Name                      :='Average';
        Color                     := clRed;
      end;
      with CreateLine(UpperK1) do
      begin
        Name                      :='UpperK-1';
        Color                     := clBlue;
      end;
      with CreateLine(LowerK1) do
      begin
        Name                      :='LowerK-1';
        Color                     := clBlue;
      end;
      with CreateLine(UpperK2) do
      begin
        Name                      :='UpperK-2';
        Color                     := clPurple;
      end;
      with CreateLine(LowerK2) do
      begin
        Name                      :='LowerK-2';
        Color                     := clPurple;
      end;
      with CreateLine(UpperK3) do
      begin
        Name                      :='UpperK-3';
        Color                     := clRed;
      end;
      with CreateLine(LowerK3) do
      begin
        Name                      :='LowerK-3';
        Color                     := clRed;
      end;
End.
---
Eric
Optiontrader
Berichten: 368
Lid geworden op: ma jan 01, 2007 9:41 pm

Re: ATR Channels

Bericht door Optiontrader »

Ik heb de parameters twee keren ingesteld.

1ste keer op Middle en 2de keer op LowerK3.

Het is nog niet helemaal goed.

Zie bijlage 1 Middle

Zie bijlage 2 LowerK3

De koers raken de lijnen niet, waardoor er geen bounce is.

Voorbeeld van de EMA Bounce is de 3de bijlage.
Bijlagen
ATR Middle.GIF
ATR LowerK3.GIF
EMA Bounce.GIF
Optiontrader
Berichten: 368
Lid geworden op: ma jan 01, 2007 9:41 pm

Re: ATR Channels

Bericht door Optiontrader »

P.s.: De indicatoren van de 26ste okt 2023 en vandaag waren op de gebruikelijke manier gekopieerd en gedownload, maar er ging iets fout bij het plaatsen in Wallstreet Pro. Het euvel is hersteld en nu werkt het weer helemaal goed, slechts de indicator nog fine-tunen, zie bericht van zojuist. Is nog niet helemaal okay (m.i.)
Eric
Berichten: 3573
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: ATR Channels

Bericht door Eric »

Ik zie als laatste parameter in jouw eerste twee grafieken toch echt "All" staan, dat is de instelling waarbij de bounce op ieder van de 7 lijnen wordt gemarkeerd. Zie onder voor de laatste parameter die je kunt instellen.

---
Eric
Bijlagen
keltner.png
Optiontrader
Berichten: 368
Lid geworden op: ma jan 01, 2007 9:41 pm

Re: ATR Channels

Bericht door Optiontrader »

Eric, heet klopt, groet OT
Plaats reactie