VWAP

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

VWAP

Bericht door Eric »

In de TKA van jul/aug 2009 bespreekt Dirk Vandijcke de Volume Weighted Average Price indicator.

Ten eerste de moving VWAP, de som(gem.koers * volume) / som(volume) over een aantal bars.

Code: Selecteer alles

{- Filename: VWAP (Moving) -}

var
  Periode: integer;
  sAvgPrice, sPV, sV, sVWAP: TSeries;
begin
  Periode := CreateParameterInteger('VWAP periode', 1, 999, 30, true);

{ Indicator eigenschappen }
  with Indicator do
  begin
    RequiredBars := 500;        // Aantal benodigde koersen om eerste indicatorwaarde te berekenen
    NewBand := false;
    ScaleRange := srCommon;
  end;

{ Berekening }
  sAvgPrice := DivideSeriesBy(AddSeries(AddSeries(AddSeries(Open, High), Low), Close), 4);
  sPV := SumSeries(MultiplySeries(sAvgPrice, Volume), Periode);
  sV := SumSeries(Volume, Periode);
  sVWAP := DivideSeries(sPV, sV);

{ Weergave }
  with CreateLine(sVWAP) do
  begin
    Name := 'VWAP';
    Color := clLime;
  end;
end.
Vervolgens de Anchored VWAP, voor intraday gebruik, waarbij iedere dag de telling wordt herstart.

Code: Selecteer alles

{- Filename: VWAP (anchored) -}

var
  i, LastDate, LastDateStart: integer;
  sAvgPrice, sVWAP: TSeries;
  PV, TV: real;
begin
{ Indicator eigenschappen }
  with Indicator do
  begin
    RequiredBars := 500;        // Aantal benodigde koersen om eerste indicatorwaarde te berekenen
    NewBand := false;
    ScaleRange := srCommon;
  end;

{ Berekening }
  sAvgPrice := DivideSeriesBy(AddSeries(AddSeries(AddSeries(Open, High), Low), Close), 4);
  sVWAP := CreateSeries(BarCount);
  LastDate := -1;
  LastDateStart := 0;

  for i:=0 to BarCount-1 do
  begin
    if trunc(DateTime[i]) <> LastDate then
    begin
      PV := sAvgPrice[i] * Volume[i];
      TV := Volume[i];
      LastDate := trunc(DateTime[i]);
      LastDateStart := i;
    end else
    begin
      PV := PV + sAvgPrice[i] * Volume[i];
      TV := TV + Volume[i];
    end;

    if TV <> 0 then sVWAP[i] := PV / TV;
  end;

{ Weergave }
  with CreateLine(sVWAP) do
  begin
    Name := 'VWAP';
    Color := clYellow;
  end;
end.


en tenslotte de ActiveFloat VWAP, waarbij de terugkijkperiode voor de sommatie adaptief is, net zolang tot het volume groter is dan het opgegeven ActiveFloat volume.

Code: Selecteer alles

{- Filename: VWAP (ActiveFloat) -}

var
  i, j: integer;
  sAvgPrice, sPV, sCumPV, sCumV, sVWAP: TSeries;
  PV, TV, ActiveFloat: real;
begin
  ActiveFloat := CreateParameterReal('Active float', 1, 999999999, 1000000, true);

{ Indicator eigenschappen }
  with Indicator do
  begin
    RequiredBars := 999999;
    NewBand := false;
    ScaleRange := srCommon;
  end;

{ Berekening }
  sAvgPrice := DivideSeriesBy(AddSeries(AddSeries(AddSeries(Open, High), Low), Close), 4);
  sVWAP := CreateSeries(BarCount);
  sPV := MultiplySeries(sAvgPrice, Volume);
  sCumPV := FillSeries(CreateSeries(BarCount), 0);
  sCumV := FillSeries(CreateSeries(BarCount), 0);

  for i:=1 to BarCount-1 do
  begin
    sCumPV[i] := sCumPV[i-1] + sPV[i];
    sCumV[i] := sCumV[i-1] + Volume[i];
  end;

  for i:=0 to BarCount-1 do
  begin
    j := i;
    while (j > 0) and (sCumV[i]-sCumV[j] < ActiveFloat) do j := j-1;
    PV := sCumPV[i] - sCumPV[j];
    TV := sCumV[i] - sCumV[j];
    if TV <> 0 then sVWAP[i] := PV/TV;
  end;

{ Weergave }
  with CreateLine(sVWAP) do
  begin
    Name := 'VWAP';
    Color := clWhite;
  end;
end.
---
Eric
Plaats reactie