

描述:我所有的开仓信号都是在 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分钟线