编码帮助 - 页 170

 

是的......我不知道我是多么的心不在焉。感谢你的及时建议,TB_TotalCount和VACount的数字变得正确且绝对合理。但我寻找VA高/低的目标仍有问题,我的电脑在这部分的编码中又崩溃了。现在又想知道为什么。

非常感谢Mladen!你的建议让我在整个白夜之后有了部分笑容

 

嗨,Mladen。

我只是想告诉大家,我终于解决了我的其他问题。我正在努力改进它。

虽然你在这种情况下给我的帮助很少,但我发现这有时是教那些站在自己脚下学习的人的最好方法。

我从心底里感谢你,Mladen !

祝你未来的日子愉快。

衷心感谢

 
zilliq:
嗨,Mladen。

我成功地使用了相对和绝对动量

非常感谢你的帮助,现在我需要对RSX的动量进行平滑处理。

Zilliq

Ps: 如果它能帮助别人的话。

//收盘时的相对动量

ind1= close-close[1]。

// 绝对动量

ind2=abs(ind1)

ind3=wilderAverage[rs](ind1)

ind4=wilderAverage[rs](ind2)

ind3=(50*(ind3+ind4))/ind4

返回 ind3 as "RSI",0, 30, 70, 100

Zilliq

请看这个帖子:https://www.mql5.com/en/forum/178733/page36

你有一个例子,可以在那里完成(平滑)。

 

谢谢Mladen,我会看到的

祝你今天愉快,感谢你的帮助和工作

Zilliq

 

好吧,如果我已经很好地理解了你的指标rsi smoother 2,你只是通过函数 ismooth改变了更大的平均值。

而你 "平滑 "了相对和绝对动量。

我对Hull平均数也做了同样的处理,但结果与你在我的图片上看到的不一样。

你知道为什么吗,还是我搞错了?

谢谢 Mladen

代码RSI14和RSImoother 45

//收盘时的相对动量

ind1=收盘价-收盘价[1]

//绝对动量

ind2=abs(ind1)

//用赫尔平均法平滑相对动量

v =(2*加权平均[round(rs/2)](ind1))-加权平均[rs](ind1)

ind3 = weightedAverage[Round(Sqrt(rs))](v)

//用Hull平均值平滑绝对动量

v2 =(2*加权平均[round(rs/2)](ind2))-加权平均[rs](ind2)

ind4 = weightedAverage[Round(Sqrt(rs))](v2)

ind5=(50*(ind3+ind4))/ind4

返回ind5为 "RSI平滑"。

我用T3 Tillson代替了两者的野生平均数(相对动量和绝对动量),但问题相同

附加的文件:
 

这只是使用不同平滑方法 的结果。不同的平滑方法会产生不同的结果

如果你想得到与rsi主题中发布的rsi相媲美的结果,你必须使用该指标中使用的那种平滑法。

 

谢谢Mladen的回答

很奇怪,相对动量和绝对动量的平滑函数给出了这样的结果,而Hull平均数和T3则有些夸张。

您能否用数学公式解释一下(如果可能的话),MT4的平滑函数 是如何工作的,以获得一个与RSI相当的平滑RSI,请您解释一下,我将在之后编码。

非常感谢,祝你有一个愉快的一天

Zilliq

你的MT4代码和我的解释。

//相对动量

double mom = iMA(NULL,0,1,0,MODE_SMA, Price,i)-iMA(NULL,0,1,0,MODE_SMA,Price,i+1)。

//绝对动量

double moa = MathAbs(mom);

//用 "ismooth函数 "平滑相对动量

double tmom = iSmooth(mom,Length,SmoothSpeed,i,0);

//用 "ismooth函数 "平滑绝对动量

double tmoa = iSmooth(moa,Length,SmoothSpeed,i,1);

if (tmoa != 0)

//和比率50*(RM+AM)(AM)

rsi = MathMax(MathMin((tmom/tmoa+1.0)*50.0,100.00),0.00)。

否则rsi = 50;

 

Zilliq

你在那个指标里有它的源代码。只要把它转换为prorealtime

 

哎哟,对我来说,解释等效函数 并不容易 (与PRT相比,MT4是如此复杂)。

