全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
希望提供999和000的映射主力合约回测绩效
2022-07-17 16:39

希望提供999和000的映射主力合约回测绩效,像888那样,这样才是最真实的绩效回测

kyover

收到建议

2022-07-17 20:38
tblaocai

您好!其实TBQ现有的公式机制已经支持这种测试了。

Data0加载000或999,Data1加载888,公式略做改写,Data0上满足交易条件后,信号写在Data1上即可。

我在系统内置的demo_Rollover的基础上改了一个做为示例,具体可根据自己的需求再行修改。

Params
    Numeric FastLength(5);// 短期指数平均线参数
    Numeric SlowLength(20);// 长期指数平均线参数
    Bool    IsRollover(true);//是否后复权
    Bool    IsRolloverRealPrice(true);//是否映射真实价格
    Bool    IsAutoSwapPosition(true);//是否自动换仓
    Bool    IgnoreSwapSiganlCalc(true); //是否忽略换仓信号计算
Vars
    Integer i(0);
    Series<Numeric> AvgValue1; 
    Series<Numeric> AvgValue2;
    Global Numeric size(1); 
    
Events
    OnInit()
    {
        Range[0:DataCount-1]
        {
            If(IsRollover)
            {
                AddDataFlag(Enum_Data_RolloverBackWard());//设置后复权
            }
            If(IsRolloverRealPrice)
            {
                AddDataFlag(Enum_Data_RolloverRealPrice());//是否映射真实价格
            }
            If(IsAutoSwapPosition)
            {
                AddDataFlag(Enum_Data_AutoSwapPosition());//设置自动换仓
            }
            If(IgnoreSwapSiganlCalc)
            {
                AddDataFlag(Enum_Data_IgnoreSwapSignalCalc());//设置忽略换仓信号计算
            }
        }
    }

    OnBar(ArrayRef<Integer> indexs)
    {
        AvgValue1 = AverageFC(Close,FastLength);
        AvgValue2 = AverageFC(Close,SlowLength);
        PlotNumeric("MA1",AvgValue1);
        PlotNumeric("MA2",AvgValue2);
            
        If(Category() == Enum_CategoryStocks)
        {
            size = 100;
        }
        Else
        {
            size = 1;
        }
            
        If(CurrentBar<MaxBarsBack) Return;
            
        If(Data[1].MarketPosition <> 1 && AvgValue1[1] > AvgValue2[1])
        {
            Data[1].Buy(size, Open);
        }
            
        If(Data[1].MarketPosition <> -1 && AvgValue1[1] < AvgValue2[1])
        {
            Data[1].SellShort(size, Open);
        }
    }
 

2022-07-17 20:41
202****3164440109
@tblaocai

你好!

但是有个问题就是实盘的时候,好像是会按照指数发单,导致这个价格可能严重偏离实际情况。也就是说回测可能是可以的,但是实盘不太好解决。有没有办法能像后复权一样,直接映射到主力呢?这样无论写起来,还是实盘都会少很多坑。

2022-07-18 11:02
kyover
@202****3164440109

这个代码已经是以主力合约价格报信号了,前面都又data1前缀。

只不过不支持盘中实时信号。因为无法判断,用指数盘中满足条件时,无法确认历史k线上当时的888点位是多少。

2022-07-18 11:08
202****3164440109
@kyover

是的,好像000满足条件,并不能像后复权一样,折算出相应的888的发单价格.

所以可能需要一个函数可以把000的价格折算成888才能知道发单价格。能想到的简单办法应该是近期000和888的平均值比值,再加一定的偏移量。但是不知道会造成多大的计算负担。如果能有官方的近期折算系数,应该会比较方便。

而且现在这样好像不能用算法交易了。

总之不想用A函数的情况下(好像是官方不建议用,容易有大坑),感觉还是挺麻烦的。

2022-07-18 11:19
kyover
@202****3164440109

折算是算不出来的,因为000的计算需要全部合约的价格和持仓量,光只有主力合约的价格和持仓量是无法这算的。这里提的建议是,用你的000,订阅一个000小周期,然后找到小周期满足你信号的的bar,找这个时间对应的888的bar,然后用这个888的bar来作为信号计算就行了。

 

2022-07-18 15:53
zhou87li87

我建议直接映射吧。。。因为两个并没有直接的联系!除非知道000的计算机制

2023-05-23 19:49
您未登录,请先 登录注册 后发表评论
顶部