测试对数据源发单,发现老重复

各位老师好,周末测试了下A函数,发现以下代码会重复发单一次,不知道什么原因数据源中合约46个,他分了两批委托,重复了一次,不知是什么原因,确实委托了46个,望各位老师指点,非常感谢!Params //此处添加参数 Vars //此处添加变量 Numeric avg; Global Integer timerId; Global Numeric a; Global Numeric b; Events OnInit() { b=0; } OnBar(ArrayRef<Integer> indexs) { Range[0:DataSourceSize()-1] { if(BarStatus==2) { if( b <DataSourceSize()) { Array<Integer> orders; A_SendOrderEx(Symbol, Enum_Buy, Enum_Entry,1, 20, orders, "", A_GetOrderCreateSource); // A_SendOrder(Enum_Buy, Enum_Entry, 1, 20); b = b+1; // buy(1,Close); } } } } //定时器更新事件函数,参数id表示定时器的编号,millsecs表示定时间的间隔毫秒值 //------------------------------------------------------------------------ // 编译版本 2026/6/14 202552 // 版权所有 pwhjy135246 // 更改声明 TradeBlazer Software保留对TradeBlazer平台 // 每一版本的TradeBlazer策略修改和重写的权利 //------------------------------------------------------------------------

会重复发单一次是因为你在2个图层上运行,2个图层上DataSourceSize的值是2,最新的bar上,b从0开始+1,b=0的时候发一次单,b=1的时候再发一次单。而且代码中由于b是全局变量,在b=2后便不会再进入发单的条件里面的,因此整个策略运行下来只会在刚开始运行的时候发单,后面不再会满足发单条件了。

回复:老师这个2你是泛指是吧,实际我是46个图层是吧,还是说我不知道哪儿设置了2个图层,而这46个数据分别运行了一次,我的想法是随着图层的变化对每个合约发单一次

回复:考虑到onbar的机制,我看视频说A函数和onorde、ontime适配,我也在下面的代码试了下,也不发单

又研究了会,可能是在onbar机制下运行的结果,但在其他事件下委托都没有了 // //目前集合竞价委托ontimer实现 Params //此处添加参数 Vars //此处添加变量 Numeric avg; Global Integer timerId; Global Numeric a; Global Numeric b; Global Integer i; Global String str1; Global Numeric t_id; Global Numeric t_time1; String sym; Global Array<Integer> Order_id; Events OnInit() { str1 = A_GetOrderCreateSource(); b=0; } OnBar(ArrayRef<Integer> indexs) { Range[i=0:DataSourceSize()-1] { if(BarStatus==2) //即使加了这个,也会不断发单,因为TICK是不断运行的 { if( b <DataSourceSize()) { //sym = Data[i].Symbol; Array<Integer> orders; Data[i].A_SendOrderEx(Data[i].Symbol, Enum_Buy, Enum_Entry,1, 20, order_id); //for i= 0 to GetArraySize(order_id)-1 order_id integer a = order_id[0]; print("a="+text(a)); //Order_id订单编号很重要 // A_SendOrderEx(Symbol, Enum_Buy, Enum_Entry,1, 20, orders, "", A_GetOrderCreateSource); // A_SendOrder(Enum_Buy, Enum_Entry, 1, 20); b = b+1; // buy(1,Close); } } } } //定时器更新事件函数,参数id表示定时器的编号,millsecs表示定时间的间隔毫秒值 // 目前发现下面是无法委托的 /* OnTimer(Integer id,Integer intervalMillsecs) { Range[I=0:DataSourceSize()-1] { if( b <DataSourceSize()) { Array<Integer> orders; data[i].A_SendOrderEx(Data[i].Symbol, Enum_Buy, Enum_Entry,1, 20, orders); // A_SendOrder(Enum_Buy, Enum_Entry, 1, 20); b = b+1; // buy(1,Close); } } }*/ //这个里也无法委托 /* OnOrder(OrderRef ord) { Range[i=0:DataSourceSize()-1] { if( b <DataSourceSize()) { Array<Integer> orders; data[i].A_SendOrderEx(Data[i].Symbol, Enum_Buy, Enum_Entry,1, 20, orders); // A_SendOrder(Enum_Buy, Enum_Entry, 1, 20); b = b+1; // buy(1,Close); } } }*/ //------------------------------------------------------------------------ // 编译版本 2026/6/14 202552 // 版权所有 pwhjy135246 // 更改声明 TradeBlazer Software保留对TradeBlazer平台 // 每一版本的TradeBlazer策略修改和重写的权利 //------------------------------------------------------------------------

回复:ontime中可以了