Keltner Channel

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

Keltner Channel

Bericht door Optiontrader »

Hallo Eric,

In het onderstaande script wil ik graag een aanpassing.

Welke?

Ik zou graag willen zien dat er een signaal wordt afgegeven, wanneer de koers de bovenste en of de onderste lijn raakt, waardoor bij het scannen bij TA Reporter alleen de aandelen worden weergegeven die een van de twee lijnen raakt.

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.
Eric
Berichten: 3604
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Keltner Channel

Bericht door Eric »

Ik heb de "raak"-voorwaarde geïmplementeerd als "de slotkoers moet de bovenste lijn opwaarts kruisen of de onderste lijn neerwaarts kruisen".

Code: Selecteer alles

{- 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,i :Integer;
  _Const1, _Const2, _Const3  :Real;
  xUpper, xLower: TLineCrossings;
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;
    NewBand                   := false;
    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);

  xUpper := Crossings(Close, UpperK3);
  xLower := Crossings(Close, LowerK3);
  for i:=0 to BarCount-1 do
  begin
    if xUpper[i] = lc1Over2 then Signals[i] := sgEnterLong else
    if xLower[i] = lc2Over1 then Signals[i] := sgEnterShort;
  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
Plaats reactie