全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
已解决
怎么也想不通的关于开平仓的问题
luoyushu 分享到
2022-09-30 19:46

请教老师:

很简单的一个案例程序,做多和做空系统各用不同的布林通道开平仓。因为做空的布林通道波动区间较小,所以经常会抢在做多系统平仓之前开空单,所以我想能不能把开空仓的信号也变成平多单,结果程序就变得乱七八糟,想了好几个月,也不知道问题出现在哪里?

以下是我的程序:

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线部分的开平仓信号也与原来的内容变得完全不同。

我百思不得其解,请诸位老师、高手指点!将能达到我要求的正确的代码写出来 ,非常感谢!

wangkaiming

第一个图信号没什么问题

 

第二个问题我按照你的改了,没出现什么信号完全消失

你改了代码那信号当然跟修改前不同

 

程序只是按照你写的执行,你确定你理解自己写的吗

你这个布林线多空参数不一样是不是对你产生了误解

2022-10-08 08:19
luoyushu

谢谢老师!

2023-07-23 12:43
您未登录,请先 登录注册 后发表评论
顶部