Max Consecutive Loses Function

Created at 08 Oct 2012, 04:32
How’s your experience with the cTrader Platform?
Your feedback is crucial to cTrader's development. Please take a few seconds to share your opinion and help us improve your trading experience. Thanks!
B0

b0risl33t

Joined 07.10.2012

Max Consecutive Loses Function
08 Oct 2012, 04:32


Hi

 

Is there a function available to get how many consecutive loses been made.

 

Example:

If (consecutiveloses < specifiedconsecutiveloses)

{

execute

}

else

stop()

 

Thanks


@b0risl33t
Replies

b0risl33t
08 Oct 2012, 14:47

bump

any ideas yet?


@b0risl33t

admin
08 Oct 2012, 15:32

Hello,


There is no internal method for counting consecutive losses but you may code one similar to this post: /forum/calgo-reference-samples/62

 

Let us know if this helped.

 

 


@admin

b0risl33t
08 Oct 2012, 15:40

Thanks for quick reply.

I will try and make that work, i will post my results here

 

 

thanks


@b0risl33t

b0risl33t
08 Oct 2012, 16:39

Ok i made this but not sure what i done wrong :( i get a member modefier protected must procede member name and type error. here is code

 

using cAlgo.API;
using cAlgo.API.Indicators;

namespace cAlgo.Robots
{
    [Robot]
    public class MartingaleMA : Robot
    {
        [Parameter("Initial Volume", DefaultValue = 10000, MinValue = 0)]
        public int InitialVolume { get; set; }

        [Parameter("Stop Loss", DefaultValue = 40, MinValue = 0)]
        public int StopLoss { get; set; }

        [Parameter("Take Profit", DefaultValue = 40, MinValue = 0)]
        public int TakeProfit { get; set; }
        
        [Parameter("Max Losses", DefaultValue = 4, MinValue = 1, MaxValue = 10)]
        public int consecutiveLosses {get; set; }


        [Parameter("Source")]
        public DataSeries Source { get; set; }

        [Parameter("Period", DefaultValue = 14, MinValue = 1)]
        public int Period { get; set; }

        [Parameter("Moving Average Type", DefaultValue = MovingAverageType.Simple)]
        public MovingAverageType MovingAverageType { get; set; }

        private Position _position;
        private MovingAverage _movingAverage;
        private _consecutiveLosses
        

        protected override void OnStart()
        {
            _movingAverage = Indicators.MovingAverage(Source, Period, MovingAverageType);            
            ExecuteOrder(InitialVolume, GetTradeCommand());
        }
        
        private void ExecuteOrder(int volume, TradeType tradeType)
        {
            Trade.CreateMarketOrder(tradeType, Symbol, volume);
        }

        protected override void OnPositionOpened(Position openedPosition)
        {
            _position = openedPosition;
            Trade.ModifyPosition(openedPosition, GetAbsoluteStopLoss(openedPosition, StopLoss), GetAbsoluteTakeProfit(openedPosition, TakeProfit));
        }

        private double GetAbsoluteStopLoss(Position pos, int stopLossInPips)
        {
            return pos.TradeType == TradeType.Buy
                ? pos.EntryPrice - Symbol.PipSize * stopLossInPips
                : pos.EntryPrice + Symbol.PipSize * stopLossInPips;
        }

        private double GetAbsoluteTakeProfit(Position pos, int takeProfitInPips)
        {
            return pos.TradeType == TradeType.Buy
                ? pos.EntryPrice + Symbol.PipSize * takeProfitInPips
                : pos.EntryPrice - Symbol.PipSize * takeProfitInPips;
        }

        protected override void OnPositionClosed(Position closedPosition)
        {
            if (closedPosition.GrossProfit < 0)
            {
                
                _consecutiveLosses++;
            }
            else if (closedPosition.GrossProfit > 0)
            {
                
               _consecutiveLosses = 0;
            }
            
            
            else if (closedPosition.GrossProfit > 0)
            {
                ExecuteOrder(InitialVolume, GetTradeCommand());
            }
            else if (_consecutiveLosses < consecutiveLosses)
            {
                ExecuteOrder((int)_position.Volume * 2, GetTradeCommand());
            }
            
            else
            {
            Stop()
            }
            
        }

        private TradeType GetTradeCommand()
        {
            var lastIndex = MarketSeries.Close.Count - 1;
            double close = MarketSeries.Close[lastIndex - 1];
            double lastClose = MarketSeries.Close[lastIndex - 2];
            if (_movingAverage.Result.IsRising() && close > lastClose)
                return TradeType.Buy;
            if (_movingAverage.Result.IsFalling() && close < lastClose) 
                return TradeType.Sell;
            return _position.TradeType;
        }

        protected override void OnError(Error error)
        {
            if (error.Code == ErrorCode.BadVolume)
                Stop();
        }
    }
}



 

Any ideas? 

Thanks


@b0risl33t

admin
08 Oct 2012, 17:51

On Line 33:

private _consecutiveLosses


this is not a proper definition because it is missing the type (i.e. int)

Fix to:

private int _consecutiveLosses;



Line 92:

 Stop() // missing semicolon



Fix to:

 Stop();



Logical error on Line 73:

            else if (closedPosition.GrossProfit > 0)
            {                
               _consecutiveLosses = 0;
            }                        
            else if (closedPosition.GrossProfit > 0)
            {
                ExecuteOrder(InitialVolume, GetTradeCommand());
            }



Please make sure you understand the meaning of an if-else statement:

            if(conditionA)
            {
                // conditionA is true
                // if conditionA is not true execution of the program will not reach this line
            }
            else if(conditionB)
            {
                // this means conditionA is not true and conditionB is true
                // if conditionA is true or conditionB is not true execution of the program will not reach this line                
            }
            else
            {
                // this means that neither conditionA is true nor conditionB is true
                // if conditionA or conditionB is  true execution of the program will not reach this line
            }

 

If you need more help understanding if-else statements please refer to this article: http://msdn.microsoft.com/en-us/library/5011f09h.aspx

Alternatively, you may Google search if-else statements, there are ample examples online.

You may also post a description of what you are trying to accomplish with the if-else statement here.

 

 

 

 

 


@admin

b0risl33t
08 Oct 2012, 18:08

Thank you for the reply

 

I am still learning c++ :P i never even looked at it before 4 days ago. Im still a real newbie but i am willing to learn so thanks for pointing me in the right direction.

What i am trying to achive is for the robot to restart its multiplyer if it has reached say 5 losses, but i want to be able to modify how many losses required with a parameter.

Example

 

InitialVolume

  •  1 lot - Loss
  • 2 lots - Loss
  • 4 lots - Loss
  • 8 Lots - Loss

4 Lots reached now the robot should reset and restart with InitialVolume

 

Hope this makes sense.

In mean time i will try and figure it out.

 

Thank You

 


@b0risl33t

b0risl33t
08 Oct 2012, 19:18

Done It

 

Maybe not the best but it works :d

[Parameter("Max Losses", DefaultValue = 4, MinValue = 1, MaxValue = 10)]
        public int Losses {get; set; }

private int _consecutiveLosses;

protected override void OnPositionClosed(Position closedPosition)
        {
          {
            if (closedPosition.GrossProfit <= closedPosition.Commissions)
            {
              _consecutiveLosses++;
            }
            else 
            {
               _consecutiveLosses = 0;
            }
          }
            if (closedPosition.GrossProfit > 0)
            {
                ExecuteOrder(InitialVolume, GetTradeCommand());
            }
            else if (_consecutiveLosses < Losses)
            {
                ExecuteOrder((int)_position.Volume * 2, GetTradeCommand());
            }
            else
            {
                OnStart();
            }
            
        }




@b0risl33t

admin
09 Oct 2012, 11:38

You should be able to accomplish the same by just calling ExecuteOrder with the InitialVolume.

 

            if (closedPosition.GrossProfit > 0)
            {
                ExecuteOrder(InitialVolume, GetTradeCommand());
            }
            else if (_consecutiveLosses < consecutiveLosses)
            {
                ExecuteOrder((int)_position.Volume * 2, GetTradeCommand());
            }            
            else
            {
                ExecuteOrder(InitialVolume, GetTradeCommand());
            }




@admin

b0risl33t
09 Oct 2012, 15:21

Ohh Yehhh :P

 

Thanks


@b0risl33t