Params
//此处添加参数
Numeric Length(100); //定义布林周期
Numeric Offset(3); //定义布林宽度
Numeric Lots(1); //定义交易手数
Vars
//此处添加变量
Series<Numeric> UpLine; //上轨
Series<Numeric> DownLine; //下轨
Series<Numeric> MidLine; //中间线
Numeric Band;
Series<Numeric> DiffP; //价差
Events
OnInit()
{
AddDataFlag(Enum_Data_RolloverBackWard());
AddDataFlag(Enum_Data_RolloverRealPrice());
AddDataFlag(Enum_Data_AutoSwapPosition());
AddDataFlag(Enum_Data_IgnoreSwapSignalCalc());
}
onBar(ArrayRef<Integer> indexs)
{
//此处添加代码正文
//过滤集合竞价
//If(!CallAuctionFilter()) return;
DiffP = Data1.Close-Data0.Close; //计算两个合约之间价差,合约1-合约0
MidLine = AverageFC(DiffP,Length); //计算价差布林中轨
Band = StandardDev(DiffP,Length,1); //计算价差单位布林轨宽
UpLine = MidLine + Offset * Band; //计算价差布林上轨
DownLine = MidLine - Offset * Band; //计算价差布林下轨
If(Data0.MarketPosition == 0 && Data1.MarketPosition == 0) //如果没有持有两个合约套利
{
If ( DiffP[1]>UpLine[1] ) //如果上一期合约之间价差大于布林上轨
{
Data0.Buy(Lots,Data0.Open); //以开盘价买入合约0
Data1.SellShort(Lots,Data1.Open); //以开盘价卖出合约1
}
If ( DiffP[1]<DownLine[1] ) //如果上一期合约之间价差小于布林下轨
{
Data0.SellShort(Lots,Data0.Open); //以开盘价卖出合约0
Data1.Buy(Lots,Data1.Open); //以开盘价买入合约1
}
}
If ( Data0.MarketPosition>0 && Data1.MarketPosition<0 && DiffP[1]<MidLine[1] ) //如果持有合约套利,合约价差小于布林中轨
{
Data0.Sell(Lots,Data0.Open); //以开盘价卖出合约0
Data1.BuyToCover(Lots,Data1.Open); //以开盘价买入合约1
}
If ( Data0.MarketPosition<0 && Data1.MarketPosition>0 && DiffP[1]>MidLine[1] ) //如果持有合约套利,合约价差大于布林中轨
{
Data0.BuyToCover(Lots,Data0.Open); //以开盘价买入合约0
Data1.Sell(Lots,Data1.Open); //以开盘价卖出合约1
}
}
这里加一句这个