我试着把MT4的代码翻译成数学代码,然后在PRT上编码。

请您在我在PRT上编码之前,确认我对每一行下面的不同解释。

非常感谢 Mladen

Zilliq

double iSmooth(double price,int length, double speed, int r, int instanceNo=0)

{

if (ArrayRange(workSmooth,0)!=Bars) ArrayResize(workSmooth,Bars); instanceNo *= 5; r = Bars-r-1;

if(r<=2) { workSmooth[r] = price; workSmooth[r] = price; workSmooth[r] = price; return(price); }

//

//

//

//

//

_______________________________________________________________________

双倍β=0.45*(length-1.0)/(0.45*(length-1.0)+2.0)。

beta = 0.45*(length-1.0)/(0.45*(length-1.0)+2.0)

_______________________________________________________________________

double alpha = MathPow(beta,speed);

alpha = beta^speed

_______________________________________________________________________

workSmooth[r] = price+alpha*(workSmooth[r-1]-price);

Filt0 = price+alpha*(Filt0[1]-price);

_______________________________________________________________________

workSmooth[r]=(价格-workSmooth[r])*(1-alpha)+alpha*workSmooth[r-1]。

Filt1 = (价格-Filt0 )*(1-alpha)+alpha*Filt1[1]

_______________________________________________________________________

workSmooth[r] = workSmooth[r] + workSmooth[r];

Filt2 = Filt0 + Filt1

_______________________________________________________________________

workSmooth[r] = (workSmooth[r] - workSmooth[r-1])*MathPow(1.0-alpha,2) + MathPow(alpha,2)*workSmooth[r-1] 。

Filt3=Filt2-Filt4[1]*(1-alpha)*(1-alpha)+alpha*alpha*Filt3[1]

_______________________________________________________________________

workSmooth[r] = workSmooth[r] + workSmooth[r-1] 。

Filt4=Filt3+Filt4[1] 。

_______________________________________________________________________

return(workSmooth[r])。

返回 Filt4

 
zilliq:
对我来说,解释ismooth函数并不容易 (与PRT相比,MT4是如此复杂)。

我试图将MT4代码翻译成数学代码,然后在PRT上编码。

请您确认我在PRT上编码前对每行下面的不同行的解释。

非常感谢,Mladen

Zilliq

double iSmooth(double price,int length, double speed, int r, int instanceNo=0)

{

if (ArrayRange(workSmooth,0)!=Bars) ArrayResize(workSmooth,Bars); instanceNo *= 5; r = Bars-r-1;

if(r<=2) { workSmooth[r] = price; workSmooth[r] = price; workSmooth[r] = price; return(price); }

//

//

//

//

//

_______________________________________________________________________

双倍β=0.45*(length-1.0)/(0.45*(length-1.0)+2.0)。

beta = 0.45*(length-1.0)/(0.45*(length-1.0)+2.0)

_______________________________________________________________________

double alpha = MathPow(beta,speed);

alpha = beta^speed

_______________________________________________________________________

workSmooth[r] = price+alpha*(workSmooth[r-1]-price);

Filt0 = price+alpha*(Filt0[1]-price);

_______________________________________________________________________

workSmooth[r]=(价格-workSmooth[r])*(1-alpha)+alpha*workSmooth[r-1]。

Filt1 = (价格-Filt0 )*(1-alpha)+alpha*Filt1[1]

_______________________________________________________________________

workSmooth[r] = workSmooth[r] + workSmooth[r];

Filt2 = Filt0 + Filt1

_______________________________________________________________________

workSmooth[r] = (workSmooth[r] - workSmooth[r-1])*MathPow(1.0-alpha,2) + MathPow(alpha,2)*workSmooth[r-1] 。

Filt3=Filt2-Filt4[1]*(1-alpha)*(1-alpha)+alpha*alpha*Filt3[1]

_______________________________________________________________________

workSmooth[r] = workSmooth[r] + workSmooth[r-1] 。

Filt4=Filt3+Filt4[1] 。

_______________________________________________________________________

return(workSmooth[r])。

返回 Filt4

在我看来,应该是这样的,但请记住,我从未使用过prorealtime。