Klinger Oscillator

Kant-en-klare, geteste indicatoren en handelssystemen
Plaats reactie
Eric
Berichten: 2741
Lid geworden op: za sep 10, 2005 2:41 am
Locatie: Den Haag

Klinger Oscillator

Bericht door Eric » wo feb 02, 2011 4:19 pm

In het Tradersclub magazine van februari (van www.tradersclub.nl) staat een artikel over de Klinger Oscillator. Hierbij de code van de indicator.

De Klinger Oscillator (KVO), ontwikkeld door Stephen J. Klinger, is een volume oscillator die een korte en lange termijn money flow registreert. De KVO gebruikt daartoe het verschil tussen een 34- en 55-daags EMA van de "Volume Force".

Code: Selecteer alles

{- Filename: Klinger Oscillator -}

function KlingerOscillator(nMA1, nMA2: integer): TSeries;
var
  Price3, Range, VForce: TSeries;
  i, Trend, NewTrend: integer;
  CM: real;
begin
  Price3 := AddSeries(AddSeries(High, Low), Close);
  Range := SubtractSeries(High, Low);
  VForce := CreateSeries(BarCount);
  CM := 0;
  Trend := 0;
  for i:=FirstValidIndex(Price3)+1 to BarCount-1 do
  begin
    if Price3[i] > Price3[i-1] then NewTrend := 1 else NewTrend := -1;
    if NewTrend = Trend then
      CM := CM + Range[i]
    else
      CM := Range[i] + Range[i-1];
    if CM <> 0 then
      VForce[i] := Volume[i] * Abs(2 * (Range[i]/CM) - 1) * NewTrend * 100;
    Trend := NewTrend;
  end;

  Result := SubtractSeries(MA(VForce, maExponential, nMA1), MA(VForce, maExponential, nMA2));
end;

var
  nMA1, nMA2, nMA3, nMA4, nSignal, nSmooth, i, iFirst: integer;
  sKO, sMA, sMATrend, sZero: TSeries;
  xKO: TLineCrossings;
begin
{ Parameters }
  nMA1 := CreateParameterInteger('Klinger EMA 1', 1, 999, 34, true);
  nMA2 := CreateParameterInteger('Klinger EMA 2', 1, 999, 55, true);
  nMA3 := CreateParameterInteger('Signaal MA', 1, 999, 13, true);
  nMA4 := CreateParameterInteger('Trend MA', 1, 999, 89, true);
  nSignal := CreateParameterSelect('Signalering', 'Op alle kruisingen'#9'Met nullijn filter'#9'Met Trend MA filter', 0, false);
  nSmooth := CreateParameterInteger('Cumulatieperiode', 1, 999, 1, true);

{ Indicator eigenschappen }
  with Indicator do 
  begin
    RequiredBars := 5*(nMA3+nMA2+nMA4) + nSmooth;
  end;

{ Berekening }
  sKO := SumSeries(KlingerOscillator(nMA1, nMA2), nSmooth);
  sMA := SumSeries(MA(sKO, maExponential, nMA3), nSmooth);
  sMATrend := MA(Close, maExponential, nMA4);
  sZero := FillSeries(CreateSeries(BarCount), 0);

{ Signalen }
  xKO := Crossings(sKO, sMA);
  iFirst := MaxInt(FirstValidIndex(sKO), FirstValidIndex(sMATrend));
  for i:=iFirst to BarCount-1 do
  begin
    case xKO[i] of
      lc1Over2:
      begin
        case nSignal of
          0: Signals[i] := sgEnterLong;
          1: if sKO[i] < 0 then Signals[i] := sgEnterLong;
          2: if Close[i] > sMATrend[i] then Signals[i] := sgEnterLong;
        end;
      end;
    lc2Over1:
      begin
        case nSignal of
          0: Signals[i] := sgEnterShort;
          1: if sKO[i] > 0 then Signals[i] := sgEnterShort;
          2: if Close[i] < sMATrend[i] then Signals[i] := sgEnterShort;
        end;
      end;
    end;
  end;

{ Weergave }
  with CreateLine(sKO) do
  begin
    Name := 'KO';
    Color := clLime;
  end;
  with CreateLine(sMA) do
  begin
    Name := 'MA';
    Color := clRed;
  end;
  with CreateLine(sZero) do
  begin
    Name := '0';
    Color := clSilver;
  end;
end.
---
Eric

Plaats reactie

Wie is er online

Gebruikers op dit forum: Geen geregistreerde gebruikers en 2 gasten