vWap + Deviation + History-cut

by swingfish in category Volatility at 07/09/2018
Description

this is a cut-out of our indicator SwingFish-Intra.. showing the vWap only.

you can download the SwingFish-Intra Indicator for Free here: https://www.swingfish.trade/swingfish-intra

the main feature is to cut the history down to the charts do not shrink during the day.

plus vWap is for entries/exits, so seeing historical data makes little sense anyway.

Standard vWap


here is a sample of the SwingFish-Intra Indicator that includes the vWap (among other things)

Download
86 downloads
How to install
Notification Publishing copyrighted material is strictly prohibited. If you believe there is copyrighted material in this section you may use the Copyright Infringement Notification form to submit a claim.
Formula / Source Code
Language: C#
Trading Platform: cAlgocTrader
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;

namespace cAlgo.Indicators
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    //TimeZone = TimeZones.UTC
    public class IntraDayStandardDeviation : Indicator
    {
        [Parameter("Offset Reset time", DefaultValue = 0)]
        public int TimeOffset { get; set; }

        [Output("Upper SD", Color = Colors.Gray, PlotType = PlotType.Points)]
        public IndicatorDataSeries SD3Pos { get; set; }

        [Output("Lower SD", Color = Colors.Gray, PlotType = PlotType.Points)]
        public IndicatorDataSeries SD3Neg { get; set; }

        [Output("VWAP", LineStyle = LineStyle.Dots, Thickness = 2, Color = Colors.Yellow)]
        public IndicatorDataSeries VWAP { get; set; }

        [Parameter("Show Diviation Lines", DefaultValue = false)]
        public bool ShowDiviation { get; set; }

        [Parameter("Show vWap History", DefaultValue = false)]
        public bool ShowHistoricalvWap { get; set; }

        //       [Parameter("Use OHLC", DefaultValue = false)]
        //       public bool UseOHLC { get; set; }

        [Parameter("Corner for Infos", DefaultValue = 1, MinValue = 0, MaxValue = 4)]
        public int corner { get; set; }

        //       private int end_bar = 0;
        private int start_bar = 0;
        private int oldCurrentDay = 0;

        public StaticPosition corner_position;
        public int CurrentDay = 0;

        public override void Calculate(int index)
        {
            switch (corner)
            {
                case 1:
                    corner_position = StaticPosition.TopLeft;
                    break;
                case 2:
                    corner_position = StaticPosition.TopRight;
                    break;
                case 3:
                    corner_position = StaticPosition.BottomLeft;
                    break;
                case 4:
                    corner_position = StaticPosition.BottomRight;
                    break;
            }
            int end_bar = index;
            int CurrentDay = MarketSeries.OpenTime[end_bar].DayOfYear;
            double TotalPV = 0;
            double TotalVolume = 0;
            double highest = 0;
            double lowest = 999999;
            double close = MarketSeries.Close[index];

            if (CurrentDay == oldCurrentDay)
            {
                for (int i = start_bar; i <= end_bar; i++)
                {
                    TotalPV += MarketSeries.TickVolume[i] * ((MarketSeries.Low[i] + MarketSeries.High[i] + MarketSeries.Close[i]) / 3);
                    TotalVolume += MarketSeries.TickVolume[i];
                    VWAP[i] = TotalPV / TotalVolume;

                    if (MarketSeries.High[i] > highest)
                    {
                        highest = MarketSeries.High[i];
                    }
                    if (MarketSeries.Low[i] < lowest)
                    {
                        lowest = MarketSeries.Low[i];
                    }

                    double SD = 0;
                    for (int k = start_bar; k <= i; k++)
                    {

                        double HLC = (MarketSeries.High[k] + MarketSeries.Low[k] + MarketSeries.Close[k]) / 3;
                        double OHLC = (MarketSeries.High[k] + MarketSeries.Low[k] + MarketSeries.Open[k] + MarketSeries.Close[k]) / 4;

                        double avg = HLC;
                        double diff = avg - VWAP[i];
                        SD += (MarketSeries.TickVolume[k] / TotalVolume) * (diff * diff);
                    }

                    SD = Math.Sqrt(SD);

                    if (corner != 0)
                        ChartObjects.DrawText("show", "vWap " + Math.Round(VWAP[index], 5), corner_position);

                    if (ShowDiviation)
                    {
//                        ChartObjects.DrawText("sda", "SD: " + (SD), 0);
//                        ChartObjects.DrawText("sdb", "SD: " + (VWAP[index]), 0);
//                        ChartObjects.DrawText("sdc", "SD: " + (close), 0);

                        double SD_Pos = VWAP[i] + SD;
                        double SD_Neg = VWAP[i] - SD;
                        double SD2Pos = SD_Pos + SD;
                        double SD2Neg = SD_Neg - SD;

                        SD3Pos[i] = SD2Pos + SD;
                        SD3Neg[i] = SD2Neg - SD;
                    }
                    if (!ShowHistoricalvWap)
                    {
                        //  VWAP[index] = sum / start_bar - i;
                        if (i < index - 15)
                        {
                            VWAP[i] = double.NaN;
                        }
                    }
                }
            }
            else
            {
                if (!ShowHistoricalvWap)
                {
                    for (int i = index - 16; i <= index; i++)
                    {
                        VWAP[i] = double.NaN;
                    }
                }
                oldCurrentDay = MarketSeries.OpenTime[end_bar].DayOfYear;
                start_bar = end_bar - TimeOffset;
            }

            return;
        }
    }
}
Comments
0