最近在研究OnBarClose的发单机制,于是写了一个简单的代码,用ag2506的1分钟K线(单图层)进行测试,用fileAppend函数记录了实时的数据
代码如下:
OnInit()
{
//=========数据源相关设置==============
AddDataFlag(Enum_Data_RolloverBackWard()); //设置后复权
AddDataFlag(Enum_Data_RolloverRealPrice()); //设置映射真实价格
AddDataFlag(Enum_Data_AutoSwapPosition()); //设置自动换仓
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc()); //设置忽略换仓信号计算
AddDataFlag(Enum_Data_FullPeriod); //完全交易时段枚举值
AddDataFlag(Enum_Data_EndTime); //使用结束时间的枚举值
}
OnBarOpen(ArrayRef<Integer> indexs)
{
Numeric advancesec(2); //提前多少秒
Array<Numeric> timePoint;
Numeric ret = DateTimeAdd(RealEndDateTime, -1*advancesec);
ret = StringToTime(TimeToString(ret));
ArrayPushBack(timePoint, ret);
SetTriggerBarClose(timePoint);
Sell(0,open);
FileAppend("c:\\OnbarClose_test","onbaropen " + Symbol + " date=" + DateToString(date) + " Time=" + Text(Time) + " CurrentTime=" + TimeToString(CurrentTime) + " H[1]=" + Text(H[1]));
}
OnBarClose(ArrayRef<Integer> indexs)
{
Buy(1,close);
FileAppend("c:\\OnbarClose_test","onbarclose " + Symbol + " date=" + DateToString(date) + " Time=" + Text(Time) + " CurrentTime=" + TimeToString(CurrentTime) + " H[1]=" + Text(H[1]));
}
执行效果如下图:
疑问如下:
1、onbarclose不是应该只执行一次吗?从序号1712-1719可以看出,但time=22:28的K线上,执行了8次
2、OnBarOpen中的代码,是让onbarclose提前执行,但从1720和1721的数据看,onbaropen是否也同时提前了5秒执行?而且onbaropen代码也提前执行了2次,而不是认知中的:在K线开始的时候执行一次。
1s2个tick
2Layer*2s*close*open=8🤣
我没看文档
但
应该是最后2秒一直触发的
这个你要理解
综合来看
1 双图层
2 onclose不设断点,是onopen触发;设断点,是连续运行,一直触发,onopen应该不再触发
3 buy/SELL打信号,底层机制只发一次,所以你感受不到问题,真发单到账户,会塞8次
兄弟是个高手,方便加个Q交流吗,369557644
说错了别怪哈
总体要等老师来解答
纯属猜测
1、你应该是2个图层,仔细看看,你是不是直接在行情报价打开了品种,调成了1分钟,加载的公式?
2、OnBarOpen肯定执行一次,2次说明有2个图层;所以OnBarClose干了8次
上个帖子里
建议了触发时候,要ArrFind一下图层号
已经建议你重构SetTriggerBarClose,比系统提供的更简洁。我没仔细研究,从驱动机制来说,真可能每个图层会运行两次,一次是提前,一次是OnBarOpen的时候。也许这也是官方给出这个机制,早期又觉得没啥用的原因,不知道后来改进没
谢谢兄弟,非常热心。
1、我只用了一个图层,是在工作区加载的,并不是直接在行情报价中加载。但我有另一个工作区,实盘有跑ag2506的程序,难这也会相互干扰?
2、“onclose不设断点,是onopen触发;设断点,是连续运行,一直触发” 这句不太懂,要怎么设置,官方文档没找到相关内容。
3、帖子中确实写错了,是提前2秒执行,而不是5秒。
4、很好奇onbaropen和onbarclose的关系,我怀疑是不是onbarclose的代码,本质还是在放在onbaropen域代码中执行,因为我发现onbarclose记录中的time等于下一根bar的time。
5、重构函数SetTriggerBarClose太难了,还要先吃透官方的😭
关于第4点,还有一个问题,在onbaropen的记录中,即截图的1720和1721行,22:27:54秒通过onbaropen触发记录的time,竟然是0.2229,不应该是0.2228吗,难以理解
你要同步一下电脑时间
不同工作区不会干扰
1 onbaropen只会执行一次,执行多次,就要检查到底几个图层
2 onbarclose,不设置SetTriggerBarClose的情况下,应该是onbaropen触发的,也就是触发onbaropen时,先运行onbarclose,再运行onbaropen,换句话说,其实onbarclose是虚拟的一个机制;设置SetTriggerBarClose,比如58秒,那就相当于onbar,最后两秒一直触发,底层应该就是onbar,并不是你按照常规理解的,执行一次。既然是onbar,所以我建议你自己重构,比你用SetTriggerBarClose更加简便
onbarclose执行一次是常规理解,也很好理解;SetTriggerBarClose后,变成了onbar,连续执行,这个逻辑上是没问题的,反而只执行一次才毫无意义。
因为我不用,所以没用代码确认set trigger后,onbaropen是否依然触发一次onbarclose
如果不触发,那么这个机制可用,而且很好
如果还是触发,那就是官方说的,没有意义,别折腾了
我说的你好好揣摩推演一下
理解一下TBQ的机制
其他事件域驱动都有意义
onbarclose
无论原始机制还是加入settrigger机制
都是有副作用的
图标上打个信号还行
真正账户交易会有其他的衍生问题