关于提前发单代码及OnBarClose的疑问

最近在研究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线开始的时候执行一次。


关于提前发单代码的疑问
收盘价模型的收盘提前发单案例
收盘提前N秒发单的通用方法
OnBarClose设置提前触发,有提前触发却没有发出委托
关于OnBarClose
关于OnBarClose()回溯的问题
关于 OnBarClose
关于setbaseperiod的几个疑问
老师,请教一些关于盘口bar上开仓信号和实际发单关系的疑问
关于日内收盘最后一根bar的OnBarClose

看到这种常识性问题的时候我一般都是直接给零基础视频的

https://www.bilibili.com/video/BV1Yu41177LP/?spm_id_from=333.1387.collection.video_card.click

https://www.bilibili.com/video/BV18G411f7YF/?spm_id_from=333.1387.collection.video_card.click


此问题已解决,谢老师

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机制

都是有副作用的

图标上打个信号还行

真正账户交易会有其他的衍生问题