收盘后触发onbar的问题

canTradeTime = (data1.BarStatus == 2 && QuoteStatus == Enum_QuoteStatus_RealTime);

If(canTradeTime && Data0.BarExistStatus * Data1.BarExistStatus * Data3.BarExistStatus != 1)

Return;


限定了最后一根bar+实时行情状态+bar运行未结束


data-href=

data-href=

但收盘后仍然触发了onbar

是不是均价穿过来了?

如何屏蔽非交易时段触发onbar?



关于onbar的问题
关于OnBar触发机制可能存在的问题的确认
历史回测 onBar 触发机制
怎么实现在K线收盘前几秒触发OnBarClose
全新事件收盘价触发onbarclose即将上线
能举一个具体的收盘触发onbarclose例子吗
订单触发问题
OnExit()触发场景问题
吊灯止损被重复触发的问题
OnBar中的Data问题

data-href=

系统推送基础数据就会触发OnBar,也许还触发了其他事件

虽然对策略无影响

类似这种机制,还是建议在帮助文档中说明一下

这个不是驱动了onbar,是因为你用了委托映射,而委托映射的目标发生了变化,主力换月了。为了更新映射目标,必须重新运行单元才能更新生效。普通的基础数据推送不会触发onbar。

红圈上部分换月提示

是在策略内部OnBar部分检查然后报告出来

此时策略单元并未重启

您的意思是

TB会自动驱动策略单元运行一次?


对。当策略单元内的标的数据发生改动的时候,包括行情修复,设置变更,合约属性更新等等,都会自动重新执行单元

非常合理

谢谢

经过不懈努力

我想

就跨周期策略而言,我解决了闪烁

待实时行情验证一下

完全有条件

开发独立新版本

摒弃传统

重新做个正常的机制

改写扯淡的过时规则

闪烁的回滚机制而且很不透明

无论用回溯、onbaropen、onbarclose

现有机制都会带来不同的问题

???

建议TBQ在迭代新版本时

彻底摒弃和重写扯淡的闪烁机制

比如说

IF CLOSE>OPEN

{

COUNT = COUNT + 1;

BUY;

}

不能因为闪烁,COUNT就不加1了,任何编程语言都不是这个逻辑

就是应该给出不断买入的机制

程序员自己会去控制多次买入问题


那你为什么不用global呢

global就是你要求的不会闪烁的变量啊

你只要能处理好驱动循环的业务逻辑,怎么写都行

用序列变量做计数器也是因为有业务场景的需求

目的就是为了让某些计数器编写起来更简单。

事实上如果不用序列变量做计数器,完全用global作为状态变量是可行的

但是开发难度会成几何级增长

如果对自己能力非常有信心可以尝试彻底抛弃序列变量

刘老师好

我把情况说一下

您看有无好的建议

=======================================

目前实盘版本

价格计算用的序列变量

业务控制全部用的10个global(序列变量尝试过 但是始终没有摸透 闪烁后bar内状态无法记录)

=======================================

趋势交易系统

Data0为日线

Data1为5分钟切片

在切片末端5秒校验出入场条件

计算和发单都是切片Close--显然会导致闪烁

所以暂行的方案是夜盘前Restart一次

用global处理了各种状态

业务逻辑也无伤大雅

但全面闪烁会带来图层和账户日内的不一致(即图表无论是开平 策略重启之前都不会改变)

===========================================================

回溯+onbaropen(onbar)+high/low

确实可以解决闪烁

但就策略而言

1、当前bar末端交易显然更加符合实际需求(个人认为onbarclose+SettriggerBarClose也是这个出发点)

2、新bar解决闪烁的问题 带来的问题是

           close[1]还是open发单?这里又要引入对这两个价格的针对性算法矫正

           high/low其实同理,也需要针对性的算法矫正

3、close发单相当于提前5秒,open是推迟,成交率理论上就有差异;叠加夜盘--日盘--上午小节--午休,open和close[1]可能相去甚远

        Range[0:0]{ //10秒周期
			ma1 = XAverage(c, 10);
			ma2 = XAverage(c, 30);
			PlotNumeric(\"Bma1\", ma1, ma1);
			PlotNumeric(\"Bma2\", ma2, ma2);
		}
		Range[1:1]{
			data0.c1 = DataConvert(C, \"min\", 5, \"Close\");
			//下面几行是把5分钟的均线详细绘制到了更小的周期上,然后判断计算
			//简而言之,就是把这5分钟里均线的具体走法,细化到了小周期
			ma1 = data0.XAverage(c1, 10);
			ma2 = data0.XAverage(c1, 30);
			PlotNumeric(\"Ama1\", ma1, ma1);
			PlotNumeric(\"Ama2\", ma2, ma2);
			Bool b1 = CrossOver(ma1[1], ma2[1]);
			//If(b1) buy;
			
			//下面几行是还是5分钟的数据,只是在小周期上进场上,和上面的还是有区别。
            //你可以在图上看出区别
			Bool b2 = data0.CrossOver(ma1[1], ma2[1]);
			//If(b1) buy;
		}

TB想要写好代码,需要很强的逻辑思维和灵活变通。

这段代码的核心,就是把5分钟的数据直接细化到更小的切片上去,这样既可以使用大周期数据,也可以保证不会产生闪烁。

关于这段代码里的data0和data1等等的具体的数据是什么, https://www.tbquant.net/helper?navigate=tbl&cid=496 文档里也写的很清楚了。

谢谢

我已经解决了当前bar用最新价(close)计算、并最新价(close)发单的闪烁问题

确实是利用了TB内置机制+跨周期

而不用H/L+回溯+新bar

解决了用最新价计算、发单带来的闪烁问题

是用历史的Close[1],Open[1]之类的解决最新Bar的Close会变化导致的信号闪烁问题的么?

我想知道TB在当天下午3点收盘后,最后一根bar是运行结束了么?好像是没有的,因为我无法在onbarclose打印最后bar 的数据。那TB在收盘后判断bar运行结束的标准是什么?是下一根bar生成后,上一根才结束么?