Ichimoku cBot with Triling Stop

Created at 21 Jun 2018, 11:15
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!
VertoTrading's avatar

VertoTrading

Joined 18.06.2018

Ichimoku cBot with Triling Stop
21 Jun 2018, 11:15


Hi Guys,

Looking for som help. i am tryin gto add a trailing stop to my cBot. it was backtesting before, but now it is no longer placing any trades. Could someone please have a glance over and see what the problem is?

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

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class IchimokucBotTrailingStopLoss : Robot
    {
        //Ichimoku Settings - NOT BE BE CHANGED UNLESS YOU KNOW WHAT YOU ARE DOING
        [Parameter(DefaultValue = 9)]
        private int periodFast { get; set; }
        [Parameter(DefaultValue = 26)]
        private int periodMedium { get; set; }
        [Parameter(DefaultValue = 52)]
        private int periodSlow { get; set; }
        //

        //Default Pip Value
        [Parameter(" Volume Size", DefaultValue = 1000)]
        public int Volume { get; set; }
        //

        //Stop Losses and Take Profit in Pip Value
        [Parameter("Stop Loss", DefaultValue = 20)]
        public int StopLossPips { get; set; }
        [Parameter("Take Profit", DefaultValue = 25)]
        public int TakeProfitPips { get; set; }
        //

        //Trailing Stop Loss Settings
        [Parameter("Trigger When Gaining", DefaultValue = 1)]
        public double TriggerWhenGaining { get; set; }
        [Parameter("Trailing Stop Loss Distance", DefaultValue = 1)]
        public double TrailingStopLossDistance { get; set; }

        private double _highestGain;
        private bool _isTrailing;
        //

        IchimokuKinkoHyo ichimoku;

        protected override void OnStart()
        {
            ichimoku = Indicators.IchimokuKinkoHyo(periodFast, periodMedium, periodSlow);
        }

        protected override void OnBar()
        {
            var positionsBuy = Positions.FindAll("Ichimoku cBot");
            var positionsSell = Positions.FindAll("Ichimoku cBot");

            var distanceFromUpKumo = (Symbol.Bid - ichimoku.SenkouSpanA.Last(26)) / Symbol.PipSize;
            var distanceFromDownKumo = (ichimoku.SenkouSpanA.Last(26) - Symbol.Ask) / Symbol.PipSize;


            if (positionsBuy.Length == 0 && positionsSell.Length == 0)
            {
                if (MarketSeries.Open.Last(1) <= ichimoku.SenkouSpanA.Last(27) && MarketSeries.Open.Last(1) > ichimoku.SenkouSpanB.Last(27))
                {
                    if (MarketSeries.Close.Last(1) > ichimoku.SenkouSpanA.Last(27))
                    {
                        if (distanceFromUpKumo <= 30)
                        {
                            ExecuteMarketOrder(TradeType.Buy, Symbol, Volume, "Ichimoku cBot", StopLossPips, TakeProfitPips);
                            _highestGain = Positions[0].Pips;
                        }
                    }
                }

                if (MarketSeries.Open.Last(1) >= ichimoku.SenkouSpanA.Last(27) && MarketSeries.Open.Last(1) < ichimoku.SenkouSpanB.Last(27))
                {
                    if (MarketSeries.Close.Last(1) < ichimoku.SenkouSpanA.Last(27))
                    {
                        if (distanceFromDownKumo <= 30)
                        {
                            ExecuteMarketOrder(TradeType.Sell, Symbol, Volume, "Ichimoku cBot", StopLossPips, TakeProfitPips);
                            _highestGain = Positions[0].Pips;
                        }
                    }
                }
            }
        }

        protected override void OnTick()
        {
            var position = Positions.Find("Ichimoku cBot");

            if (position == null)
            {
                return;
            }
            //If the trigger is reached, the robot starts trailing
            if (!_isTrailing && position.Pips >= TriggerWhenGaining)
            {
                _isTrailing = true;
            }
            //If the cBot is trailing and the profit in pips is at the highest level, we need to readjust the stop loss
            if (_isTrailing && _highestGain < position.Pips)
            {
                //Based on the position's direction, we calculate the new stop loss price and we modify the position
                if (position.TradeType == TradeType.Buy)
                {
                    var newSLprice = Symbol.Ask - (Symbol.PipSize * TrailingStopLossDistance);
                    if (newSLprice > position.StopLoss)
                    {
                        ModifyPosition(position, newSLprice, null);
                    }
                }
                else
                {
                    var newSLprice = Symbol.Bid + (Symbol.PipSize * TrailingStopLossDistance);
                    if (newSLprice < position.StopLoss)
                    {
                        ModifyPosition(position, newSLprice, null);
                    }
                }
                if (position.TradeType == TradeType.Sell)
                {
                    var newSLprice = Symbol.Ask + (Symbol.PipSize * TrailingStopLossDistance);
                    if (newSLprice < position.StopLoss)
                    {
                        ModifyPosition(position, newSLprice, null);
                    }
                }
                else
                {
                    var newSLprice = Symbol.Bid - (Symbol.PipSize * TrailingStopLossDistance);
                    if (newSLprice > position.StopLoss)
                    {
                        ModifyPosition(position, newSLprice, null);
                    }
                }
                //We reset the highest gain
                _highestGain = position.Pips;
            }
        }
    }
}

 


@VertoTrading
Replies

PanagiotisCharalampous
21 Jun 2018, 11:30

Hi sean.n.long,

Thanks for posting in our forum. Note that trailing stop loss is now offered by cAlgo.API, therefore you do not need to program it yourself anymore. Order functions now feature a trailing stop loss parameter. See below

https://ctdn.com/api/reference/robot/executemarketorder

https://ctdn.com/api/reference/robot/placelimitorder

https://ctdn.com/api/reference/robot/placestoporder

https://ctdn.com/api/reference/robot/placestoplimitorder

Let me know if this helps.

Best Regards,

Panagiotis


@PanagiotisCharalampous