canTradeTime = (data1.BarStatus == 2 && QuoteStatus == Enum_QuoteStatus_RealTime);
If(canTradeTime && Data0.BarExistStatus * Data1.BarExistStatus * Data3.BarExistStatus != 1)
Return;
限定了最后一根bar+实时行情状态+bar运行未结束
但收盘后仍然触发了onbar
是不是均价穿过来了?
如何屏蔽非交易时段触发onbar?
系统推送基础数据就会触发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
解决了用最新价计算、发单带来的闪烁问题
我想知道TB在当天下午3点收盘后,最后一根bar是运行结束了么?好像是没有的,因为我无法在onbarclose打印最后bar 的数据。那TB在收盘后判断bar运行结束的标准是什么?是下一根bar生成后,上一根才结束么?