Category Other  Published on 27/10/2021

Today & Live Profit v2

Description

Show live trading profit, profit percentage

Show daily profit net and daily percentage

Show equity 

You can also choose to have the indicator displayed on the main Chart or in the bottom windows

Changes in this version

Fix Bug

Decrease parameters

Better display



using System;
using System.Linq;
using cAlgo.API;

namespace cAlgo.Indicators
{
    [Indicator(IsOverlay = true, TimeZone = TimeZones.IranStandardTime, AccessRights = AccessRights.None)]
    public class TodayProfitV2 : Indicator
    {
        [Parameter("SubWindows", DefaultValue = 0, MinValue = 0, Group = "Text")]
        public int SubWindows { get; set; }

        [Parameter("Font Size", DefaultValue = 12, Group = "Text")]
        public int FontSize { get; set; }

        [Parameter("Font Weight", DefaultValue = 11, Group = "Text")]
        public FontWeight FontWeight1 { get; set; }

        [Parameter("Shift", DefaultValue = "4 3 0 0", Group = "Text")]
        public string ShiftText { get; set; }

        [Parameter("Text Alignment", DefaultValue = TextAlignment.Left, Group = "Text")]
        public TextAlignment Alignment { get; set; }

        [Parameter("Today", DefaultValue = "White", Group = "Text Color")]
        public string TodayColor { get; set; }

        [Parameter("Positive Live", DefaultValue = "Green", Group = "Text Color")]
        public string PositiveColor { get; set; }

        [Parameter("Negative Live", DefaultValue = "Red", Group = "Text Color")]
        public string NegativeColor { get; set; }


        private TextBlock[] textblock = new TextBlock[3];
        private static bool Hide;
        private StackPanel ProfitPanel;
        private ToggleButton togglebutton;
        private bool One = false;
        private double StartingBalance = 0, DailyNetHistory = 0;


        protected override void Initialize()
        {
            var AllPanel = new DockPanel 
            {
                VerticalAlignment = VerticalAlignment.Bottom,
                HorizontalAlignment = HorizontalAlignment.Right,
                BackgroundColor = Chart.ColorSettings.BackgroundColor
            };

            togglebutton = new ToggleButton 
            {
                Text = "☰",
                Dock = Dock.Right,
                FontSize = 13,
                FontWeight = FontWeight.Bold,
                VerticalAlignment = VerticalAlignment.Bottom,
                Width = 21,
                Height = 21,
                Margin = 4,
                Padding = 1
            };
            togglebutton.Click += ToggleButton_Click;
            AllPanel.AddChild(togglebutton);

            ProfitPanel = new StackPanel 
            {
                Margin = "0 0 2 5",
                Dock = Dock.Right
            };

            for (int i = 0; i < 3; i++)
            {
                textblock[i] = new TextBlock 
                {
                    FontSize = FontSize,
                    FontWeight = FontWeight1,
                    TextAlignment = Alignment,
                    Margin = ShiftText
                };
                ProfitPanel.AddChild(textblock[i]);
            }
            textblock[2].ForegroundColor = TodayColor;
            AllPanel.AddChild(ProfitPanel);

            if (SubWindows > Chart.IndicatorAreas.Count)
                SubWindows = Chart.IndicatorAreas.Count;
            if (SubWindows > 0)
                Chart.IndicatorAreas[SubWindows - 1].AddControl(AllPanel);
            else
                Chart.AddControl(AllPanel);
            //DailyProfit
            if (History.Count > 0)
                DailyNetHistory = History.Where(x => x.ClosingTime.Date == Time.Date).Sum(x => x.NetProfit);
            var oldTrades = History.Where(x => x.ClosingTime.Date != Time.Date).OrderBy(x => x.ClosingTime).ToArray();
            if (oldTrades.Length > 0)
                StartingBalance = History.Where(x => x.ClosingTime.Date != Time.Date).OrderBy(x => x.ClosingTime).Last().Balance;

            if (Positions.Count > 0 && Hide == false)
                Timer.Start(TimeSpan.FromMilliseconds(500));
            else
                DailyProfit();

            if (Hide == true)
            {
                togglebutton.IsChecked = true;
                ProfitPanel.IsVisible = false;
            }

            Positions.Opened += Positions_Opened;
            Positions.Closed += Positions_Closed;
        }


