Not able to double the volume in unsuccessful trade and half the volume in successful trade with a minimum threshold value
Created at 03 May 2023, 10:37
            
    AS
    
        
            Not able to double the volume in unsuccessful trade and half the volume in successful trade with a minimum threshold value
            
                 03 May 2023, 10:37
            
                    
using System;
using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class BuiltInSuperTrendTrading : Robot
    {
        [Parameter("ATR Period", DefaultValue = 14)]
        public int AtrPeriod { get; set; }
        [Parameter("Multiplier", DefaultValue = 3.0)]
        public double Multiplier { get; set; }
        [Parameter("Take Profit (pips)", DefaultValue = 20)]
        public int TakeProfit { get; set; }
        [Parameter("Stop Loss (pips)", DefaultValue = 20)]
        public int StopLoss { get; set; }
        [Parameter("Volume", DefaultValue = 10000, MinValue = 0)]
        public int Volume { get; set; }
        [Parameter("Lowest Volume Threshold", DefaultValue = 1000, MinValue = 0)]
        public int LowestVolumeThreshold { get; set; }
        private Supertrend _superTrend;
        private TradeType? _lastTradeType;
        protected override void OnStart()
        {
            _superTrend = Indicators.Supertrend(AtrPeriod, Multiplier);
            Positions.Closed += OnPositionsClosed;
        }
        protected override void OnBar()
        {
            if (_superTrend.UpTrend.LastValue > 0 && (!_lastTradeType.HasValue || _lastTradeType.Value == TradeType.Sell))
            {
                ClosePreviousPositions();
                OpenLongPosition();
                _lastTradeType = TradeType.Buy;
            }
            else if (_superTrend.DownTrend.LastValue > 0 && (!_lastTradeType.HasValue || _lastTradeType.Value == TradeType.Buy))
            {
                ClosePreviousPositions();
                OpenShortPosition();
                _lastTradeType = TradeType.Sell;
            }
        }
        private void OnPositionsClosed(PositionClosedEventArgs obj)
        {
            if (obj.Position.Label == "BuiltInSuperTrendTrading")
            {
                if (obj.Position.NetProfit < 0)
                {
                    // Close all other positions
                    foreach (var position in Positions)
                    {
                        if (position.SymbolName == SymbolName && position.Label == "BuiltInSuperTrendTrading")
                        {
                            ClosePosition(position);
                        }
                    }
                }
                // Adjust volume based on the net profit of the closed position
                SetNewVolume(obj.Position.NetProfit > 0);
            }
        }
        private void ClosePreviousPositions()
        {
            foreach (var position in Positions)
            {
                if (position.Label == "BuiltInSuperTrendTrading")
                {
                    ClosePosition(position);
                }
            }
        }
        private void OpenLongPosition()
        {
            ExecuteMarketOrder(TradeType.Buy, SymbolName, Volume, "BuiltInSuperTrendTrading", StopLoss, TakeProfit);
        }
        private void OpenShortPosition()
        {
            ExecuteMarketOrder(TradeType.Sell, SymbolName, Volume, "BuiltInSuperTrendTrading", StopLoss, TakeProfit);
        }
        private void SetNewVolume(bool lastTradeWasSuccessful)
        {
            if (lastTradeWasSuccessful)
            {
                Volume = (int)Math.Ceiling(Volume / 2.0);
            }
            else
            {
                Volume = (int)Math.Ceiling(Volume * 2.0);
            }
            if (Volume < LowestVolumeThreshold)
            {
                Volume = LowestVolumeThreshold;
            }
        }
    }
}
