全部 智大领峰 TBQuant功能 TBL语言 TB开户 问答专区 高手圈 其他
已解决
能不能把这个sar指标改一下?
2021-12-30 18:10

这是很久以前论坛里某个网友写的,比较接近文华的sar,因为自己也比较习惯了文华的sar。

但这个指标有个问题,就是反转的第一根K线不显示sar值,导致取不了反转时的sar值,谁能帮改一下,或者另外写一个也行,出来效果跟这个一样就行了。

//代码如下

Params
          Numeric AfStep(2);//参数设为2比较接近文华
          Numeric AfLimit(2);
          Numeric Length(20);
Vars
          series<Numeric> Mysar;
          Series<Numeric> Mysar1;
          Series<Numeric> Mysar2;
          Series<Numeric> HH;
          Series<Numeric> LL;
          Series<Numeric> MaxH;
          Series<Numeric> MinL;
          Numeric       Xp;
          Numeric       Xk;
          Numeric       J;

          
Events
    onBar(ArrayRef<Integer> indexs)
    {    
                     HH = HighestFC(H,Length);
                     LL = LowestFC(L,Length);
             If(CurrentBar< Length+1)
                {
                      Mysar = 0.5*(L+H);
                      Mysar1 = 0;
                      Mysar2 = 88888;
                      MaxH  = HH;
                      MinL  = LL;
                         }Else
                     If(CurrentBar == Length+1)
                {
                           If(H<MaxH)
                           {
                             MaxH = Max(HH,MaxH[1]);
                             MinL = Min(LL,MinL[1]);
                             Mysar = MaxH;
                             Mysar1 = MaxH;
                             Mysar2 = 88888;
                             SetGlobalVar(0,CurrentBar);
                       }Else
                       {
                             MaxH = Max(HH,MaxH[1]);
                             MinL = Min(LL,MinL[1]);
                             Mysar = MinL;
                             Mysar1 = 0;
                             Mysar2 = MinL;
                         SetGlobalVar(0,CurrentBar);
                       }
                    }Else
          If(CurrentBar > Length+1)
            {
                      J = CurrentBar - GetGlobalVar(0);
                      If(J == 0)
               {
                            If(Mysar1 > 0)
                             {
                               MaxH = Max(H,MaxH[1]);
                               MinL = Min(L,MinL[1]);
                               Mysar = MaxH;
                               Mysar1 = MaxH;
                               Mysar2 = 88888;
                             }Else
                            If(Mysar2<88888)
                         {
                               MaxH = Max(H,MaxH[1]);
                               MinL = Min(L,MinL[1]);
                               Mysar = MinL;
                               Mysar1 = 0;
                               Mysar2 = MinL;
                             }
               }Else
                      If( J>0 )
                       {                          
                             If(H[1] <= Mysar1[1])
                  { 
                    
                                    Xp = L[1] - Mysar1[1];
                                    If(J<11)
                                     {
                                       Mysar1 = Mysar1[1]+AfStep*j*XP/100;
                                       MaxH = Min(H,MaxH[1]);
                                       MinL = Min(L,MinL[1]);
                                       Mysar2 = 88888;                           
                                   If(H > Mysar1)
                        { 
                                             
                                             SetGlobalVar(0,CurrentBar);    //满足条件的Bar索引号//
                         MaxH = Max(H,MaxH[1]);
                                     MinL = Min(L,MinL[1]);
                                     Mysar1 = 0;
                                     Mysar2 = MinL;                                         
                                             Return;
                                            }
                     }Else
                                     {
                       Mysar1 = Mysar1[1]+AfLimit*XP/10;
                                       MaxH = Min(H,MaxH[1]);
                                       MinL = Min(L,MinL[1]);
                                       Mysar2 = 88888;                
                                   If(H > Mysar1)
                        { 
                                             
                                             SetGlobalVar(0,CurrentBar);    //满足条件的Bar索引号//
                         MaxH = Max(H,MaxH[1]);
                                     MinL = Min(L,MinL[1]);
                                     Mysar1 = 0;
                                     Mysar2 = MinL;                                         
                                             Return;
                                            }
                                 }
                  }Else
                            If(Low[1] >= Mysar2[1])
                              {  
                                    
                                Xk =High[1] - Mysar2[1];
                                    If(J<11)
                                     {
                                       Mysar2 = Mysar2[1]+AfStep*j*Xk/100;
                                       MaxH = Max(H,MaxH[1]);
                                       MinL = Max(L,MinL[1]);
                                       Mysar1 = 0;                           
                                   If(Low < Mysar2)
                        {
                                             
                                             SetGlobalVar(0,CurrentBar);    //满足条件的Bar索引号//
                         MaxH = Max(H,MaxH[1]);
                                     MinL = Max(L,MinL[1]);
                                     Mysar1 = MaxH;
                                     Mysar2 = 88888;                                         
                                             Return;
                                            }
                     }Else
                                     {
                       Mysar2 = Mysar2[1]+AfLimit*Xk/10;
                                       MinL = Max(L,MinL[1]);
                                       MaxH = Max(H,MaxH[1]);
                                       Mysar1 = 0;                           
                                   If(Low <= Mysar2)
                        { 
                                              
                                             SetGlobalVar(0,CurrentBar);    //满足条件的Bar索引号//
                         MaxH = Max(H,MaxH[1]);
                                     MinL = Max(L,MinL[1]);
                                     Mysar1 = MaxH;
                                     Mysar2 = 88888;                                         
                                             Return;
                                            }
                                 }                                                        
                              }
    
                 If(Mysar1 > 0)
                             {
                            
                               Mysar = Mysar1;                        
                             }Else
                            If(Mysar2<88888)
                         {
                               
                               Mysar = Mysar2;
                             }
                                                     
                       }
                    }
                    PlotNumeric( "1" , Mysar) ;

              
                    
    }
 

