设为首页收藏本站

 找回密码
 注册
查看: 2895|回复: 3
打印 上一主题 下一主题

我的模型为什么有时候超过止损点位不执行? [复制链接]

Rank: 1

精华
0
UID
189789
积分
3
帖子
2
主题
1
阅读权限
10
注册时间
2014-7-2
最后登录
2015-12-10
跳转到指定楼层
1#
发表于 2015-12-1 10:07:27 |只看该作者 |倒序浏览
我的模型是用在3分钟周期的棕榈油上,偶尔会发生超过止损点位很多却不执行止损的问题,止损部分的代码我是直接复制使用手册里的实例,以下是源码,请帮我找出问题所在,谢谢!
/------------------------------------------------------------------------
// 简称: P9888JYXT
// 名称: 棕榈油3分钟交易系统
// 类别: 公式应用
// 类型: 用户应用
//------------------------------------------------------------------------

Params
       
        Numeric Lots(1);
       
        Numeric MAzq(90);
       
        Numeric BK1diff(1.8);
        Numeric SK1diff(-1.9);
       
        Numeric BK2macd(0.8);
        Numeric SK2macd(2.1);
       
       
       
        Numeric Time_SWk(09.00);
        Numeric Time_XWzhK(23.05);
    Numeric time_XWqp(23.20);       
       
        Numeric BKadx1(10);
        Numeric BKadx2(58);
        Numeric BKkd(79);       
        Numeric BKboll(20);       
       
        Numeric SKadx1(18);
        Numeric SKadx2(68);
        Numeric SKkd(20);       
        Numeric SKboll(8);               
//////////////////////////////////////////////////////       

       

           Numeric StopLossSetB(9);    // 止损设置
        Numeric TrailingStop1B(35);  // 跟踪止损设置1
        Numeric TrailingStart1B(0); // 跟踪止损启动设置1
       
        Numeric StopLossSetS(9);    // 止损设置
        Numeric TrailingStop1S(36);  // 跟踪止损设置1
        Numeric TrailingStart1S(0); // 跟踪止损启动设置1

        Vars

        NumericSeries MACD;
        NumericSeries MACDav;
        NumericSeries MACDDiff;
       
        NumericSeries UpLine;                //上轨
        NumericSeries DownLine;                //下轨
        NumericSeries MidLine;        //中间线
        Numeric Band;
       
        NumericSeries MA60;
       
        Numeric up_x;
        Numeric down_x;
        Numeric min_x;

       
        Numeric zhangtingK;
        Numeric dietingK;
        Numeric zhangting;
        Numeric dieting;
       
       
    Numeric MinPoint;           // 一个最小变动单位,也就是一跳
        Numeric MyEntryPrice;       // 开仓价格
        Numeric MyExitPrice;        // 平仓价格
       
        NumericSeries HighestAfterEntry;        // 开仓后出现的最高价
    NumericSeries LowestAfterEntry;         // 开仓后出现的最低价
       
        //DMI最终输出
        NumericSeries oDMIPlus;
        NumericSeries oDMIMinus;
        NumericSeries oDMI;
        NumericSeries oADX;
        NumericSeries oADXR;
        NumericSeries oVolty;
//DMI过程计算
        NumericSeries sDMI;
        NumericSeries sADX;
        NumericSeries cumm;
        NumericSeries sVolty;
        Numeric PlusDM;
        Numeric MinusDM;
        Numeric UpperMove;
        Numeric LowerMove;
        Numeric SumPlusDM(0);
        Numeric SumMinusDM(0);
        Numeric SumTR(0);
        NumericSeries AvgPlusDM;
        NumericSeries AvgMinusDM;
        Numeric SF;                        // smoothing factor
        Numeric Divisor;
        Numeric i;
        NumericSeries TRValue;
//--------------------

    NumericSeries HighestValue;                               
        NumericSeries LowestValue;               
        NumericSeries KValue;
        NumericSeries SumHLValue;
        NumericSeries SumCLValue;
        NumericSeries DValue;

Begin

