之前发过帖子询问过使用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 真实行情下策略单元绑定了真实账户,那么真实账户的下单操作会在什么时候触发呢?
你确定么?怎么我用你的代码执行出来没什么问题啊?
我看到老师您似乎是在实盘行情下运行的,我是中午收盘那会儿运行,麻烦老师试试把范围从最近30天,改为一个固定的历史事件范围
打错字了,是历史时间范围
我把操作录了个屏,代码就是从这个页面上复制过去的,问题依然存在,请老师明察
通过网盘分享的文件:操作录像.mp4
链接: https://pan.baidu.com/s/107tYbT9KEKOj3GCt7LPE0g 提取码: 2tbd
-
老师您成功运行的情况我也可以复现了,就是把MA指标【启用】勾掉,马上就跟您的运行结果一样了,这是怎么回事呢?
我发的那个视频上下单的位置在图表上并不是标注在第7根,而是第14根, 结合均线这个来看,是不是因为我用了ma10,在第七根的时候没有足够的数据算,所以引起的问题?把ma指标全部去掉就没有任何问题。
最大回溯bar的问题
你加载了ma,这个指标里最大回溯10,前面10根k线就不会出信号
你把length2改成5试试,应该就正常了
懂了,原来如此。顺便问一句,记得有个函数可以返回最大回溯Bar数, 这个函数是根据加载的公式来计算的吗?
是有这个,印象是maxbarsback,根据当前策略模型运行所需的最大回溯数动态变化