Need help to close all positions after x hours
            
                 29 Mar 2022, 00:36
            
                    
I will leave the code here.
when the hours >24, the robot dont seems recognize my -24
Can you help?
using System;
using System.Linq;
using cAlgo.API;
using cAlgo.API.Indicators;
using cAlgo.API.Internals;
using cAlgo.Indicators;
namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class z : Robot
    {
        [Parameter("Max time position open(hours)", DefaultValue = 2, MinValue = 1)]
        public int MaxTimeOpen { get; set; }
        protected override void OnStart()
        {
            // Put your initialization logic here
            Print("Start robot: ", Server.Time.Hour);
            if (Server.Time.Hour == 0)
            {
                ExecuteMarketOrder(TradeType.Sell, Symbol, 10000, "", 100, 100);
            }
        }
        protected override void OnTick()
        {
            // Put your core logic here
            Print("OnTick: ", Server.Time.Hour);
            foreach (var position in Positions)
            {
                Print(position.EntryTime.TimeOfDay);
                int posOpenTimeHours = position.EntryTime.Hour + MaxTimeOpen;
                int posOpenTimeMinutes = position.EntryTime.Minute;
                if (posOpenTimeHours > 24)
                {
                    posOpenTimeHours = posOpenTimeHours - 24;
                }
                Print("Pos open time: ", posOpenTimeHours);
                if (Server.Time.Hour > posOpenTimeHours && Server.Time.Minute > posOpenTimeMinutes)
                {
                    ClosePosition(position);
                }
            }
        }
        protected override void OnStop()
        {
            // Put your deinitialization logic here
        }
    }
}
    Replies
                     hugicardoso
                     29 Mar 2022, 19:03
                                    
RE:
Thank you very much, but when I use the optimization it is very slow, it goes from 7h to 5 days. which makes it very difficult to use
amusleh said:
Hi,
Try this:
using cAlgo.API; namespace cAlgo { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class z : Robot { [Parameter("Max time position open(hours)", DefaultValue = 2, MinValue = 1)] public int MaxTimeOpen { get; set; } protected override void OnStart() { Timer.Start(1); // Put your initialization logic here Print("Start robot: ", Server.Time.Hour); if (Server.Time.Hour == 0) { ExecuteMarketOrder(TradeType.Sell, SymbolName, 10000, "", 100, 100); } } protected override void OnTimer() { foreach (var position in Positions) { var timeElapsedSincePositionEntryTime = Server.TimeInUtc - position.EntryTime; Print("timeElapsedSincePositionEntryTime: {0}", timeElapsedSincePositionEntryTime); if (timeElapsedSincePositionEntryTime.TotalHours >= MaxTimeOpen) { ClosePosition(position); } } } } }
@hugicardoso
                     amusleh
                     29 Mar 2022, 19:26
                                            ( Updated at: 29 Mar 2022, 19:27 )
                                    
Hi,
Try to increase the timer interval, ex:
using cAlgo.API;
namespace cAlgo
{
    [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)]
    public class z : Robot
    {
        [Parameter("Max time position open(hours)", DefaultValue = 2, MinValue = 1)]
        public int MaxTimeOpen { get; set; }
        protected override void OnStart()
        {
            Timer.Start(3600);
            // Put your initialization logic here
            Print("Start robot: ", Server.Time.Hour);
            if (Server.Time.Hour == 0)
            {
                ExecuteMarketOrder(TradeType.Sell, SymbolName, 10000, "", 100, 100);
            }
        }
        protected override void OnTimer()
        {
            foreach (var position in Positions)
            {
                var timeElapsedSincePositionEntryTime = Server.TimeInUtc - position.EntryTime;
                Print("timeElapsedSincePositionEntryTime: {0}", timeElapsedSincePositionEntryTime);
                if (timeElapsedSincePositionEntryTime.TotalHours >= MaxTimeOpen)
                {
                    ClosePosition(position);
                }
            }
        }
    }
}
@amusleh
                     hugicardoso
                     29 Mar 2022, 20:41
                                    
RE:
Works very good thanks for the help.
amusleh said:
Hi,
Try to increase the timer interval, ex:
using cAlgo.API; namespace cAlgo { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class z : Robot { [Parameter("Max time position open(hours)", DefaultValue = 2, MinValue = 1)] public int MaxTimeOpen { get; set; } protected override void OnStart() { Timer.Start(3600); // Put your initialization logic here Print("Start robot: ", Server.Time.Hour); if (Server.Time.Hour == 0) { ExecuteMarketOrder(TradeType.Sell, SymbolName, 10000, "", 100, 100); } } protected override void OnTimer() { foreach (var position in Positions) { var timeElapsedSincePositionEntryTime = Server.TimeInUtc - position.EntryTime; Print("timeElapsedSincePositionEntryTime: {0}", timeElapsedSincePositionEntryTime); if (timeElapsedSincePositionEntryTime.TotalHours >= MaxTimeOpen) { ClosePosition(position); } } } } }
@hugicardoso

amusleh
29 Mar 2022, 10:50
Hi,
Try this:
@amusleh