老师们好,请教一个多品种定时轮动调仓出现信号闪烁的问题:
1、之前看过刘风老师讲解多品种轮动调仓的课程:https://www.tbquant.net/TrainDetail?id=156 。这个课程讲了多品种叠加后通过指标排序进行轮动调仓的代码编写,但这个代码里没有讲开平仓按指定的固定时间点进行开平仓的调仓交易(比如在上午10点时进行调仓交易)。
2、我写的一个策略和这个视频课件里的策略是差不多的,不同的是我是设定好固定时间点进行开平仓。用的是K线周期是30分钟,信号计算没有用CLOSE而是CLOSE[1],历史回测正常,但实盘时出现了信号闪烁(实盘帐户没有委托,但事后查看图表是有信号的)。.想问一下我的写法哪里错误:
(1)首先在参数部分我是设定好了 WeekdaySet(1);//选择星期一进行开平仓。TimeSet(0.1000);//选择上午10点进行交易
Params
Bool IsRollover(true);//是否后复权
Bool IsRolloverRealPrice(true);//是否映射真实价格
Bool IsAutoSwapPosition(true);//是否自动换仓
Numeric Fund(167000);//下单金额
Numeric N(25);//回溯周期
Numeric instNum(36);//品种数量 ,
Numeric WeekdaySet(1);//选择星期几交易
Numeric TimeSet(0.10);//选择哪个时间点交易
(2)在开平仓的条件里是有 WeekdaySet(1)和TimeSet(0.1000)的条件的:
For i=0 to instNum-1
{
If( RS[i]>=Temp_RRdown AND RS[i]!=10000000 AND data[i].MarketPosition!=1 AND Weekday==WeekdaySet and time==TimeSet)
{
IF(data[i].MarketPosition==0)
{
DATA[i].Buy(Lots[i],data[i].Open);
}
IF(data[i].MarketPosition==-1)
{
DATA[i].Sell(0,DATA[i].open);
DATA[i].Buy(Lots[i],data[i].Open);
}
}
-----WeekdaySet是生效的,TimeSet会出现信号闪烁。请问一下time==TimeSet的这种写法是不是不对的?
有可能是多图层新bar数据没有同时到达导致的计算不正确。
参考跨周期信号闪烁里的用barexitstatus函数做对齐的处理方式
零基础视频里有
请问老师,我没有跨周期,多品种同一周期,这种情况下还是要用barexitstatus函数做对齐的处理方式进行数据对齐吗?
另外我补充一点,我的代码信号计算和报单都是写在onbaropen里的。除了上面说的数据对齐问题,是不是涉及到多品种交互有数据计算的策略不能写在onbaropen里?还是说和onbaropen无关,就是数据对齐问题?
谢谢
本源都是不同图层实盘中开盘数据不同步的问题,跨周期只是一个会发生这种闪烁的例子
老师,好的明白,这里我再追问两个问题:
一是barexitstatus这段代码支不支持回溯?
按视频里讲解的处理方式,是在事件域开始后先贴这段代码:
Numeric i;
Numeric result=1;
for k=0 to DataSourceSize-1
{
result= result*data[i].BarExistStatus;
}
If(result<>1) Return;
但贴了这段代码,好像回溯测试时出现奇怪的问题,会发生一些之前没有的交易信号,原因未查明。那在历史回溯测试时,历史BAR的BarExistStatus是等于1(运行中)还是2(运行结束)呢?回溯测试我试过改成:If(result==1) Return,结果就完全没有历史信号。
如果加这段代码又要能够回溯测试又能实盘,该怎么改呢?还是说历史回测就不能加这段代码?
二是夜盘实时交易时,有夜盘的品种和没夜盘的品种怎么对齐呢?
因为有些品种有夜盘有些没有夜盘,那有夜盘的品种在BAR进行时BarExistStatuS等于1,没有夜盘的品种BarExistStatuS就等于2吗?如果没有夜盘的品种BarExistStatuS就等于2,那么这个时候岂不是代码一直返回就不交易了?那这时怎么处理呢?
感谢老师的耐心。