关于onbarclose开仓信号的触发问题

描述:我所有的开仓信号都是在 onbarclose() 域完成,另外设置了定时器 每个小节点提前3秒开;白糖SR000在120分钟运行策略(K线 自然分割)定时器如下: Array<Numeric> timePoint; Integer i; Print("GetSessionCount: " + Text(GetSessionCount)); For i = 0 To GetSessionCount() - 1 { Print("GetSessionEndTime: " + Text(GetSessionEndTime(i),6)); Numeric ret = DateTimeAdd(GetSessionEndTime(i), -3); if(ret < 0) { ret = DateTimeAdd(GetSessionEndTime(i), 86400 - 1); } ret = StringToTime(TimeToString(ret)); Print("SetTriggerBarClose: " + Text(ret)); ArrayPushBack(timePoint, ret); } Print("tarryszie: " + text(GetArraySize(timePoint))+"; arrytime: "+ TextArray(timePoint)); If(True) SetTriggerBarClose(timePoint); // 按小节 Print("------");问题:为什么会存在 11:24:38 开仓的信号?而且提示“闪烁” 预期应该在 11:29:57 开商品名称 委托时间 委托价格 状态 买卖 开平 委托数量 成交数量 成交价 成交额 剩余数量 对手价 理论价 委托编号 委托来源 状态消息 白糖605 2026/03/16 11:24:38 5483 全部成交 买入 开仓 21 21 5473 1,149,330 0 5473 5473 100002 时间 消息类型 消息级别 内容 2026-03-16 11:24:42.241 策略运行 警告 策略运行,S03@myunit@SR000_M120发生信号闪烁,合约:SR000.CZCE,上次执行信号个数:1,本次执行信号个数:0,发生Bar时间:20260316.100000,发生Bar=5005

目前的解决办法是,取消 SetTriggerBarClose()

😀

希望问题得到解决~

希望大家看看是否遇到类似问题~

你要这么说的话镍也不对吧应该是时间切片的问题起码最小的切片能够和Close的时间点配合上120分钟绝大多数收盘都不在你划分的时间点上?

回复:不是的,有的品种周期有区别,但都是正规的分钟数 如:60/120分钟

回复:你贴的代码不全这个机制的实现也没给源代码 https://bbs.tbquant.net/thread/forum12343 这么给你说吧这个机制本质就是把onbarclose改成了onbar你的策略需求可以用两种方法实现1、如果你要固定的时间点开平仓,还不如把这些时间点写死放到数组,然后判断系统当前时间是否在这个区间内,比如≥11:29:57<11:30:00,做相应的开平仓动作。因为SetTriggerBarClose机制本来就是要在实时行情阶段才有效2、根据你设定的K线切割,在K线收盘前3秒做相应的开平仓操作,这个也是最合理的逻辑无论使用哪种方案都比系统提供的SetTriggerBarClose机制来的简洁有效

回复:理解了逻辑重构SetTriggerBarClose非常简单1-2行代码避免官方的冗余方案、且官方都不建议的这个机制何乐不为?

回复:参考下您的重构代码~

回复:原贴已经更新一行代码的事情看你们折腾死了

回复:最终还是取决于你用上面的1还是2模式两种都行性质略有不同但是本质上来说你的K线切割方式本身是有问题的。。。

回复:至于闪烁根本原因在于开仓前的IF块必须确保不变这是闪烁的根本原因理解这个就没有闪烁

回复:原贴链接 发一下~

有没有叠加合约?

回复:单图层,单品种,单策略

回复:如果仅仅是差几秒,可能是本地时间问题。但是差了好几分钟。。。正常自然时间分割 120分钟线