Very simple CCI bot but entries are not accurate

Created at 07 May 2015, 09:09
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!
FR

Fran_Petraroli

Joined 07.05.2015

Very simple CCI bot but entries are not accurate
07 May 2015, 09:09


Hi all, i am coding my first bot mostly as learning experience.

My first bot simply sell when the CCI cross below 100 level and buy when it crosses above -100.

The bot works and opens positions, the problem is that studying the backtesting the entry are not accurate.

Sometimes the cci never cross 100/-100 level and the bot opens a position, some other time is late few bars.

Maybe some of you know a solution to this.

I appreciate any help, Thanks

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

namespace cAlgo.Robots
{
    [Robot(AccessRights = AccessRights.None)]
    public class CciBot : Robot
    {
        private CommodityChannelIndex _cci;

        [Parameter(DefaultValue = 10000, MinValue = 0)]
        public int Volume { get; set; }

        [Parameter("Period", DefaultValue = 20)]
        public int CciPeriod { get; set; }

        [Parameter("Stop Loss", DefaultValue = 10.0)]
        public double StopLoss { get; set; }

        [Parameter("Take Profit", DefaultValue = 20.0)]
        public double TakeProfit { get; set; }

        [Parameter("Starting Lot", DefaultValue = 0.1, MinValue = 0.01, Step = 0.01)]
        public double Lot { get; set; }


        protected override void OnStart()
        {
            //Initialise CCi
            _cci = Indicators.CommodityChannelIndex(CciPeriod);
        }

        protected override void OnBar()
        {
            var volumeInUnits = Symbol.QuantityToVolume(Lot);
            if (Positions.Count != 0)
                return;


            if (_cci.Result.HasCrossedBelow(200, 1))
            {
               
                ExecuteMarketOrder(TradeType.Sell, Symbol, volumeInUnits, "buy", StopLoss, TakeProfit);
            }

            if (_cci.Result.HasCrossedAbove(-200, 1))
            {
               
                ExecuteMarketOrder(TradeType.Buy, Symbol, volumeInUnits, "sell", StopLoss, TakeProfit);
            }
        }
    }

 


@Fran_Petraroli
Replies

Fran_Petraroli
07 May 2015, 09:27

Sorry for the few mistakes in the code as i was testing different parameter, however the problem persist.


@Fran_Petraroli

bosma
11 May 2015, 09:07

/api/reference/functions/hascrossedabove-304a

Functions.HasCrossedAbove(_cci.Result, 200, 1)

or

_cci.Result.HasCrossedAbove(200, 1)

@bosma