全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
关于SAR状态当中极值最高价最低价问题请教
ttp6319 分享到
2022-12-07 14:04

If (CurrentBar == 0)    //在第一根K线
    {
        TbPosition = 1 ;    //持仓状态为多头
        Transition = 1 ;    //持仓状态反转,状态值为1,表示为多头
        Af = AfStep ;        //AF等于加速因子,初始值为0.02,最大值为AFlimit,最大值为0.2
        HHValue = High ;    //极点最高价,在当前K线,极点最高价为当前K线的最高价
        LLValue = Low ;        //极点最低价,在当前K线,极点最低价为当前K线的最低价
        oParClose = LLValue ;//当前K线的停损值,为极点最低价,该极点最低价为当前K线的最低价
        ParOpen = oParClose + Af * ( HHValue - oParClose) ;    //下一根K线的停损值,= 当前K线的停损值 + 加速因子*(极点最高价 - 当前K线的停损值(该值为极点最低价))
        If (ParOpen > Low)    //如果下一根K线的停损值,大于最低价
        {
            ParOpen = Low ;    //则下一根K线的停损值,等于最低价
        }
    }Else                    //K线的索引值大于0
    {    
        oTransition = 0 ;    //状态值为0,状态保持不变
        If (High > HHValue[1])    //如果最高价突破前一个极点最高价
        {
            HHValue = High;        //当前新K线当中的极点最高价变为最新K线的最高价
        }Else                    //如果新K线当中的最高价没有突破之前的极点最高价
        {
            HHValue = HHValue[1];//最新K线当中的极点最高价等于前一个极点最高价
        }
        
        If (Low < LLValue[1])    //如果新K线当中的最低价,跌破前一个极点最低价
        {
            LLValue = Low;        //当前新K线当中的极点最低价变为最新K线的最低价
        }Else                    //如果新K线当中的最低价没有突破之前的极点最低价
        {
            LLValue = LLValue[1];//最新K线当中的极点最低价等于前一个极点最低价
        }
        
        If ( TbPosition[1] == 1) //持仓状态,前一根K线的持仓状态为1,表示为多头持仓
        {
            If ( Low <= ParOpen[1])//如果最新价跌破ParOpen[1]的停损值
            {
                TbPosition = -1 ;    //最新K线的持仓状态变为-1,表示转为空头持仓
                oTransition = -1 ;    //最新K线上已经发生反转,反转后的状态值为-1;            
                oParClose = HHValue ;//当前BAR的停损值为,极点最高价
                HHValue = High ;    //极点最高价,等于当前K线的最高价
                LLValue  = Low ;    //极点最低价,等于当前K线的最低价
    
                Af = AfStep ;        //加速因子,初始值为0.02,最大值为0.2
                ParOpen = oParClose + Af * ( LLValue - oParClose ) ;    //下一根BAR的停损值 = 当前BAR的停损值 + 加速因子 * (极点最低价 - 当前BAR的停损值(当前BAR的停损值为极点最高价))
                    
                If (ParOpen < High)        //如果下一根K线的停损值,小于最高价
                {
                    ParOpen = High ;    //下一根K线的停损值,等于最新K线的最高价
                }
                
                If (ParOpen < High[1])    //如果下一根K线的停损值,小于前一根K线的最高价??????意味着当前Bar的最高价小于前一根BAR的最高价,当前K线的最高价小于前一根K线的最高价,下一个ParOpen大于当前K线的最高价
                {
                    ParOpen = High[1] ;    //下一根K线的停损值,等于前一根K线的最高价
                }
            }Else        //持仓状态未发生改变,状态值依旧为1,表示为多头持仓,最新K线的最低价未跌破前一根K线的ParOpen停损值
            {
                TbPosition = TbPosition[1];    //当前的持仓状态为前一根K线的持仓状态
                oParClose = ParOpen[1] ;        //当前BAR的停损值,等于ParOpen[1]            
                If (HHValue > HHValue[1] And Af[1] < AfLimit )    //如果最新K线的极点最高价大于之前K线的极点最高价,同时前一根K线的加速因子小于Aflimit(加速因子最大值)
                {
                    If(Af[1]+AfStep > AfLimit)    //如果前一根K线的加速因子 + 加速因子的默认值0.02 > 加速因子的最大值
                    {
                        Af = AfLimit ;    //当前K线的加速因子等于加速因子的最大值,最大值为0.2
                    }Else                        //如果前一根K线的加速因子 + 加速因子的默认值0.02 < 加速因子的最大值
                    {
                        Af = Af[1]+AfStep;        //当前K线的加速因子等于,前一根K线的加速因子 + 加速因子的默认值0.02
                    }                
                    
                }Else                        //最新K线的高价未创新高
                {
                    Af = Af[1];                //当前K线的加速因子等于前一根K线的加速因子
                }    
                ParOpen = oParClose + Af * ( HHValue - oParClose ) ;        //下一根BAR的停损值 = 前一根BAR的停损值 + 加速因子*(极点最高价 - 前一根BAR的停损值)        
    
                If (ParOpen > Low)    //下一根BAR的停损值,大于当前K线的最低价
                {
                    ParOpen = Low ;    //下一根BAR的停损值,等于当前K线的最低价
                }
                
                If (ParOpen > Low[1])    //下一根BAR的停损值,大于前一根K线的最低价,意味着最新的ParOpen小于当前K线的最低价
                {
                    ParOpen = Low[1];    //下一根BAR的停损值,等于前一根K线的最低价
                }
            }
        }Else //持仓状态为-1 ,表示空头状态
        {
            If (High >= ParOpen[1])    //如果最高价,大于ParOpen[1]的停损值,由空头状态转为多头持仓状态
            {
                TbPosition = 1 ;    //当前K线的持仓状态为1,表示多头持仓
                oTransition = 1 ;    //最新K线已经发生反转,反转后的状态值为1
                
                oParClose = LLValue ;    //当前BAR的停损值,等于极点最低价
                HHValue = High ;        //极点最高价,等于当前K线的最高价
                LLValue  = Low ;        //极点最低价,等于当前K线的最低价
                
                Af = AfStep ;            //加速因子 = AfStep,初始默认值为0.02
                ParOpen = oParClose + Af * ( HHValue - oParClose) ;    //下一个BAR的停损值 = 当前BAR的停损值 + 加速因子 * (极点最高价 - 当前BAR的停损值)
                If (ParOpen > Low)    //如果下一个BAR的停损值大于当前K线的最低价
                {
                    ParOpen = Low ;    //下一个BAR的停损值 = 当前K线的最低价
                }
                
                If (ParOpen > Low[1])    //如果下一个BAR的停损值大于前一根K线的最低价,ParOpen小于当前的K线的最低价,大于前一根K线的最低价,当前K线的最低价大于前一根K线的最低价
                {
                    ParOpen = Low[1];    //下一个BAR的停损值 = 前一根K线的最低价
                }
            }Else    //持仓状态未发生改变,最高价没有突破ParOpen[1]的停损价,状态值依旧为-1,表示空头状态
            {
                TbPosition = TbPosition[1];    //当前K线的持仓状态等于前一根K线的持仓状态,依旧为-1
                oParClose = ParOpen[1];        //当前BAR的停损值,等于ParOpen[1]
                    
                If (LLValue < LLValue[1] And Af[1] < AfLimit )    //当前K线的极点最低价小于前一根K线的极点最低价,同时前一根K线的加速因子小于加速因子最大值0.2
                {
                    If(Af[1]+AfStep > AfLimit)        //如果前一根K线的加速因子加上加速因子默认值0.02 > 加速因子的最大值
                    {
                        Af = AfLimit ;        //加速因子等于加速因子的最大值
                    }Else                    //如果前一根K线的加速因子加上加速因子默认值0.02 < 加速因子的最大值
                    {
                        Af = Af[1]+AfStep;    //加速因子 = 前一根K线的加速因子 + 加速因子的默认值
                    }
                }Else                    //最新K线的最低价未跌破前一根K线的极点最低价
                {
                    Af = Af[1];            //当前K线的加速因子,等于前一根K线的加速因子
                }
                ParOpen = oParClose + Af * ( LLValue - oParClose ) ;    //下一个BAR的停损值 = 当前BAR的停损值 + 加速因子 * (极点最低价 - 当前BAR的停损值)
    
                If (ParOpen < High)    //如果下一个BAR的停损值,小于当前K线的最高价
                {
                    ParOpen = High ;//则下一个BAR的停损值,等于当前K线的最高价
                }
                
                If (ParOpen < High[1])//如果下一根BAR的停损值,小于前一根K线的最高价,ParOpen大于当前K线的最高价,小于前一根K线的最高价,当前K线的最高价小于前一根K线的最高价
                {
                    ParOpen = High[1] ;//则下一个BAR的停损值,等于前一根K线的最高价
                }
            }
        }    
    }    
    oParOpen = ParOpen;
    oTbPosition = TbPosition;
    Return True;

