请教老师:
很简单的一个案例程序,做多和做空系统各用不同的布林通道开平仓。因为做空的布林通道波动区间较小,所以经常会抢在做多系统平仓之前开空单,所以我想能不能把开空仓的信号也变成平多单,结果程序就变得乱七八糟,想了好几个月,也不知道问题出现在哪里?
以下是我的程序:
Params
Numeric AvgLen(5); //多单boll均线周期参数
Numeric Disp(17); //多单boll平移参数
Numeric SDLen(12); //多单boll标准差周期参数
Numeric SDev(3); //多单boll通道倍数参数
Numeric AvgLenS(3); //空单boll均线周期参数
Numeric DispS(17); //空单boll平移参数
Numeric SDLenS(11); //空单boll标准差周期参数
Numeric SDevS(1); //空单boll通道倍数参数
Vars
Series<Numeric> AvgVal(0); //多单中轨
Series<Numeric> SDmult(0); //多单通道距离
Series<Numeric> DispTop(0); //多单通道高点
Series<Numeric> DispBottom(0); //多单通道低点
Series<Numeric> AvgValS(0); //空单中轨
Series<Numeric> SDmultS(0); //空单通道距离
Series<Numeric> DispTopS(0); //空单通道高点
Series<Numeric> DispBottomS(0); //空单通道低点
Numeric lots; //委托数量
Events
OnBar(ArrayRef<Integer> indexs)
{
//开仓条件计算
lots=IntPart(rollover*Portfolio_CurrentCapital()/(open*contractunit*BigPointValue*0.2)); //计算开仓手数
//多单平移boll通道计算
AvgVal = Average(Close,AvgLen);
SDmult = StandardDev(Close,SDLen,2)*SDev;
DispTop = AvgVal[Disp] + SDmult;
DispBottom = AvgVal[Disp] - SDmult;
PlotNumeric("DispTop",DispTop);
PlotNumeric("DispBottom",DispBottom);
//空单平移boll通道计算
AvgValS = Average(Close,AvgLenS);
SDmultS = StandardDev(Close,SDLenS,2)*SDevS;
DispTopS = AvgValS[DispS] + SDmultS;
DispBottomS = AvgValS[DispS] - SDmultS;
PlotNumeric("DispBottomS",DispBottomS);
PlotNumeric("DispTopS",DispTopS);
//系统出场
If(MarketPosition == 1 And BarsSinceEntry > 0)
{
If(Low <= DispBottom[1])
{
Sell(0,Min(Open,DispBottom[1]));
}
}
If(MarketPosition == -1 And BarsSinceEntry > 0)
{
If(High >= DispTopS[1])
{
BuyToCover(0,Max(Open,DispTopS[1]));
}
}
//系统入场
If(MarketPosition == 0)
{
If(High >= DispTop[1])
{
Buy(lots,Max(Open,DispTop[1]));
}
}
If(MarketPosition == 0)
{
If(Low <= DispBottomS[1])
{
SellShort(lots,Min(Open,DispBottomS[1]));
}
}
}
在程序运行的K线图中经常会看到以下图像:
也就是空单先开,然后多单平仓。于是我想在做空程序不变的情况下,将多单的平仓点移到做空的开仓点。于是我将程序中的此部分
//系统出场
If(MarketPosition == 1 And BarsSinceEntry > 0)
{
If(Low <= DispBottom[1])
{
Sell(0,Min(Open,DispBottom[1]));
}
}
修改为以下内容。
//系统出场
If(MarketPosition == 1 And BarsSinceEntry > 0)
{
If(Low <= DispBottomS[1])
{
Sell(0,Min(Open,DispBottomS[1]));
}
}
结果呢?
这一部分没有任何开平仓,而且其它的K线部分的开平仓信号也与原来的内容变得完全不同。
我百思不得其解,请诸位老师、高手指点!将能达到我要求的正确的代码写出来 ,非常感谢!
谢谢老师!
第一个图信号没什么问题
第二个问题我按照你的改了,没出现什么信号完全消失
你改了代码那信号当然跟修改前不同
程序只是按照你写的执行,你确定你理解自己写的吗
你这个布林线多空参数不一样是不是对你产生了误解