Category Other  Published on 26/01/2023

Measure Tool

Description

This indicator allows you to measure an area of chart in terms of number of bars, amount of time, price delta, price percentage change, and volume.

Measure Tool is an open source indicator, if you want to contribute check our Github: spotware/Measure-Tool: cTrader chart measuring tool (github.com)

Changelog:

Version 1.2.0.0

Release Date: January 26, 2023

Changed: String color parameters to new Color type parameter

Note: This version only works on cTrader 4.6 or above.

Version 1.1.0.0

Release Date: December 20, 2022

Fixed: Issues with new versions of cTrader

Changed: Target framework from .NET 4 to 6


using cAlgo.API;
using cAlgo.Controls;
using cAlgo.Helpers;
using cAlgo.Patterns;
using System.Collections.Generic;

namespace cAlgo
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.UTC, AccessRights = AccessRights.FullAccess)]
    public class MeasureTool : Indicator
    {
        private StackPanel _mainButtonsPanel;

        private StackPanel _mainPanel;

        private Style _buttonsStyle;

        private readonly List<Button> _buttons = new();

        #region Container Panel parameters

        [Parameter("Orientation", DefaultValue = Orientation.Vertical, Group = "Container Panel")]
        public Orientation PanelOrientation { get; set; }

        [Parameter("Horizontal Alignment", DefaultValue = HorizontalAlignment.Left, Group = "Container Panel")]
        public HorizontalAlignment PanelHorizontalAlignment { get; set; }

        [Parameter("Vertical Alignment", DefaultValue = VerticalAlignment.Top, Group = "Container Panel")]
        public VerticalAlignment PanelVerticalAlignment { get; set; }

        [Parameter("Margin", DefaultValue = 3, Group = "Container Panel")]
        public double PanelMargin { get; set; }

        #endregion Container Panel parameters

        #region Buttons parameters

        [Parameter("Disable Color", DefaultValue = "#FFCCCCCC", Group = "Buttons")]
        public Color ButtonsBackgroundDisableColor { get; set; }

        [Parameter("Enable Color", DefaultValue = "Red", Group = "Buttons")]
        public Color ButtonsBackgroundEnableColor { get; set; }

        [Parameter("Text Color", DefaultValue = "Blue", Group = "Buttons")]
        public Color ButtonsForegroundColor { get; set; }

        [Parameter("Margin", DefaultValue = 1, Group = "Buttons")]
        public double ButtonsMargin { get; set; }

        [Parameter("Transparency", DefaultValue = 0.5, MinValue = 0, MaxValue = 1, Group = "Buttons")]
        public double ButtonsTransparency { get; set; }

        #endregion Buttons parameters

        #region TimeFrame Visibility parameters

        [Parameter("Enable", DefaultValue = false, Group = "TimeFrame Visibility")]
        public bool IsTimeFrameVisibilityEnabled { get; set; }

        [Parameter("TimeFrame", Group = "TimeFrame Visibility")]
        public TimeFrame VisibilityTimeFrame { get; set; }

        [Parameter("Only Buttons", Group = "TimeFrame Visibility")]
        public bool VisibilityOnlyButtons { get; set; }

        #endregion TimeFrame Visibility parameters

        #region Measure parameters

        [Parameter("Up Color", DefaultValue = "700070C0", Group = "Measure")]
        public Color MeasureUpColor { get; set; }

        [Parameter("Down Color", DefaultValue = "70FE0000", Group = "Measure")]
        public Color MeasureDownColor { get; set; }
        
        [Parameter("Thickness", DefaultValue = 1, Group = "Measure")]
        public int MeasureThickness { get; set; }

        [Parameter("Style", DefaultValue = LineStyle.Solid, Group = "Measure")]
        public LineStyle MeasureStyle { get; set; }

        [Parameter("Filled", DefaultValue = true, Group = "Measure")]
        public bool MeasureIsFilled { get; set; }

        [Parameter("Text Color", DefaultValue = "Yellow", Group = "Measure")]
        public Color MeasureTextColor { get; set; }

        [Parameter("Font Size", DefaultValue = 10, Group = "Measure")]
        public int MeasureFontSize { get; set; }

        [Parameter("Text Bold", DefaultValue = true, Group = "Measure")]
        public bool MeasureIsTextBold { get; set; }

        #endregion Measure parameters

        #region Overridden methods

        protected override void Initialize()
        {
            _mainPanel = new StackPanel
            {
                HorizontalAlignment = PanelHorizontalAlignment,
                VerticalAlignment = PanelVerticalAlignment,
                Orientation = PanelOrientation == Orientation.Horizontal ? Orientation.Vertical : Orientation.Horizontal,
                BackgroundColor = Color.Transparent,
            };

            _mainButtonsPanel = new StackPanel
            {
                Orientation = PanelOrientation,
                Margin = PanelMargin
            };

            _mainPanel.AddChild(_mainButtonsPanel);
            
            _buttonsStyle = new Style();

            _buttonsStyle.Set(ControlProperty.Margin, ButtonsMargin);
            _buttonsStyle.Set(ControlProperty.BackgroundColor, ButtonsBackgroundDisableColor);
            _buttonsStyle.Set(ControlProperty.ForegroundColor, ButtonsForegroundColor);
            _buttonsStyle.Set(ControlProperty.HorizontalContentAlignment, HorizontalAlignment.Center);
            _buttonsStyle.Set(ControlProperty.VerticalContentAlignment, VerticalAlignment.Center);
            _buttonsStyle.Set(ControlProperty.Opacity, ButtonsTransparency);

            var patternConfig = new PatternConfig(Chart, Color.Transparent, true, Color.Transparent,
                true, true, new Logger(this.GetType().Name, Print));

            AddPatternButton(new MeasurePattern(patternConfig, new MeasureSettings
            {
                Thickness = MeasureThickness,
                Style = MeasureStyle,
                UpColor = MeasureUpColor,
                DownColor = MeasureDownColor,
                TextColor = MeasureTextColor,
                IsFilled = MeasureIsFilled,
                FontSize = MeasureFontSize,
                IsTextBold = MeasureIsTextBold
            }));

            Chart.AddControl(_mainPanel);

            CheckTimeFrameVisibility();
        }

        public override void Calculate(int index)
        {
        }

        #endregion Overridden methods

        private void AddPatternButton(IPattern pattern)
        {
            var button = new PatternButton(pattern)
            {
                Style = _buttonsStyle,
                OnColor = ButtonsBackgroundEnableColor,
                OffColor = ButtonsBackgroundDisableColor,
            };

            _buttons.Add(button);

            _mainButtonsPanel.AddChild(button);

            pattern.Initialize();
        }

        private void CheckTimeFrameVisibility()
        {
            if (IsTimeFrameVisibilityEnabled)
            {
                if (TimeFrame != VisibilityTimeFrame)
                {
                    _mainButtonsPanel.IsVisible = false;

                    if (!VisibilityOnlyButtons) Chart.ChangePatternsVisibility(true);
                }
                else if (!VisibilityOnlyButtons)
                {
                    Chart.ChangePatternsVisibility(false);
                }
            }
        }
    }
}

Spotware's avatar
Spotware

Joined on 23.09.2013

  • Distribution: Free
  • Language: C#
  • Trading platform: cTrader Automate
  • File name: Measure Tool.algo
  • Rating: 0
  • Installs: 1920
  • Modified: 26/01/2023 10:53
Comments
Log in to add a comment.
CT
ctid6933246 · 4 months ago

Would be good if it measured the number of pips and had price labels or fields. Otherwise this is just a box to me. Some may find it useful to count bars or time? Maybe it should be called the “bar count and time measuring tool”?