If(Date>20151230)
     {  Return;}

        MACD = XAverage( Close, 12 ) - XAverage( Close, 26 ) ;       
        MACDav = XAverage(MACD,9);
        MACDDiff = MACD - MACDav;
       
        MidLine = AverageFC(Close,26);
        Band = StandardDev(Close,26,2);
        UpLine = MidLine + 2 * Band;
        DownLine = MidLine - 2 * Band;
        PlotNumeric("UpLine",UpLine);
        PlotNumeric("DownLine",DownLine);
        PlotNumeric("MidLine",MidLine);
       
        MA60=AverageFC(Close,MAzq);
       
                // 集合竞价和小节休息过滤
        If(!CallAuctionFilter()) Return;
       
        Minpoint=Minmove*PriceScale;
        //DMI指标计算, 最终将输出ADX指标
        //--------------------------DMI计算开始-----------------------------------//
                SF = 1/14;
        TRValue = TrueRange;
        If(CurrentBar == 14)
        {
                        For i = 0 To 14 - 1
                        {
                                        PlusDM = 0 ;
                                        MinusDM = 0 ;
                                        UpperMove = High[i] - High[ i + 1 ] ;
                                        LowerMove = Low[ i + 1 ] - Low[i] ;
                                        If (UpperMove > LowerMove and UpperMove > 0 )
                                        {
                                                        PlusDM = UpperMove;
                                        }Else if (LowerMove > UpperMove and LowerMove > 0)
                                        {
                                                        MinusDM = LowerMove ;
                                        }
                                        SumPlusDM = SumPlusDM + PlusDM ;
                                        SumMinusDM = SumMinusDM + MinusDM ;
                                        SumTR = SumTR + TRValue[i] ;
                        }
                        AvgPlusDM = SumPlusDM / 14 ;
                        AvgMinusDM = SumMinusDM / 14 ;
                        sVolty = SumTR / 14 ;
        }Else if(CurrentBar > 14)
        {
                        PlusDM = 0 ;
                        MinusDM = 0 ;
                        UpperMove = High - High[1] ;
                        LowerMove = Low[1] -Low ;
                        If (UpperMove > LowerMove and UpperMove > 0 )
                        {
                                        PlusDM = UpperMove;
                        }Else if (LowerMove > UpperMove and LowerMove > 0 )
                        {
                                        MinusDM = LowerMove ;
                        }
                        AvgPlusDM = AvgPlusDM[1] + SF * ( PlusDM - AvgPlusDM[1] ) ;
                        AvgMinusDM = AvgMinusDM[1] + SF * ( MinusDM - AvgMinusDM[1] ) ;
                        sVolty = sVolty[1] + SF * ( TRValue  - sVolty[1] ) ;
        }Else
        {
                        oDMIPlus = InvalidNumeric;
                        oDMIMinus = InvalidNumeric;
                        oDMI = InvalidNumeric;
                        oADX = InvalidNumeric;
                        oADXR = InvalidNumeric;
                        oVolty = InvalidNumeric;
        }
       
        If (sVolty > 0)
        {
                        oDMIPlus = 100 * AvgPlusDM / sVolty ;
                        oDMIMinus = 100 * AvgMinusDM / sVolty ;
        }Else
        {
                        oDMIPlus = 0 ;
                        oDMIMinus = 0 ;
        }

        Divisor = oDMIPlus + oDMIMinus ;
        if (Divisor > 0)
        {
                        sDMI = 100 * Abs( oDMIPlus - oDMIMinus ) / Divisor;
        }else
        {
                        sDMI = 0 ;
        }
        cumm=Cum( sDMI );
        If(CurrentBar > 0)
        {
                        If (CurrentBar <= 14)
                        {
                                        sADX = Cumm / CurrentBar ;
                                        oADXR = ( sADX + sADX[ CurrentBar - 1 ] ) * 0.5 ;
                        }Else  
                        {
                                        sADX = sADX[1] + SF * ( sDMI - sADX[1] ) ;
                                        oADXR = ( sADX + sADX[ 30 - 1 ] ) * 0.5 ;
                        }
        }
        oVolty = sVolty;
        oDMI = sDMI;
        oADX = sADX;
       
        HighestValue = HighestFC(High, 14);
        LowestValue = LowestFC(Low, 14);
        SumHLValue = SummationFC(HighestValue-LowestValue,3);
        SumCLValue = SummationFC(Close - LowestValue,3);
        If(SumHLValue <> 0)
        {
                KValue = SumCLValue/SumHLValue*100;
        }Else
        {
                KValue = 0;
        }
        DValue = AverageFC(KValue,3);
       
        PlotNumeric("MA60",MA60,0,Red);
       

       
        If(MarketPosition==0&&Time>=Time_SWk/100 &&Time<=Time_XWzhK/100&&oADX[1]>BKadx1&&oADX[1]<BKadx2&&KValue[1]<BKkd&&UpLine[1]-DownLine[1]>BKboll)
        {
       
          If(MACDDiff[1]>BK1diff&&MACD[2]<0&&MACD[1]>0)//1
    {
        Buy(Lots,Open);
     
    }
       
        If(MACD[1]>BK2macd&&MACDDiff[2]<0&&MACDDiff[1]>0)//2
    {
        Buy(Lots,Open);
      
    }
       

        }
               
       
        /////////////////////////////////////////////////////////////////////////////////////////////////
        /////////////////////////////////////////////////////////////////////////////////////////////////
        If(MarketPosition==0&&Time>=Time_SWk/100 &&Time<=Time_XWzhK/100&&oADX[1]>SKadx1&&oADX[1]<SKadx2&&KValue[1]>SKkd&&UpLine[1]-DownLine[1]>SKboll)
        {
       
    If(MACDDiff[1]<SK1diff&&MACD[2]>0&&MACD[1]<0)//1
    {
        SellShort(Lots,Open);

    }

       
         If(MACD[1]<SK2macd&&MACDDiff[2]>0&&MACDDiff[1]<0)//2
    {
        SellShort(Lots,Open);
      
    }
       
       
       
       
        }
       
        /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        If(BarsSinceentry == 0)
    {
        HighestAfterEntry = Close;
        LowestAfterEntry = Close;
        If(MarketPosition <> 0)
        {
            HighestAfterEntry = Max(HighestAfterEntry,AvgEntryPrice);   // 开仓的Bar,将开仓价和当时的收盘价的较大值保留到HighestAfterEntry
            LowestAfterEntry = Min(LowestAfterEntry,AvgEntryPrice);     // 开仓的Bar,将开仓价和当时的收盘价的较小值保留到LowestAfterEntry
        }
    }else
    {
        HighestAfterEntry = Max(HighestAfterEntry,High); // 记录下当前Bar的最高点,用于下一个Bar的跟踪止损判断
        LowestAfterEntry = Min(LowestAfterEntry,Low);    // 记录下当前Bar的最低点,用于下一个Bar的跟踪止损判断
    }

    Commentary("HighestAfterEntry="+Text(HighestAfterEntry));
    Commentary("LowestAfterEntry="+Text(LowestAfterEntry));

    MinPoint = MinMove*PriceScale;
    MyEntryPrice = AvgEntryPrice;

         If(MarketPosition==1) // 有多仓的情况
    {
        if(HighestAfterEntry[1] >= MyEntryPrice + TrailingStart1B*MinPoint)// 第一级跟踪止损的条件表达式
        {
            If(Low <= HighestAfterEntry[1] - TrailingStop1B*MinPoint)
            {
                MyExitPrice = HighestAfterEntry[1] - TrailingStop1B*MinPoint;
                                If(Open < MyExitPrice) MyExitPrice = Open;      // 如果该Bar开盘价有跳空触发,则用开盘价代替
               
                Sell(0,MyExitPrice);
            }
        }else if(Low <= MyEntryPrice - StopLossSetB*MinPoint)//可以在这里写上初始的止损处理
        {
            MyExitPrice = MyEntryPrice - StopLossSetB*MinPoint;
                         If(Open < MyExitPrice) MyExitPrice = Open;      // 如果该Bar开盘价有跳空触发,则用开盘价代替

            Sell(0,MyExitPrice);
        }
    }
        else if(MarketPosition==-1) // 有空仓的情况
    {
        if(LowestAfterEntry[1] <= MyEntryPrice - TrailingStart1S*MinPoint)// 第一级跟踪止损的条件表达式
        {
            If(High >= LowestAfterEntry[1] + TrailingStop1S*MinPoint)
            {
                MyExitPrice = LowestAfterEntry[1] + TrailingStop1S*MinPoint;
                If(Open > MyExitPrice) MyExitPrice = Open;      // 如果该Bar开盘价有跳空触发,则用开盘价代替
                BuyToCover(0,MyExitPrice);
            }
        }else If(High >= MyEntryPrice + StopLossSetS*MinPoint)//可以在这里写上初始的止损处理
        {
            MyExitPrice = MyEntryPrice + StopLossSetS*MinPoint;
           If(Open > MyExitPrice) MyExitPrice = Open;      // 如果该Bar开盘价有跳空触发,则用开盘价代替
            BuyToCover(0,MyExitPrice);
        }
    }
       
       
         

       
                If(Time >=time_XWqp/100)
    {
        Sell(0,Open);
        BuyToCover(0,Open);
    }

       


         End

