Problem BOT does not open operation in backtest

Created at 25 Jul 2024, 12:21
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!
EM

emafondex69

Joined 25.07.2024

Problem BOT does not open operation in backtest
25 Jul 2024, 12:21


Ho programmato il mio BOT, il codice non mi dà errori e dice che è tutto ok, ma quando lo provo in backtest non mette trade, quindi vorrei capire se è un problema del mio codice o se è del backtest. Se qualcuno può aiutarmi gliene sarei grato 


@emafondex69
Replies

PanagiotisCharalampous
26 Jul 2024, 05:56

Hi there,

Please share your cBot code so that we can check what happens.

Best regards,

Panagiotis


@PanagiotisCharalampous

emafondex69
26 Jul 2024, 12:45 ( Updated at: 28 Jul 2024, 06:43 )

BOT

using cAlgo.API;
using cAlgo.API.Internals;
using System;

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class DailyOrderBot : Robot
    {
        [Parameter("Account Balance", DefaultValue = 10000.0)]
        public double AccountBalance { get; set; }  // Saldo iniziale

        [Parameter("Risk Percentage", DefaultValue = 1.0)]
        public double RiskPercentage { get; set; }  // Percentuale di rischio per trade

        [Parameter("Stop Loss (pips)", DefaultValue = 9)]
        public int StopLoss { get; set; }           // Stop Loss in pips

        [Parameter("Take Profit (pips)", DefaultValue = 0.5)]
        public double TakeProfit { get; set; }      // Take Profit in pips

        private bool hasTradedToday;

        // Ora in cui il bot deve operare (CET)
        private const int OperationHour = 20; // 22:00 CEST è 20:00 UTC

        protected override void OnStart()
        {
            // Resetta il flag all'avvio del bot
            hasTradedToday = false;
        }

        protected override void OnTick()
        {
            // Ottieni l'ora attuale nel fuso orario del server
            DateTime currentTime = Server.Time;
            Print("Current Server Time: ", currentTime);

            // Controlla se sono le 22:00 ora italiana (20:00 UTC)
            if (currentTime.Hour == OperationHour && currentTime.Minute == 0 && !hasTradedToday)
            {
                double riskAmount = AccountBalance * (RiskPercentage / 100);
                double pipValue = Symbol.PipValue;

                // Calcolo della dimensione del lotto (Volume) per rischiare esattamente 100€
                double volume = riskAmount / (pipValue * StopLoss);
                Print("Calculated Volume: ", volume);

                // Esegui l'ordine Buy
                ExecuteMarketOrder(TradeType.Buy, SymbolName, volume, "DailyBuy", StopLoss, TakeProfit);
                Print("Buy order placed at: ", currentTime);

                // Esegui l'ordine Sell
                ExecuteMarketOrder(TradeType.Sell, SymbolName, volume, "DailySell", StopLoss, TakeProfit);
                Print("Sell order placed at: ", currentTime);

                // Imposta il flag per evitare ulteriori trade nello stesso giorno
                hasTradedToday = true;
            }

            // Resetta il flag all'inizio di un nuovo giorno
            if (currentTime.Hour == 0 && currentTime.Minute == 0)
            {
                hasTradedToday = false;
            }
        }

        protected override void OnStop()
        {
            // Codice per gestire la chiusura del bot, se necessario
            Print("Bot stopped at: ", Server.Time);
        }
    }
}


@emafondex69

emafondex69
26 Jul 2024, 12:46 ( Updated at: 28 Jul 2024, 06:43 )

Thank you so mush sir

using cAlgo.API;
using cAlgo.API.Internals;
using System;

namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class DailyOrderBot : Robot
    {
        [Parameter("Account Balance", DefaultValue = 10000.0)]
        public double AccountBalance { get; set; }  // Saldo iniziale

        [Parameter("Risk Percentage", DefaultValue = 1.0)]
        public double RiskPercentage { get; set; }  // Percentuale di rischio per trade

        [Parameter("Stop Loss (pips)", DefaultValue = 9)]
        public int StopLoss { get; set; }           // Stop Loss in pips

        [Parameter("Take Profit (pips)", DefaultValue = 0.5)]
        public double TakeProfit { get; set; }      // Take Profit in pips

        private bool hasTradedToday;

        // Ora in cui il bot deve operare (CET)
        private const int OperationHour = 20; // 22:00 CEST è 20:00 UTC

        protected override void OnStart()
        {
            // Resetta il flag all'avvio del bot
            hasTradedToday = false;
        }

        protected override void OnTick()
        {
            // Ottieni l'ora attuale nel fuso orario del server
            DateTime currentTime = Server.Time;
            Print("Current Server Time: ", currentTime);

            // Controlla se sono le 22:00 ora italiana (20:00 UTC)
            if (currentTime.Hour == OperationHour && currentTime.Minute == 0 && !hasTradedToday)
            {
                double riskAmount = AccountBalance * (RiskPercentage / 100);
                double pipValue = Symbol.PipValue;

                // Calcolo della dimensione del lotto (Volume) per rischiare esattamente 100€
                double volume = riskAmount / (pipValue * StopLoss);
                Print("Calculated Volume: ", volume);

                // Esegui l'ordine Buy
                ExecuteMarketOrder(TradeType.Buy, SymbolName, volume, "DailyBuy", StopLoss, TakeProfit);
                Print("Buy order placed at: ", currentTime);

                // Esegui l'ordine Sell
                ExecuteMarketOrder(TradeType.Sell, SymbolName, volume, "DailySell", StopLoss, TakeProfit);
                Print("Sell order placed at: ", currentTime);

                // Imposta il flag per evitare ulteriori trade nello stesso giorno
                hasTradedToday = true;
            }

            // Resetta il flag all'inizio di un nuovo giorno
            if (currentTime.Hour == 0 && currentTime.Minute == 0)
            {
                hasTradedToday = false;
            }
        }

        protected override void OnStop()
        {
            // Codice per gestire la chiusura del bot, se necessario
            Print("Bot stopped at: ", Server.Time);
        }
    }
}

 


@emafondex69

PanagiotisCharalampous
28 Jul 2024, 07:08

Check your logs, your problem is with the volume. You need to round your volume before you use it


@PanagiotisCharalampous

emafondex69
28 Jul 2024, 15:52

RE: Problem BOT does not open operation in backtest

Check your logs, your problem is with the volume. You need to round your volume before you use it

 

 

PanagiotisCharalampous  thank you so much but also if I've corrected the volume, settin a fixed value (1.2 Lots), it doesn't work, can you correct it for me?

Here are the main charateristics

  • open long and short at 22.00 UTC+2 (Rome)
  • 9 pip stop 
  • 0.5 pip tp
  • 1.2 lots (volume) 

 

 

here there is my new code, I've tryed my best because I don't know how to program sir, thank you early, have a nice working day.

 

 

 

 

 

using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
using System;
using System.Collections.Generic;
using System.Linq;

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class TimeBasedOrder : Robot
    {
        private DateTime targetTime;
        private bool orderPlaced = false;

        [Parameter("Volume (Lots)", DefaultValue = 1.2)]
        public double Volume { get; set; }

        [Parameter("Stop Loss (Pips)", DefaultValue = 9)]
        public int StopLoss { get; set; }

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

        protected override void OnStart()
        {
            // Set the target time to 22:00 UTC
            targetTime = Server.Time.Date.AddHours(22);
            if (Server.Time > targetTime)
                targetTime = targetTime.AddDays(1);

            Print("Script started. Order will be placed at {0}", targetTime);
        }

        protected override void OnTick()
        {
            if (!orderPlaced && Server.Time >= targetTime)
            {
                PlaceOrder();
                orderPlaced = true;

                // Set the target time to 22:00 UTC the next day
                targetTime = targetTime.AddDays(1);
            }
        }

        private void PlaceOrder()
        {
            var stopLossInPips = StopLoss;
            var takeProfitInPips = TakeProfit;

            var stopLossPrice = Symbol.Ask + stopLossInPips * Symbol.PipSize;
            var takeProfitPrice = Symbol.Ask + takeProfitInPips * Symbol.PipSize;

            var result = ExecuteMarketOrder(TradeType.Buy, SymbolName, Volume, "TimeBasedOrder", stopLossInPips, takeProfitInPips);

            if (result.IsSuccessful)
                Print("Order placed successfully at {0}", Server.Time);
            else
                Print("Order placement failed: {0}", result.Error);
        }
    }
}

 

 

 

 

 

 

 

 

 

