Sugestão para o código que criei para cbots

Created at 15 Mar 2024, 12:19
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!
IT

italloryan

Joined 15.03.2024

Sugestão para o código que criei para cbots
15 Mar 2024, 12:19


Bom dia! Eu gostaria de uma sugestão para meu código, ele não apresentou nenhum erro, mas no backtest não abriu nenhuma ordem. Segue o meu código:

 

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

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class BullishBearishDetector : Robot
    {
        [Parameter("Lot Size", DefaultValue = 100000, MinValue = 0)]
        public int LotSize { get; set; }

        private DirectionalMovementSystem _dms;
        private MovingAverage _maFast, _maSlow;
        private int _periodDMS = 14;
        private int _periodFastMA = 50;
        private int _periodSlowMA = 200;
        private double _highestBullishBarPrice = double.MinValue;
        private double _lowestBearishBarPrice = double.MaxValue;
        private double _stopLoss, _takeProfit;

        protected override void OnStart()
        {
            // Inicialize o sistema de movimento direcional e as médias móveis
            _dms = Indicators.DirectionalMovementSystem(_periodDMS);
            _maFast = Indicators.MovingAverage(Bars.ClosePrices, _periodFastMA, MovingAverageType.Simple);
            _maSlow = Indicators.MovingAverage(Bars.ClosePrices, _periodSlowMA, MovingAverageType.Simple);
        }

        protected override void OnBar()
        {
            // Verifique se o indicador -DI cruzou acima do +DI
            bool isDIMinusCrossAbove = _dms.DIMinus.Last(1) < _dms.DIPlus.Last(1) && _dms.DIMinus.LastValue > _dms.DIPlus.LastValue;

            // Verifique se a média móvel rápida cruzou abaixo da média móvel lenta
            bool isFastMACrossBelow = _maFast.Result.Last(1) > _maSlow.Result.Last(1) && _maFast.Result.LastValue < _maSlow.Result.LastValue;

            // Se ambas as condições forem verdadeiras, identificamos uma mudança de bullish para bearish
            if (isDIMinusCrossAbove && isFastMACrossBelow)
            {
                _lowestBearishBarPrice = Bars.LowPrices.LastValue;
                _stopLoss = Symbol.Ask - _lowestBearishBarPrice;
                
                // Verifique se o preço tocou o início do candle de venda mais baixo do movimento bearish
                if (Bars.LowPrices.LastValue <= _lowestBearishBarPrice)
                {
                    // Execute uma ordem de compra no mercado
                    var tradeResult = ExecuteMarketOrder(TradeType.Buy, SymbolName, LotSize);

                    if (tradeResult.IsSuccessful)
                    {
                        _takeProfit = 3 * _stopLoss;

                        // Modifique a posição com o novo stop loss e take profit
                        var modifyResult = ModifyPosition(tradeResult.Position, _stopLoss, _takeProfit);

                        // Verifique se a modificação foi bem-sucedida
                        if (!modifyResult.IsSuccessful)
                        {
                            Print("Falha ao modificar a posição: ", modifyResult.Error);
                        }
                    }
                }
            }
            else
            {
                _lowestBearishBarPrice = double.MaxValue;
            }

            // Verifique se o indicador +DI cruzou acima do -DI
            bool isDIPlusCrossAbove = _dms.DIPlus.Last(1) < _dms.DIMinus.Last(1) && _dms.DIPlus.LastValue > _dms.DIMinus.LastValue;

            // Verifique se a média móvel rápida cruzou acima da média móvel lenta
            bool isFastMACrossAbove = _maFast.Result.Last(1) < _maSlow.Result.Last(1) && _maFast.Result.LastValue > _maSlow.Result.LastValue;

// Se ambas as condições forem verdadeiras, identificamos uma mudança de bearish para bullish
            if (isDIPlusCrossAbove && isFastMACrossAbove)
            {
                _highestBullishBarPrice = Bars.HighPrices.LastValue;
                _stopLoss = _highestBullishBarPrice - Symbol.Bid;
                
                // Verifique se o preço tocou o início do candle de compra mais alto do movimento bullish
                if (Bars.HighPrices.LastValue >= _highestBullishBarPrice)
                {
                    // Execute uma ordem de venda no mercado
                    var tradeResult = ExecuteMarketOrder(TradeType.Sell, SymbolName, LotSize);

                    if (tradeResult.IsSuccessful)
                    {
                        _takeProfit = 3 * _stopLoss;

                        // Modifique a posição com o novo stop loss e take profit
                        var modifyResult = ModifyPosition(tradeResult.Position, _stopLoss, _takeProfit);

                        // Verifique se a modificação foi bem-sucedida
                        if (!modifyResult.IsSuccessful)
                        {
                            Print("Falha ao modificar a posição: ", modifyResult.Error);
                        }
                    }
                }
            }
            else
            {
                _highestBullishBarPrice = double.MinValue;
            }
        }
    }
}


@italloryan