Category Other  Published on 13/09/2022

VWAP Midas Buttons

Description

Just a VWAP Midas with 5 Buttons in 1 indicator

See also -->> TPO Profile <<--
See also -->> Weis & Wyckoff System <<--


Usage:
Create VWAP: Click on button and select the bar for VWAP
Remove VWAP: Click the button again when it is activated.

VWAP will be updated with each new bar


/*
--------------------------------------------------------------------------------------------------------------------------------
                      VWAP Midas Buttons
Just a VWAP Midas with 5 Buttons in just 1 indicator

Usage:
Create VWAP: Click on the button and select the bar for the VWAP
Remove VWAP: Click the button again when it is activated.

VWAP will be updated with each new bar

AUTHOR: srlcarlg
----------------------------------------------------------------------------------------------------------------------------
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using cAlgo.API;
using cAlgo.API.Collections;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;

namespace cAlgo
{
    [Indicator(IsOverlay = true, AccessRights = AccessRights.None)]
    public class VWAPMidasButtons : Indicator
    {
        public enum ConfigButtonsData
        {
            Top_Right,
            Top_Left,
            Bottom_Right,
            Bottom_Left,
        }
        
        [Parameter("Buttons Color:", DefaultValue = Colors.LightBlue, Group = "==== VWAP Midas Buttons ====")]
        public Colors RawBtnColor { get; set; }
        
        [Parameter("Buttons Opacity:" , DefaultValue = 50, MinValue = 5, MaxValue = 100, Group = "==== VWAP Midas Buttons ====")]
        public int BtnOpacity { get; set; }
        
        [Parameter("Buttons Position:", DefaultValue = ConfigButtonsData.Top_Right, Group = "==== VWAP Midas Buttons ====")]
        public ConfigButtonsData ConfigButtonsInput { get; set; }
        
        [Parameter("Buttons Orientation:", DefaultValue = Orientation.Horizontal, Group = "==== VWAP Midas Buttons ====")]
        public Orientation BtnOrientation { get; set; }
        
        [Output("Top VWAP", LineColor = "DeepSkyBlue", LineStyle = LineStyle.Solid, PlotType = PlotType.Line)]
        public IndicatorDataSeries TopVWAP { get; set; }
        [Output("Top VWAP 2", LineColor = "DeepSkyBlue", LineStyle = LineStyle.Solid, PlotType = PlotType.Line)]
        public IndicatorDataSeries TopVWAP_2 { get; set; }
        [Output("Top VWAP 3", LineColor = "DeepSkyBlue", LineStyle = LineStyle.Solid, PlotType = PlotType.Line)]
        public IndicatorDataSeries TopVWAP_3 { get; set; }
        [Output("Top VWAP 4", LineColor = "DeepSkyBlue", LineStyle = LineStyle.Solid, PlotType = PlotType.Line)]
        public IndicatorDataSeries TopVWAP_4 { get; set; }
        [Output("Top VWAP 5", LineColor = "DeepSkyBlue", LineStyle = LineStyle.Solid, PlotType = PlotType.Line)]
        public IndicatorDataSeries TopVWAP_5 { get; set; }
        
        [Output("Middle VWAP", LineColor = "LightYellow", LineStyle = LineStyle.Lines, PlotType = PlotType.Line)]
        public IndicatorDataSeries MiddleVWAP { get; set; }
        [Output("Middle VWAP 2", LineColor = "LightYellow", LineStyle = LineStyle.Lines, PlotType = PlotType.Line)]
        public IndicatorDataSeries MiddleVWAP_2 { get; set; }
        [Output("Middle VWAP 3", LineColor = "LightYellow", LineStyle = LineStyle.Lines, PlotType = PlotType.Line)]
        public IndicatorDataSeries MiddleVWAP_3 { get; set; }
        [Output("Middle VWAP 4", LineColor = "LightYellow", LineStyle = LineStyle.Lines, PlotType = PlotType.Line)]
        public IndicatorDataSeries MiddleVWAP_4 { get; set; }
        [Output("Middle VWAP 5", LineColor = "LightYellow", LineStyle = LineStyle.Lines, PlotType = PlotType.Line)]
        public IndicatorDataSeries MiddleVWAP_5 { get; set; }
        
        [Output("Bottom VWAP", LineColor = "Orange", LineStyle = LineStyle.Solid, PlotType = PlotType.Line)]
        public IndicatorDataSeries BottomVWAP { get; set; }
        [Output("Bottom VWAP 2", LineColor = "Orange", LineStyle = LineStyle.Solid, PlotType = PlotType.Line)]
        public IndicatorDataSeries BottomVWAP_2 { get; set; }
        [Output("Bottom VWAP 3", LineColor = "Orange", LineStyle = LineStyle.Solid, PlotType = PlotType.Line)]
        public IndicatorDataSeries BottomVWAP_3 { get; set; }
        [Output("Bottom VWAP 4", LineColor = "Orange", LineStyle = LineStyle.Solid, PlotType = PlotType.Line)]
        public IndicatorDataSeries BottomVWAP_4 { get; set; }
        [Output("Bottom VWAP 5", LineColor = "Orange", LineStyle = LineStyle.Solid, PlotType = PlotType.Line)]
        public IndicatorDataSeries BottomVWAP_5 { get; set; }
        
        private int[] btnIndexes = {0,0,0,0,0};
        private bool mouseIsActive;
        private bool btnIsActive;
        private Button currentBtn;
        private ChartVerticalLine verticalLine;
        private IDictionary<int, Button> allButtons = new Dictionary<int, Button>();
        
        protected override void Initialize()
        {
            var btnOpacity = (int)(2.55 * BtnOpacity);
            Color rawColor = Color.FromName(RawBtnColor.ToString());
            var btnColor = Color.FromArgb(btnOpacity, rawColor.R, rawColor.G, rawColor.B);
            
            VerticalAlignment v_align = VerticalAlignment.Bottom;
            HorizontalAlignment h_align = HorizontalAlignment.Left;
            if (ConfigButtonsInput == ConfigButtonsData.Bottom_Right)
                h_align = HorizontalAlignment.Right;
            else if (ConfigButtonsInput == ConfigButtonsData.Top_Left)
                v_align = VerticalAlignment.Top;
            else if (ConfigButtonsInput == ConfigButtonsData.Top_Right)
            {
                v_align = VerticalAlignment.Top;
                h_align = HorizontalAlignment.Right;
            }
            var wrapPanel = new WrapPanel
            {
                HorizontalAlignment = h_align,
                VerticalAlignment = v_align,
                Orientation = BtnOrientation,
            };
            
            for (int i=1; i < 6; i++)
                AddButton(wrapPanel, btnColor, i);
                
            Chart.AddControl(wrapPanel);
            
            Chart.MouseMove += DrawVerticalLine;
            Chart.MouseDown += AddVWAP;
            
            Bars.BarOpened += UpdateVWAP;
            /*
                No comments needed, everything is self explanatory
            */
        }
        private void AddButton(Panel panel, Color btnColor, int btnIndex) 
        {
            Button button = new Button 
            {
                Text = "",
                Padding = 0,
                Width = 22,
                Height = 22,
                Margin = 2,
                BackgroundColor = btnColor
            };

            button.Click += ButtonClick;
            panel.AddChild(button);
            allButtons.Add(btnIndex, button);
        }
        private void ButtonClick(ButtonClickEventArgs obj)
        {
            if (obj.Button.Text != "")
            {
                ClearVWAP(Convert.ToInt32(obj.Button.Text));
                obj.Button.Text = "";
                return;
            }
            btnIsActive=true; 
            currentBtn= obj.Button;
            obj.Button.IsEnabled = false;
            Chart.DrawStaticText("txt", "Select a bar for VWAP.", VerticalAlignment.Top, HorizontalAlignment.Center, Color.Orange);
        }
        public void DrawVerticalLine(ChartMouseEventArgs obj)
        {
            if (btnIsActive)
            {
                mouseIsActive = true;

                if (verticalLine == null)
                    verticalLine = Chart.DrawVerticalLine("VerticalLine", obj.TimeValue, Chart.ColorSettings.ForegroundColor);
                else
                    verticalLine.Time = obj.TimeValue;
                
                verticalLine.IsInteractive = true;
                verticalLine.IsLocked = true;
            }
        }
        
        public void AddVWAP(ChartMouseEventArgs obj)
        {
            if (mouseIsActive == false)
                return;
                
            mouseIsActive = false;
            
            int btnIndex = 0;
            for (int i=1; i < 6; i++)
            {
                if (allButtons[i] == currentBtn)
                {
                    allButtons[i].Text = $"{i}";
                    allButtons[i].IsEnabled = true;
                    btnIndex = i;
                    break;
                }
            }
            
            double sumHigh = 0.0;
            double sumHL2 = 0.0;
            double sumLow = 0.0;
            double sumVol = 0.0;
            for (int j = Bars.OpenTimes.GetIndexByTime(verticalLine.Time); j < Chart.BarsTotal; j++)
            {
                sumHigh += Bars.HighPrices[j] * Bars.TickVolumes[j];
                sumHL2 += Bars.MedianPrices[j] * Bars.TickVolumes[j];
                sumLow += Bars.LowPrices[j] * Bars.TickVolumes[j];
                sumVol += Bars.TickVolumes[j];
                
                switch(btnIndex)
                {
                    case 1:
                        TopVWAP[j] = sumHigh / sumVol;
                        MiddleVWAP[j] = sumHL2 / sumVol;
                        BottomVWAP[j] = sumLow / sumVol;
                        break;
                    case 2:
                        TopVWAP_2[j] = sumHigh / sumVol;
                        MiddleVWAP_2[j] = sumHL2 / sumVol;
                        BottomVWAP_2[j] = sumLow / sumVol;
                        break;
                    case 3:
                        TopVWAP_3[j] = sumHigh / sumVol;
                        MiddleVWAP_3[j] = sumHL2 / sumVol;
                        BottomVWAP_3[j] = sumLow / sumVol;
                        break;
                    case 4:
                        TopVWAP_4[j] = sumHigh / sumVol;
                        MiddleVWAP_4[j] = sumHL2 / sumVol;
                        BottomVWAP_4[j] = sumLow / sumVol;
                        break;
                    case 5:
                        TopVWAP_5[j] = sumHigh / sumVol;
                        MiddleVWAP_5[j] = sumHL2 / sumVol;
                        BottomVWAP_5[j] = sumLow / sumVol;
                        break;
                }
            }
            
            for (int i=1; i < 6; i++)
            {
                if (i == 1 && btnIndexes[0] == 0 && allButtons[i].Text != "")
                    btnIndexes[0] = Bars.OpenTimes.GetIndexByTime(verticalLine.Time);       
                if (i == 2 && btnIndexes[1] == 0 && allButtons[i].Text != "")
                    btnIndexes[1] = Bars.OpenTimes.GetIndexByTime(verticalLine.Time);  
                if (i == 3 && btnIndexes[2] == 0 && allButtons[i].Text != "")
                    btnIndexes[2] = Bars.OpenTimes.GetIndexByTime(verticalLine.Time);  
                if (i == 4 && btnIndexes[3] == 0 && allButtons[i].Text != "")
                    btnIndexes[3] = Bars.OpenTimes.GetIndexByTime(verticalLine.Time);  
                if (i == 5 && btnIndexes[4] == 0 && allButtons[i].Text != "")
                    btnIndexes[4] = Bars.OpenTimes.GetIndexByTime(verticalLine.Time);  
            }
            
            if (verticalLine != null)
            {
                Chart.DrawStaticText("txt", "", VerticalAlignment.Top, HorizontalAlignment.Center, Color.Orange);
                Chart.RemoveObject("VerticalLine");
                Chart.RemoveObject("txt");
                verticalLine = null;
                btnIsActive = false;
            }

        }
        
        private void UpdateVWAP(BarOpenedEventArgs obj)
        {
            int[] btnActives = {0,0,0,0,0};
            for (int i=1; i < 6; i++)
            {
                if (i == 1 && allButtons[i].Text != "")
                    btnActives[0] = 1;       
                if (i == 2 && allButtons[i].Text != "")
                    btnActives[1] = 1;  
                if (i == 3 && allButtons[i].Text != "")
                    btnActives[2] = 1;  
                if (i == 4 && allButtons[i].Text != "")
                    btnActives[3] = 1;  
                if (i == 5 && allButtons[i].Text != "")
                    btnActives[4] = 1;
            }            
            if (btnActives[0] == 1)
            {
                double sumHigh = 0.0;
                double sumHL2 = 0.0;
                double sumLow = 0.0;
                double sumVol = 0.0;
                for (int j = btnIndexes[0]; j < Chart.BarsTotal; j++)
                {
                    sumHigh += Bars.HighPrices[j] * Bars.TickVolumes[j];
                    sumHL2 += Bars.MedianPrices[j] * Bars.TickVolumes[j];
                    sumLow += Bars.LowPrices[j] * Bars.TickVolumes[j];
                    sumVol += Bars.TickVolumes[j];
                    
                    TopVWAP[j] = sumHigh / sumVol;
                    MiddleVWAP[j] = sumHL2 / sumVol;
                    BottomVWAP[j] = sumLow / sumVol;
                }
            }
            if (btnActives[1] == 1)
            {
                double sumHigh = 0.0;
                double sumHL2 = 0.0;
                double sumLow = 0.0;
                double sumVol = 0.0;
                for (int j = btnIndexes[1]; j < Chart.BarsTotal; j++)
                {
                    sumHigh += Bars.HighPrices[j] * Bars.TickVolumes[j];
                    sumHL2 += Bars.MedianPrices[j] * Bars.TickVolumes[j];
                    sumLow += Bars.LowPrices[j] * Bars.TickVolumes[j];
                    sumVol += Bars.TickVolumes[j];
                    
                    TopVWAP_2[j] = sumHigh / sumVol;
                    MiddleVWAP_2[j] = sumHL2 / sumVol;
                    BottomVWAP_2[j] = sumLow / sumVol;
                }
            }
            if (btnActives[2] == 1)
            {
                double sumHigh = 0.0;
                double sumHL2 = 0.0;
                double sumLow = 0.0;
                double sumVol = 0.0;
                for (int j = btnIndexes[2]; j < Chart.BarsTotal; j++)
                {
                    sumHigh += Bars.HighPrices[j] * Bars.TickVolumes[j];
                    sumHL2 += Bars.MedianPrices[j] * Bars.TickVolumes[j];
                    sumLow += Bars.LowPrices[j] * Bars.TickVolumes[j];
                    sumVol += Bars.TickVolumes[j];
                    
                    TopVWAP_3[j] = sumHigh / sumVol;
                    MiddleVWAP_3[j] = sumHL2 / sumVol;
                    BottomVWAP_3[j] = sumLow / sumVol;
                }
            }
            if (btnActives[3] == 1)
            {
                double sumHigh = 0.0;
                double sumHL2 = 0.0;
                double sumLow = 0.0;
                double sumVol = 0.0;
                for (int j = btnIndexes[3]; j < Chart.BarsTotal; j++)
                {
                    sumHigh += Bars.HighPrices[j] * Bars.TickVolumes[j];
                    sumHL2 += Bars.MedianPrices[j] * Bars.TickVolumes[j];
                    sumLow += Bars.LowPrices[j] * Bars.TickVolumes[j];
                    sumVol += Bars.TickVolumes[j];
                    
                    TopVWAP_4[j] = sumHigh / sumVol;
                    MiddleVWAP_4[j] = sumHL2 / sumVol;
                    BottomVWAP_4[j] = sumLow / sumVol;
                }
            }
            if (btnActives[4] == 1)
            {
                double sumHigh = 0.0;
                double sumHL2 = 0.0;
                double sumLow = 0.0;
                double sumVol = 0.0;
                for (int j = btnIndexes[4]; j < Chart.BarsTotal; j++)
                {
                    sumHigh += Bars.HighPrices[j] * Bars.TickVolumes[j];
                    sumHL2 += Bars.MedianPrices[j] * Bars.TickVolumes[j];
                    sumLow += Bars.LowPrices[j] * Bars.TickVolumes[j];
                    sumVol += Bars.TickVolumes[j];
                    
                    TopVWAP_5[j] = sumHigh / sumVol;
                    MiddleVWAP_5[j] = sumHL2 / sumVol;
                    BottomVWAP_5[j] = sumLow / sumVol;
                }
            }
        }
        
        private void ClearVWAP(int btnIndex)
        {
            for (int i = 0; i < Chart.BarsTotal; i++)
            {
                 switch(btnIndex)
                {
                    case 1:
                        btnIndexes[0] = 0;
                        TopVWAP[i] = double.NaN;
                        MiddleVWAP[i] = double.NaN;
                        BottomVWAP[i] = double.NaN;
                        break;
                    case 2:
                        btnIndexes[1] = 0;
                        TopVWAP_2[i] = double.NaN;
                        MiddleVWAP_2[i] = double.NaN;
                        BottomVWAP_2[i] = double.NaN;
                        break;
                    case 3:
                        btnIndexes[2] = 0;
                        TopVWAP_3[i] = double.NaN;
                        MiddleVWAP_3[i] = double.NaN;
                        BottomVWAP_3[i] = double.NaN;
                        break;
                    case 4:
                        btnIndexes[3] = 0;
                        TopVWAP_4[i] = double.NaN;
                        MiddleVWAP_4[i] = double.NaN;
                        BottomVWAP_4[i] = double.NaN;
                        break;
                    case 5:
                        btnIndexes[4] = 0;
                        TopVWAP_5[i] = double.NaN;
                        MiddleVWAP_5[i] = double.NaN;
                        BottomVWAP_5[i] = double.NaN;
                        break;
                }
            }
        }
        public override void Calculate(int index)
        {
            // Really?
        }
    }
}

srlcarlg's avatar
srlcarlg

Joined on 25.07.2022

  • Distribution: Free
  • Language: C#
  • Trading platform: cTrader Automate
  • File name: VWAP Midas Buttons.algo
  • Rating: 5
  • Installs: 809
  • Modified: 26/10/2023 00:48
Comments
Log in to add a comment.
SE
serebryana3 · 8 months ago

This is magical… 

TommyDee's avatar
TommyDee · 1 year ago

Thank you for this indicator.
Would it be possible for you to fix the time frame bug please?
If I change time frames or if I scroll or zoom within the same time frame, the vwap markings dissapear.
 

JE
jestebansuarez · 1 year ago

Great indicator, thanks so much! any chance to make it stick (redraw) when switching to a different time frame?

That would be amazing!

Cheers,