this was the photo that you sent to me, now i'll send you the new messages logs…

 

 

 

 

 

 

 

 


@emafondex69

PanagiotisCharalampous
29 Jul 2024, 05:27

RE: RE: Problem BOT does not open operation in backtest

emafondex69 said: 

Check your logs, your problem is with the volume. You need to round your volume before you use it

 

 

PanagiotisCharalampous  thank you so much but also if I've corrected the volume, settin a fixed value (1.2 Lots), it doesn't work, can you correct it for me?

Here are the main charateristics

  • open long and short at 22.00 UTC+2 (Rome)
  • 9 pip stop 
  • 0.5 pip tp
  • 1.2 lots (volume) 

 

 

here there is my new code, I've tryed my best because I don't know how to program sir, thank you early, have a nice working day.

 

 

 

 

 

using cAlgo.API;
using cAlgo.API.Internals;
using cAlgo.API.Indicators;
using cAlgo.Indicators;
using System;
using System.Collections.Generic;
using System.Linq;

namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class TimeBasedOrder : Robot
    {
        private DateTime targetTime;
        private bool orderPlaced = false;

        [Parameter("Volume (Lots)", DefaultValue = 1.2)]
        public double Volume { get; set; }

        [Parameter("Stop Loss (Pips)", DefaultValue = 9)]
        public int StopLoss { get; set; }

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

        protected override void OnStart()
        {
            // Set the target time to 22:00 UTC
            targetTime = Server.Time.Date.AddHours(22);
            if (Server.Time > targetTime)
                targetTime = targetTime.AddDays(1);

            Print("Script started. Order will be placed at {0}", targetTime);
        }

        protected override void OnTick()
        {
            if (!orderPlaced && Server.Time >= targetTime)
            {
                PlaceOrder();
                orderPlaced = true;

                // Set the target time to 22:00 UTC the next day
                targetTime = targetTime.AddDays(1);
            }
        }

        private void PlaceOrder()
        {
            var stopLossInPips = StopLoss;
            var takeProfitInPips = TakeProfit;

            var stopLossPrice = Symbol.Ask + stopLossInPips * Symbol.PipSize;
            var takeProfitPrice = Symbol.Ask + takeProfitInPips * Symbol.PipSize;

            var result = ExecuteMarketOrder(TradeType.Buy, SymbolName, Volume, "TimeBasedOrder", stopLossInPips, takeProfitInPips);

            if (result.IsSuccessful)
                Print("Order placed successfully at {0}", Server.Time);
            else
                Print("Order placement failed: {0}", result.Error);
        }
    }
}

 

 

 

 

 

 

 

 

 

this was the photo that you sent to me, now i'll send you the new messages logs…

 

 

 

 

 

 

 

 

The volume is set in units, not in Lots. Use Symbol.QuantityToVolume to do the conversion between lots and volume.


@PanagiotisCharalampous

emafondex69
02 Aug 2024, 13:07 ( Updated at: 02 Aug 2024, 13:23 )

RE: RE: RE: Problem BOT does not open operation in backtest

Thank you sir   If I have other problems can I contact you here?

 


@emafondex69

PanagiotisCharalampous
04 Aug 2024, 06:42

RE: RE: RE: RE: Problem BOT does not open operation in backtest

emafondex69 said: 

Thank you sir   If I have other problems can I contact you here?

 

Yes of course, create a new thread for each issue you might have


@PanagiotisCharalampous