请教老师,在系统公式当中的SAR代码当中,  ParOpen = oParClose + Af * ( HHValue - oParClose ) ;  ParOpen的价格通过计算已经获得了,但是在接下来的几行代码当中又通过If语句对ParOpen进行了赋值,

 If (ParOpen > Low)    //如果下一根K线的停损值,大于最低价
        {
            ParOpen = Low ;    //则下一根K线的停损值,等于最低价
        }

这应该怎么理解呢 ,在SAR多头行情当中,已经通过计算的方式得到了ParOpen的值,但是接着又通过If语句对ParOpen进行了判断,并且在If语句的范围当中,对ParOpen进行了赋值,最后在图表当中得到的ParOpen又是通过计算得来的,有点迷糊,希望老师有空可以帮忙解答一下,感激不尽

kyover

算法就是这样,按照算法就是这样判断的,不知道疑问在哪里?

2022-12-08 08:51
ttp6319
@kyover

oParClose = LLValue ;//当前K线的停损值,为极点最低价,该极点最低价为当前K线的最低价
        ParOpen = oParClose + Af * ( HHValue - oParClose) ;    //下一根K线的停损值,= 当前K线的停损值 + 加速因子*(极点最高价 - 当前K线的停损值(该值为极点最低价))
        If (ParOpen > Low)    //如果下一根K线的停损值,大于最低价
        {
            ParOpen = Low ;    //则下一根K线的停损值,等于最低价
        }

老师好,主要就是后面IF部分当中的内容,之前已经计算得出了,后面通过IF条件语句,后面方括号内进行重新赋值,为啥ParOpen的值没有被覆盖呢

2022-12-08 15:18
kyover
@ttp6319

这是条件啊 必须大于low才能覆盖啊

没有覆盖就是没有大于low啊

2022-12-08 15:43
您未登录,请先 登录注册 后发表评论
顶部