期市新手

TB官方客服

Rank: 1

精华
0
UID
160971
积分
16
帖子
13
主题
1
阅读权限
10
注册时间
2011-1-1
最后登录
2022-10-26
2#
发表于 2015-12-2 16:52:54 |只看该作者
代码看了一下,没看出什么问题
麻烦你用现有参数,找一个具体的应该止损又没有止损的位置,把截图发上来看看

使用道具 举报

Rank: 1

精华
0
UID
189789
积分
3
帖子
2
主题
1
阅读权限
10
注册时间
2014-7-2
最后登录
2015-12-10
3#
发表于 2015-12-4 09:00:50 |只看该作者
我整个模型都完整贴出来了,也说明了具体是用在棕榈油的3分钟周期里,你直接复制模型在P9888里面回测看一下不比我截图看的更清楚吗?

使用道具 举报

期市新手

TB官方客服

Rank: 1

精华
0
UID
160971
积分
16
帖子
13
主题
1
阅读权限
10
注册时间
2011-1-1
最后登录
2022-10-26
4#
发表于 2015-12-4 10:24:21 |只看该作者
hongli788 发表于 2015-12-4 09:00
我整个模型都完整贴出来了,也说明了具体是用在棕榈油的3分钟周期里,你直接复制模型在P9888里面回测看一下 ...

看了,没看出问题
所以需要你给一个具体的有问题的时间点

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

bottom

静态版|手机版|联系我们|交易开拓者 ( 粤ICP备07044698   

GMT+8, 2024-5-17 10:25

Powered by Discuz! X2 LicensedChrome插件扩展

© 2011-2012 交易开拓者 Inc.

回顶部