按照官方提供的提单发单代码,我已经在单图层中使用了几个月均没有发现问题,但最近在一个双图层的区间突破策略中使用时遇到了执行异常,请各位老师指导。
策略使用了两个图层,图层一为日线,图层二为30分钟K线,主要代码如下:
OnBarOpen(ArrayRef<Integer> indexs)
{
Range[1:1]
{
Numeric advancesec(5); //提前多少秒
Array<Numeric> timePoint;
Numeric ret = DateTimeAdd(RealEndDateTime, -1*advancesec);
ret = StringToTime(TimeToString(ret));
ArrayPushBack(timePoint, ret);
SetTriggerBarClose(timePoint);
}
//此处有一些计算Buyline和SellLine的代码,略去不计
}
OnBarClose(ArrayRef<Integer> indexs)
{
Range[1:1]
{
If(time == 0.093 and high < BuyLine AND MarketPosition == 1 and BarsSinceToday==0)
//如果在10:00分没有向上突破,且昨日有持仓,则平仓
{
Sell(lot,Close);
PlotString("Cover","平多",low,Yellow);
}
}
}
这段代码在实盘执行的结果,并不是在9:30这根k线执行前5秒平仓,而是在开盘就平仓了。交易开始前系统还提示存在信号闪烁。
请老师们指导应如何编码
1、先设定好K线用开始时间还是结束时间来界定
2、OnbarClose域,arrayFind一下是否1号图层触发的
两个图层都是同一种商品,是0号图层还是1号图层应该没关系吧
K线不是都以开始时间来界定吗?比如9点半开盘的期指,第一根K线的time==0.093,还有其他设置方法吗?
RealEndDateTime 你代码一个用的结束时间
其他不知道你配置没有
所有数据源应该先设定统一的时间标识
AddDataFlag(Enum_Data_FullPeriod);//完全交易时段枚举值
AddDataFlag(Enum_Data_EndTime);//使用结束时间的枚举值
在Init域先统一好
很多时候,就这种小细节折腾坏
所以我不喜欢用Date\Time
习惯用TradingEndDateTime/TradingBeginDateTime
类似于RealEndDateTime 一个概念
虽然TBQ提供了很多函数
还是尽可能自己养成习惯
包括是否需要指定图层
特别是涉及到多数据源
否则有的时候人要搞崩溃
就像我昨天刚问老师的问题
文档和理论上
编码都没问题
ReStatr-开拓者社区 https://bbs.tbquant.net/thread/20250312183351227056
但是需要自己去摸索、揣摩底层机制
否则心态就崩了
你这还刚多图层
信号闪烁问题接踵而来
翻翻我以前的回复
做点储备
谢谢兄弟,我就是被多图层搞崩溃了,现在都敢用单图层。用一次多图层+onbarclose+提前发单,就报信号闪烁了。猜软件的底层机制真是太难了🤝
1、我自己是不用OnBarClose的SetTriggerBarClose;我记得23年8-9月写的时候,好像没有这玩意,或者我没注意;我是OnBar中自己完成同样的功能,不复杂
2、多数据源对齐必须校验,历史数据默认对齐,实时行情用代码校验一下
3、上面说的,有些触发要考虑哪个图层,那就ArrFind一下对应图层再操作
4、序列价格计算用系统的序列变量;标志类的控制开关,用全局变量,换句话说,少用序列变量,至今我都心有余悸、落下了心理阴影
5、A 要么接受在OnBarOpen中用Close[1]这类延迟性;B 要么接受在OnBarClose中当前Bar满足条件,但是偶尔还是会出现信号消失,这就要看你接受度和策略包容度;C 如果想要完全不闪烁,也可以做到,一个是要自己反算价格,还得用到High/Low;我是接受B种,认为是最自然、最合理、最简便、最优解
6、交易买卖信号,需要放在小周期的切片上
我甚至认为,Close[1]/Open/High/Low是很Low思维,大多量化系统传承下来的恶习;
SetTriggerBarClose是个不错的思维,但是由此带来一些问题,官方也不推荐,甚至更早一段时间,客服认为没有意义,直接建议不用
用的时候自己慢慢揣摩吧
一是我觉得很好
二是我自己没直接用,但重构一样的功能
Onbar中该如何实现在收盘前几秒发单的效果呢?兄弟有资料推荐学习吗?
你先把老师的此类各种视频消化一下
了解各个事件域驱动机制
至于在onbar中重构onbarclose 的SetTriggerBarClose
如果你理解了它现有处理机制
几秒钟就明白了
不太确定哪里有问题,一般需要加诊断语句记录执行日志才能分析。
猜测可能是因为多图层驱动时机不一致导致的
两个图层,一个是日线,一个是30分钟,能对齐。另外onbarclose 中 ,已经用range[1:1]指定了图层,还会因为多图层驱动时机不一致导致问题吗?
不清楚,所以需要拿到代码,写一些demo测试去验证猜想啦确定问题