这是很久以前论坛里某个网友写的,比较接近文华的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) ;
}
参考内建函数ParabolicSAR是不是你想要的
TB自带的那个不是我想要的
我之前写过一个,麻烦你自己对比一下是不是一样?
//------------------------------------------------------------------------
// 简称: 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
这个可以,太感谢了!
这个可以,太感谢了
大神,我在V6旗舰版里面,实际编译了一下,对于 If (Position == 1) Return CurSar; 这一行,系统报错:RETURN语句的返回值类型与公式定义的返回值类型不符。请教大神,怎么破:)