cAlgo特定时间平仓cBot故障求助:无报错但未执行平仓
cBot定时平仓问题的修复方案
你的代码存在几个关键问题,导致无法按时执行平仓:
时间对象错误
机器人标注了TimeZone = TimeZones.UTC,但代码里用的DateTime.Now是本地机器时间,和服务器UTC时间不匹配。必须使用Server.Time来获取平台的UTC时间,确保时间判断准确。无重复执行防护
OnTick会在每个价格变动时触发,8:00整的时间段内会多次进入判断逻辑。虽然平仓后头寸会消失,但添加一个标记可以避免不必要的重复操作。冗余参数
代码里的Parameter参数未被使用,可以直接删除。
修复后的代码如下:
using System; using System.Linq; using cAlgo.API; namespace cAlgo { [Robot(TimeZone = TimeZones.UTC, AccessRights = AccessRights.None)] public class CloseAllPositions : Robot { // 标记是否已执行过当日平仓操作 private bool _hasClosedToday = false; protected override void OnTick() { var currentTime = Server.Time; // 检查是否为UTC时间8:00,且当日未执行过平仓 if (currentTime.Hour == 8 && currentTime.Minute == 0 && !_hasClosedToday) { foreach (var position in Positions) { ClosePosition(position); } // 标记当日已平仓,避免重复执行 _hasClosedToday = true; } // 每日重置标记(比如00:01时重置) if (currentTime.Hour == 0 && currentTime.Minute == 1) { _hasClosedToday = false; } } } }
额外说明:
- 如果你的目标时间是本地时间而非UTC,需要调整
currentTime.Hour的数值,或者修改机器人的TimeZone属性为对应的时区(比如TimeZones.NewYork)。 - 平仓操作需要确保机器人有足够的权限,不过你的代码已经设置
AccessRights = AccessRights.None,平仓操作不需要额外权限,这个设置没问题。
内容的提问来源于stack exchange,提问作者Ahad Firdosi
相关产品推荐
相关产品推荐