riv

参考内建函数ParabolicSAR是不是你想要的

2021-12-30 22:45
alang2005
@riv

TB自带的那个不是我想要的

2021-12-31 01:24
tblaocai
@alang2005

我之前写过一个,麻烦你自己对比一下是不是一样?

//------------------------------------------------------------------------
// 简称: SarWH
// 名称: 抛物线转向指标_文华
// 类别: 公式应用
// 类型: 用户应用
// 输出:
//------------------------------------------------------------------------


Params
    Numeric Length(4);
    Numeric AfStep( 0.02);
    Numeric AfLimit( 0.2 ) ;
Vars
    Numeric SarValue;
    
Begin
 
    SarValue = Abs(ParabolicWH(Length,AfStep,AfLimit));
    PlotNumeric("SarWH",SarValue);
    
End

 

//------------------------------------------------------------------------
// 简称: ParabolicWH
// 名称: 
// 类别: 用户函数
// 类型: 用户函数
// 输出: 数值型
//------------------------------------------------------------------------
 
Params
    Numeric Length(4);
    Numeric AfStep(0.02);
    Numeric AfLimit(0.2);
Vars
    NumericSeries Af(0);    
    NumericSeries Position(0);    
    NumericSeries NextSar;    
    NumericSeries CurSar;    
    NumericSeries HHValue(0);
    NumericSeries LLValue(99999999);
Begin

    If(CurrentBar < Length)
    {
        HHValue = Max(HHValue,H);
        LLValue = Min(LLValue,L);
    }
    Else
    {
        If(CurrentBar == Length)
        {
            If(C[1] > O[Length])
            {
                Position = 1;
                CurSar = Min(LLValue[1],L);
                HHValue = H;
            }
            Else
            {
                Position = -1;
                CurSar = Max(HHValue[1],H);
                LLValue = L;
            }
            Af = AfStep;
        }
        Else If((Position[1] == 1 And L < NextSar[1]) Or (Position[1] == -1 And H > NextSar[1]))    // 转向
        {
            If(Position[1] == 1 And L < NextSar[1])
            {
                Position = -1;
                CurSar = Max(H,HHValue[1]);
                LLValue = L;
            }
            
            If(Position[1] == -1 And H > NextSar[1])
            {
                Position = 1;
                CurSar = Min(L,LLValue[1]);
                HHValue = H;
            }
            Af = AfStep;
        }
        Else        // 无转向发生
        {
            CurSar = NextSar[1];
            HHValue = Max(H,HHValue[1]);
            LLValue = Min(L,LLValue[1]);
            Af = Min(Af + AfStep,AfLimit);
        }
        
        If(Position == 1) NextSar = CurSar + (H - CurSar) * Af;
        If(Position == -1) NextSar = CurSar - (CurSar - L) * Af;

    }

    If(Position == 1) Return CurSar;
    Else If(Position == -1) Return -1*CurSar;
    Else Return 0;
End
 

2021-12-31 14:27
alang2005
@tblaocai

这个可以,太感谢了yes

2021-12-31 19:26
afei0617
@tblaocai

大神,我在V6旗舰版里面,实际编译了一下,对于 If (Position == 1) Return CurSar; 这一行,系统报错:RETURN语句的返回值类型与公式定义的返回值类型不符。请教大神,怎么破:)

2023-04-08 10:33
alang2005
@riv

这个可以,太感谢了!yes

2021-12-31 19:25
您未登录,请先 登录注册 后发表评论
顶部