        private void Positions_Opened(PositionOpenedEventArgs obj)
        {
            if (Positions.Count == 1 && Hide == false)
                Timer.Start(TimeSpan.FromMilliseconds(500));
        }


        private void Positions_Closed(PositionClosedEventArgs obj)
        {
            DailyNetHistory = History.Where(x => x.ClosingTime.Date == Time.Date).Sum(x => x.NetProfit);
            if (Positions.Count == 0 && Hide == false)
            {
                Timer.Stop();
                DailyProfit();
            }
        }


        protected override void OnTimer()
        {
            LiveProfit();
            DailyProfit();
        }


        private void ToggleButton_Click(ToggleButtonEventArgs obj)
        {
            if (ProfitPanel.IsVisible == false)
            {
                togglebutton.IsChecked = false;
                Hide = false;
                ProfitPanel.IsVisible = true;
                if (Positions.Count > 0)
                    Timer.Start(TimeSpan.FromMilliseconds(500));
            }

            else
            {
                togglebutton.IsChecked = true;
                Hide = true;
                ProfitPanel.IsVisible = false;
                if (Positions.Count > 0)
                    Timer.Stop();
            }
        }


        public override void Calculate(int index)
        {
        }


        private void DailyProfit()
        {
            //Calc daily Net Profit
            double DailyNetLive = Positions.Sum(p => p.NetProfit);
            var DailyNet = Math.Round(DailyNetLive + DailyNetHistory, 2);
            // get Starting Balance
            if (StartingBalance == 0)
                StartingBalance = Account.Balance - DailyNetHistory;
            //calc Daily Percent Profit
            var DailyPercent = Math.Round(DailyNet / StartingBalance * 100, 2);

            var Space = "";
            if (DailyNet >= 0)
                Space = " ";
            textblock[2].Text = string.Format("Today: $ {0}{1:#,##0.00}/ {0}{2:#,##0.00}%", Space, DailyNet, DailyPercent);


            if (One == false)
            {
                if (DailyNet == 0 && Positions.Count == 0 && ProfitPanel.IsVisible == true)
                {
                    togglebutton.IsChecked = true;
                    ProfitPanel.IsVisible = false;
                }

                else if ((DailyNet > 0 || Positions.Count > 0) && ProfitPanel.IsVisible == false && Hide == false)
                {
                    togglebutton.IsChecked = false;
                    ProfitPanel.IsVisible = true;
                }

                One = true;
            }
        }


        private void LiveProfit()
        {
            var netProfit = Account.UnrealizedNetProfit;
            var PercentProfit = Math.Round(netProfit / Account.Balance * 100, 2);

            var Space = "";
            var netclr = TodayColor;
            //negative
            if (netProfit < 0)
                netclr = NegativeColor;
            //positive && Zero
            else
            {
                netclr = PositiveColor;
                Space = " ";
            }

            textblock[0].Text = string.Format("Live: $ {0}{1:#,##0.00}/ {0}{2:#,##0.00}%", Space, netProfit, PercentProfit);
            textblock[0].ForegroundColor = netclr;

            textblock[1].Text = string.Format("Equity: $ {0:#,##0.00}", Account.Equity);
            textblock[1].ForegroundColor = netclr;
        }
    }
}


AM
Amin.fx

Joined on 02.08.2021

  • Distribution: Free
  • Language: C#
  • Trading platform: cTrader Automate
  • File name: TodayProfit v2.algo
  • Rating: 5
  • Installs: 1990
Comments
Log in to add a comment.
MA
marcoraja · 1 year ago

Hi thanks for sharing such a good indicator, it saved me a lot of time to build my own stop loss rules.

 

I suggest to double check the DailyNetHistory calculation, I think it would be triggered not on position close but every time you calculate DailyNet, so when day finish at midnight, it will be reset while actually it will be refreshed (recalculated) ONLY AFTER the closing of the first position ot the day.

Do you agree ?

Thanks a lot for your indicator