- 精华
- 0
- 在线时间
- 87 小时
- UID
- 282502
- 积分
- 243
- 帖子
- 84
- 阅读权限
- 40
- 注册时间
- 2019-8-13
- 最后登录
- 2020-10-26
- 精华
- 0
- UID
- 282502
- 积分
- 243
- 帖子
- 84
- 主题
- 35
- 阅读权限
- 40
- 注册时间
- 2019-8-13
- 最后登录
- 2020-10-26
|
重新开一个帖子,咨询相关的问题。
提供了一个最简单的双均线策略,供讨论具体的代码。
从代码中可以看出,期货的主力合约在换月的时候是进行向后复权的,在换约的时候,先平掉原有的合约,然后开新的,经过换算后的不同仓位的在新的合约上。这是上面代码已经默认实现的,写策略的时候可以不用考虑了。
在我们自己写新的策略的时候,我们获取行情和下单要如何操作呢?
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公式修改和重写的权利
- //------------------------------------------------------------------------
复制代码 |
|