希望提供999和000的映射主力合约回测绩效,像888那样,这样才是最真实的绩效回测
我建议直接映射吧。。。因为两个并没有直接的联系!除非知道000的计算机制
您好!其实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);
}
}
你好!
但是有个问题就是实盘的时候,好像是会按照指数发单,导致这个价格可能严重偏离实际情况。也就是说回测可能是可以的,但是实盘不太好解决。有没有办法能像后复权一样,直接映射到主力呢?这样无论写起来,还是实盘都会少很多坑。
这个代码已经是以主力合约价格报信号了,前面都又data1前缀。
只不过不支持盘中实时信号。因为无法判断,用指数盘中满足条件时,无法确认历史k线上当时的888点位是多少。
是的,好像000满足条件,并不能像后复权一样,折算出相应的888的发单价格.
所以可能需要一个函数可以把000的价格折算成888才能知道发单价格。能想到的简单办法应该是近期000和888的平均值比值,再加一定的偏移量。但是不知道会造成多大的计算负担。如果能有官方的近期折算系数,应该会比较方便。
而且现在这样好像不能用算法交易了。
总之不想用A函数的情况下(好像是官方不建议用,容易有大坑),感觉还是挺麻烦的。
折算是算不出来的,因为000的计算需要全部合约的价格和持仓量,光只有主力合约的价格和持仓量是无法这算的。这里提的建议是,用你的000,订阅一个000小周期,然后找到小周期满足你信号的的bar,找这个时间对应的888的bar,然后用这个888的bar来作为信号计算就行了。
收到建议