开拓者期货期权程序化系统交易论坛
标题:
TBquant上商品期货主力连续合约的测试分析
[打印本页]
作者:
quant_yunjinqi
时间:
2019-8-13 15:39:16
标题:
TBquant上商品期货主力连续合约的测试分析
重新开一个帖子,咨询相关的问题。
提供了一个最简单的双均线策略,供讨论具体的代码。
从代码中可以看出,期货的主力合约在换月的时候是进行向后复权的,在换约的时候,先平掉原有的合约,然后开新的,经过换算后的不同仓位的在新的合约上。这是上面代码已经默认实现的,写策略的时候可以不用考虑了。
在我们自己写新的策略的时候,我们获取行情和下单要如何操作呢?
1、获取行情
复权后的行情在原先的open,high,low,close的基础上,在最前面加了r,代表向right复权(向后复权),这个大概没有疑问。
如以下代码:
//初始设置
Avg1=Average(rClose,AvgLen1);
Avg2=Average(rClose,AvgLen2);
复制代码
2、下新单
下新单的时候要怎么做呢?如信号出现了,现在要买入开仓
buy(lots,price)
这里的lots因该用什么?是上述在换月的时候计算出来的Lots的手数吗?还是继续使用策略设置的手数或者默认的手数?
这里的价格应该用什么?用rOpen-后复权后的价格还是应该用open,主力连续合约的真实价格呢?
//------------------------------------------------------------------------
// 简称: test2
// 名称: 换月测试
// 类别: 公式应用
// 类型: 用户应用
// 输出:
//------------------------------------------------------------------------
Params
Numeric AvgLen1(6);
Numeric AvgLen2(12);
Numeric AvgLen3(28);
Vars
//期货
Dic<Numeric> RolloverPrice("TB_ROLLOVER_futuresPrice"); //获取换月基础数据
//共有变量
Series<Numeric> rOpen(0,60); //除权换月后新的开盘价
Series<Numeric> rHigh(0,60); //除权换月后新的最高价
Series<Numeric> rLow(0,60); //除权换月后新的最低价
Series<Numeric> rClose; //除权换月后新的收盘价
Global Numeric Rollover; //除权换月系数
Global Numeric Lots; //交易手数
Global Numeric i;
// 策略变量
Series<Numeric> Avg1; //指数移动平均1
Series<Numeric> Avg2; //指数移动平均2
Series<Numeric> Avg3; //指数移动平均3
Series<Bool> BuyCon1(False); //做多条件之一
Series<Bool> SellCon1(False); //做空条件之一
Events
OnBar(ArrayRef<Integer> indexs)
{
Range[i=0:DataCount()-1]
{
If(CurrentBar==0)
{
rOpen=Open;
rHigh=High;
rLow=Low;
rClose=Close;
Rollover=1;
}
Else If(ExchangeName<>"上海证券交易所" And ExchangeName<>"深圳证券交易所") //期货换月
{
If(RolloverPrice[1]<>RolloverPrice[2] And RolloverPrice[1]<> InvalidNumeric
/* And (Mid(Symbol,2,3) == "888" Or Mid(Symbol,1,3) == "888") */)
{
//PlotDic(RolloverPrice);
PlotBool("换月",True);
Commentary("原合约收盘价:"+Text(Close));
Commentary("新合约收盘价:"+Text(RolloverPrice));
Rollover=rClose/RolloverPrice[1];
//Lots = Max(1,IntPart(Abs(CurrentContracts)*Rollover));
Lots=Max(1,Abs(CurrentContracts*Close[1]/RolloverPrice[1]));
If(MarketPosition==1)
{
Sell(0,Close[1],Enum_UnCorrectPrice);
Buy(Lots,RolloverPrice,Enum_UnCorrectPrice);
}
Else If(MarketPosition==-1)
{
BuyToCover(0,Close[1],Enum_UnCorrectPrice);
SellShort(Lots,RolloverPrice,Enum_UnCorrectPrice);
}
}
}
rOpen=Open*Rollover;
rHigh=High*Rollover;
rLow=Low*Rollover;
rClose=Close*Rollover;
PlotKline(rOpen,rHigh,rLow,rClose);
// 集合竞价和小节休息过滤
If(!CallAuctionFilter()) Return;
//初始设置
Avg1=Average(rClose,AvgLen1);
Avg2=Average(rClose,AvgLen2);
//在图表上划出指数移动平均线
PlotNumeric("Avg1",Avg1);
PlotNumeric("Avg2",Avg2);
//Avg1向上穿过Avg2为买入条件之一
BuyCon1=CrossOver(Avg1,Avg2);
sellCon1=Crossunder(avg1,avg2);
//BuyCon1满足且Avg2大于Avg3时,做多
If(MarketPosition==0 and BuyCon1[1] And Vol > 0)
Buy(0,Open);
//Avg1小于Avg2多头出场
If(MarketPosition==1 And BarsSinceEntry>0 And sellCon1[1] And Vol > 0)
Sell(0,Open);
//BuyCon1满足且Avg2大于Avg3时,做多
If(MarketPosition==0 and SellCon1[1] )
SellShort(0,Open);
//Avg1小于Avg2多头出场
If(MarketPosition==-1 And BarsSinceEntry>0 And BuyCon1[1] And Vol > 0)
BuyToCover(0,Open);
/*
PlotDic(xdxr_price);
PlotNumeric("MA1",AverageFC(rClose,Length1));
PlotNumeric("MA2",AverageFC(rClose,Length2));
PlotNumeric("MA3",AverageFC(rClose,Length3));
PlotNumeric("MA4",AverageFC(rClose,Length4));
Commentary("ma1"+Text(AverageFC(rClose,Length1)));
PlotNumeric("rClose",rClose);
PlotNumeric("rHigh",rHigh);
PlotNumeric("rLow",rLow);
PlotNumeric("rOpen",rOpen);
*/
}
}
//------------------------------------------------------------------------
// 编译版本 GS2015.12.25
// 用户版本 2019/08/13 13:46:00
// 版权所有 tianjixuetu
// 更改声明 TradeBlazer Software保留对TradeBlazer平台
// 每一版本的TradeBlazer公式修改和重写的权利
//------------------------------------------------------------------------
复制代码
欢迎光临 开拓者期货期权程序化系统交易论坛 (http://bbs.tb18.net/)
Powered by Discuz! X2