【下单】- 使用Buy函数下单后Portfolio信息和MarketPosition更新延迟

之前发过帖子询问过使用Buy函数时信号闪烁的问题,根据老师的回答"信号闪烁的判断标准就是,当信号出现以后,当前bar后续所有tick驱动,这个信号都必须保证出现,并且手数和价格参数不能改变。否则就会发出信号闪烁警报", 我的理解是在历史Bar上调用Buy函数应该不会出现信号闪烁(因为历史Bar不需要tick驱动),而且到了调用Buy函数后的下一根Bar时MarketPosition就应该更新了,今天测试的时候发现似乎Portfolio和MarketPosition的更新并没有那么快。问题复现:1.使用品种ag2504, 范围是最近30天2.测试代码如下Defs Bool PrintPortfolio() { Print("---------Portfolio @ Bar #" + Text(CurrentBar) + "--------"); Print("Portfolio_CurrentCapital:" + Text(Portfolio_CurrentCapital())); Print("Portfolio_CurrentEquity:" + Text(Portfolio_CurrentEquity())); Print("Portfolio_UsedMargin:" + Text(Portfolio_UsedMargin())); Print("MarketPosition:" + Text(MarketPosition)); Print("--------------------------\n"); Return True; } Events OnInit() { PrintClear(); Print("数据源策略函数测试"); } OnBar(ArrayRef<Integer> indexs) { If(BarStatus == 1) { If(CurrentBar % 7 == 0 AND MarketPosition == 0 ) { Buy(2,0); PrintPortfolio(); } Else If(CurrentBar == 8) PrintPortfolio(); } Else If(BarStatus == 2) { Print("*********运行至最后一根Bar***********"); PrintPortfolio(); } }预期的结果是:1. 仅在Bar Index = 7的时候下2手买单2. 在Bar Index = 8的时候可以看到MarketPosition = 13. 在最后一根Bar上看到 虚拟账户Portfolio的变化实际的结果是:1. 似乎在Bar Index = 7 和 Bar Index = 14时都调用了下单代码 (Bar Index = 14时 MarketPosition应该为1,If内代码不应该能被执行)2. 在Bar Index = 8的时候 Market Position = 0, 似乎Buy并没有生效3. 在Bar Index = 14时看到了Portfolio更新运行结果看下图我的问题是#1 在历史行情上似乎Buy函数调用后对于虚拟账户的Portfolio更新会延迟?#2 真实行情下Buy函数的行为是怎样的?#3 真实行情下策略单元绑定了真实账户,那么真实账户的下单操作会在什么时候触发呢?

你确定么?怎么我用你的代码执行出来没什么问题啊?

回复:我看到老师您似乎是在实盘行情下运行的,我是中午收盘那会儿运行,麻烦老师试试把范围从最近30天,改为一个固定的历史事件范围

回复:打错字了,是历史时间范围

回复:我把操作录了个屏,代码就是从这个页面上复制过去的,问题依然存在,请老师明察通过网盘分享的文件:操作录像.mp4链接: https://pan.baidu.com/s/107tYbT9KEKOj3GCt7LPE0g 提取码: 2tbd -

回复:老师您成功运行的情况我也可以复现了,就是把MA指标【启用】勾掉,马上就跟您的运行结果一样了,这是怎么回事呢?

回复:我发的那个视频上下单的位置在图表上并不是标注在第7根,而是第14根, 结合均线这个来看,是不是因为我用了ma10,在第七根的时候没有足够的数据算,所以引起的问题?把ma指标全部去掉就没有任何问题。

回复:最大回溯bar的问题你加载了ma,这个指标里最大回溯10,前面10根k线就不会出信号你把length2改成5试试,应该就正常了

回复:懂了,原来如此。顺便问一句,记得有个函数可以返回最大回溯Bar数, 这个函数是根据加载的公式来计算的吗?

回复:是有这个,印象是maxbarsback,根据当前策略模型运行所需的最大回溯数动态变化