Auto envelope indicator

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

Re: Auto envelope indicator

Bericht door Optiontrader »

Hallo Eric,

Is het mogelijk om van de Auto Envelope Indicator een TAR-scan (Indicator) te maken, zoals al is gemaakt bij de MACD-H?

M.a.w. raakt de koers van de dag en of week de Upper Channel Line en of de Middle Channel Line en of de Lower Channel Line, waardoor hij de aandelen kan filteren op wel of niet raken van één van de drie lijnen?

Uiteraard in stelbaar.

Code: Selecteer alles

{- Filename: Auto Envelope -}

    {- Filename: Elder AutoEnvelope 2 -}

    (**************************************************************
    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
    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;

    { 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
      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);

      { 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. 
Groet OT

Eric
Berichten: 3165
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Auto envelope indicator

Bericht door Eric »

Ik heb wat meer informatie nodig om het op een logische manier te implementeren.

In principe kun je met de TAR scanner hetzij aan- of verkoopsignalen of markers signaleren, maar dan moet de indicator die wel geven. Dat doet hij nu niet. Als je precies aangeeft wanneer je een aankoop-, verkoopsignaal of een marker wilt zien dan zou het daarmee kunnen.

Als je uitsluitend wilt dat de scanner de fondsen signaleert die 1 van de 3 lijnen doorbreken, dan kun je de indicator bijvoorbeeld markers laten plaatsen op die doorbraken en die vervolgens met een TAR scanner (maar ook met een technisch filter) spotten. Maar met een marker weet je dan nog niet welke lijn is doorbroken natuurlijk, dus je moet dan nog wel naar de grafiek kijken.

---
Eric

Optiontrader
Berichten: 255
Lid geworden op: ma jan 01, 2007 9:41 pm

Re: Auto envelope indicator

Bericht door Optiontrader »

Hi Eric,

Ik hoef alleen maar te weten of de dag- of weekprijs (koers) vandaag/week hoger dan bijv. de Upper Channel Line is geweest. Na de close!

Groet OT

Eric
Berichten: 3165
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Auto envelope indicator

Bericht door Eric »

Nog niet helemaal duidelijk, ik zet nu een marker als de vorige slot onder de signaallijn zit en de huidige hoog erboven. Kijk maar even of dat zo naar wens is.

Code: Selecteer alles

{- Filename: 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'#9'Mid'#9'Upper 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
      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);
        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. 
---
Eric

Optiontrader
Berichten: 255
Lid geworden op: ma jan 01, 2007 9:41 pm

Re: Auto envelope indicator

Bericht door Optiontrader »

Goede morgen Eric,

Ik heb het ingesteld met de TA Reporter > Scanner, maar het werkt nog niet, zoals het de bedoeling is. Daarom twee/vier bijlagen. Het lijkt er namelijk wel op dat de scan het doet, maar deze geeft aanrakingen aan van dagen of weken geleden. Dat is niet de bedoeling. Het is juist de allerlaatste candle.

Bijlage 1 (TA 1) raakt de laatste koers de Upper Channel Line niet, waardoor die niet bij een scan naar voren kan komen.

Bijlage 2 (TA 2) raakt de laatste koers de Upper Channel Line wel, waardoor die wel bij een scan naar voren 'moet' komen.

TA 1 en 2 ingesteld met 'alle signalen'

Het gaat dus uitsluitend om het aanraken van de allerlaatste candle van de dag of van de week.

Zie ook TA 3: Wel geraakt, maar niet de laatste. Mag niet op een scan verschijnen.

Zie ook TA 4: Wel geraakt en juist de laatste, alsmede op de scan verschijnen.

TA 3 en 4 heb ik ingesteld met 'alleen end of bar signalen.

Ik hoop dat het nu iets duidelijker is. Anders lees ik het wel.

Groet OT
Bijlagen
TA 3.GIF
TA 2.GIF
TA 1.GIF

Optiontrader
Berichten: 255
Lid geworden op: ma jan 01, 2007 9:41 pm

Re: Auto envelope indicator

Bericht door Optiontrader »

en bijlage TA 4
Bijlagen
TA 4.GIF

Eric
Berichten: 3165
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Re: Auto envelope indicator

Bericht door Eric »

Je hebt de aangepaste indicator niet goed geïnstalleerd of je hebt er nu meerdere en je gebruikt de oude. De nieuwe heeft een extra parameter, waarmee je kunt kiezen voor welke doorbraak je een marker wilt zien. Die parameters ontbreekt in jouw versie.

Verder hebben de instellingen "alle signalen" en "end-of-bar signalen" waar je het over hebt alleen betrekking op real-time signaalbewaking. Uit de online help:
Signalen bewaken
Het is ook mogelijk om de signalen die indicator geeft als limietdoorbraak te signaleren. Dit heeft als voordeel dat u hem niet alleen in de grafiek ziet, maar ook:
· later nog terug kunt zien in Overzicht | Limietdoorbraken

· kunt laten signaleren volgens de instellingen bij Onderhoud | Voorkeuren | Limietbewaking

Signalen kunnen meerdere keren per koersbar verschijnen. Dit betekent dat u bijvoorbeeld bij daggrafieken meerdere signalen per dag kunt krijgen; een signaal kan immers om 10 uur worden gegeven, om 11 uur verdwijnen bij een nieuwe koers, en om 12 uur alsnog weer verschijnen bij weer een nieuwe koers.

Welke signalen u wilt laten bewaken kunt u zelf aangeven. U kunt kiezen voor het bewaken van alle signalen, alleen het eerste signaal per koersbar, of alleen end-of-bar signalen. Dit laatste houdt echter tevens in dat het signaal pas wordt gegeven wanneer de volgende bar wordt ingezet (voor een daggrafiek dus pas de volgende dag).
---
Eric

Optiontrader
Berichten: 255
Lid geworden op: ma jan 01, 2007 9:41 pm

Re: Auto envelope indicator

Bericht door Optiontrader »

Hallo Eric,

Het lijkt goed te werken.

Groet OT

Plaats reactie