【下单】- 使用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 = 1

3. 在最后一根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 真实行情下策略单元绑定了真实账户,那么真实账户的下单操作会在什么时候触发呢?



用 Buy(1, 0) 下单后, MarketPosition的值还是0
【下单】- 当使用Buy/Sell等交易函数如何获得背后虚拟账户的资金信息
使用Buy/Sell函数下单,用数据源策略函数获取的信息会丢失
开盘延迟下单
A 函数 下单操作后
下单后与交易所的信息交互过程
没有获取委托列表函数和指定合约委托信息,如何避免重复下单?
buy/sell下单返回ture,但实际下单失败
buy函数,marketposition函数
下单之后延迟2秒继续执行下面的代码 这个该怎么做 有没有专门的延迟函数,不用定时器的那种,可以直接使用的

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

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

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

我把操作录了个屏,代码就是从这个页面上复制过去的,问题依然存在,请老师明察

通过网盘分享的文件:操作录像.mp4

链接: https://pan.baidu.com/s/107tYbT9KEKOj3GCt7LPE0g 提取码: 2tbd

-

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

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

最大回溯bar的问题

你加载了ma,这个指标里最大回溯10,前面10根k线就不会出信号

你把length2改成5试试,应该就正常了

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

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