怎么也想不通的关于开平仓的问题

请教老师: 很简单的一个案例程序,做多和做空系统各用不同的布林通道开平仓。因为做空的布林通道波动区间较小,所以经常会抢在做多系统平仓之前开空单,所以我想能不能把开空仓的信号也变成平多单,结果程序就变得乱七八糟,想了好几个月,也不知道问题出现在哪里? 以下是我的程序: 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线部分的开平仓信号也与原来的内容变得完全不同。 我百思不得其解,请诸位老师、高手指点!将能达到我要求的正确的代码写出来 ,非常感谢!

谢谢老师!

第一个图信号没什么问题 第二个问题我按照你的改了,没出现什么信号完全消失 你改了代码那信号当然跟修改前不同 程序只是按照你写的执行,你确定你理解自己写的吗 你这个布林线多空参数不一样是不是对你产生了误解