AL
    
        
            Closing each opened trade after x amount of time
            
                 09 Apr 2020, 22:52
            
                    
Hi everyone,I have made this simple bot a while ago with help of ctrader community and sample bots because I dont have any knowledge in coding it was really hard for me but good thing is i am learing in this way,now i have one question wich I can't solve by my self so i really need your help,I need the bot to close each trade after for example 15 min from the time it has been opened
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
namespace cAlgo.Robots
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class Cowabungastratey : Robot
    {
        [Parameter("Instance Name", DefaultValue = "001")]
        public string InstanceName { get; set; }
        [Parameter("Lot Size", DefaultValue = 0.1)]
        public double LotSize { get; set; }
        [Parameter("Source FastEma")]
        public DataSeries SourceFastEma { get; set; }
        [Parameter("Source SlowEma")]
        public DataSeries SourceSlowEma { get; set; }
        [Parameter("Period FastEma", DefaultValue = 5, MinValue = 1, MaxValue = 100)]
        public int PeriodFastEma { get; set; }
        [Parameter("Period SloeEma", DefaultValue = 10, MinValue = 5, MaxValue = 100)]
        public int PeriodSlowEma { get; set; }
        [Parameter("ATR Value", DefaultValue = 0.00095)]
        public double AtrValue { get; set; }
        [Parameter("Calculate OnBar", DefaultValue = false)]
        public bool CalculateOnBar { get; set; }
        private ExponentialMovingAverage FastEma;
        private ExponentialMovingAverage SlowEma;
        private MarketSeries h4;
        private ExponentialMovingAverage ema1;
        private ExponentialMovingAverage ema2;
        private AverageTrueRange atr;
        protected override void OnStart()
        {
            FastEma = Indicators.ExponentialMovingAverage(SourceFastEma, PeriodFastEma);
            SlowEma = Indicators.ExponentialMovingAverage(SourceSlowEma, PeriodSlowEma);
            h4 = MarketData.GetSeries(TimeFrame.Hour4);
            ema1 = Indicators.ExponentialMovingAverage(h4.High, 12);
            ema2 = Indicators.ExponentialMovingAverage(h4.High, 9);
            atr = Indicators.AverageTrueRange(MarketSeries, 14, MovingAverageType.Exponential);
            // Put your initialization logic here
        }
        protected override void OnTick()
        {
            if (CalculateOnBar)
            {
                return;
            }
            ManagePostions();
        }
        protected override void OnBar()
        {
            if (!CalculateOnBar)
            {
                return;
            }
            ManagePostions();
        }
        protected override void OnStop()
        {
            // Put your deinitialization logic here
        }
        private void ManagePostions()
        {
            if (SlowEma.Result.LastValue < FastEma.Result.LastValue)
            {
                if (atr.Result.LastValue > AtrValue)
                    if (ema2.Result.LastValue > ema1.Result.LastValue)
                        if (!IsPositionOpenByType(TradeType.Buy))
                        {
                            OpenPosition(TradeType.Buy);
                        }
                ClosePosition(TradeType.Sell);
            }
            if (SlowEma.Result.LastValue > FastEma.Result.LastValue)
            {
                if (atr.Result.LastValue > AtrValue)
                    if (ema2.Result.LastValue < ema1.Result.LastValue)
                        if (!IsPositionOpenByType(TradeType.Sell))
                        {
                            OpenPosition(TradeType.Sell);
                        }
                ClosePosition(TradeType.Buy);
            }
        }
        private void OpenPosition(TradeType type)
        {
            double Volume = Symbol.QuantityToVolumeInUnits(LotSize);
            ExecuteMarketOrder(type, this.SymbolName, Volume, InstanceName, null, null);
        }
        private void ClosePosition(TradeType type)
        {
            var P = Positions.Find(InstanceName, this.SymbolName, type);
            if (P != null)
            {
                ClosePosition(P);
            }
        }
        private bool IsPositionOpenByType(TradeType type)
        {
            var P = Positions.FindAll(InstanceName, SymbolName, type);
            if (P.Count() >= 1)
            {
                return true;
            }
            return false;
        }
    }
}

firemyst
30 Aug 2020, 12:54
What you need to do is:
1) get the position open time
2) create a timer object
3) when 15 minutes has passed on the timer object, trigger it to call a method. That method could be the close method, which closes your position.
Examples for the C# timer object:
https://docs.microsoft.com/en-us/dotnet/api/system.timers.timer?view=netcore-3.1
and
https://stackoverflow.com/questions/12535722/what-is-the-best-way-to-implement-a-timer
@firemyst