计算趋势线的斜率角。 - 页 15

 
Daniil Kurmyshev:

啊,好吧,那我明白了))然后我把代码还回去,也许除了Renat Akhtyamov 之外,还有人需要它,顺便说一下,我不经常坐在论坛上)))。

//-----------------------------------------------------------------------------------

//xAngle ///////////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------------

double xAngle(double x1,double y1,double x2,double y2) // x1,x2 Time[] - y1,y2 Price

{

如果(x1==0 || x2==0 || y1==y2){返回(0);}。

if(y1==y2) {return(0);}

//---

double PriceMAX=ChartGetDouble(0,CHART_PRICE_MAX,0)。

double PriceMIN=ChartGetDouble(0,CHART_PRICE_MIN,0)。

double Bar1proc=(double)(ChartGetInteger(0,CHART_WIDTH_IN_BARS,0)*_Period*60) /100;

double Price1proc=((PriceMAX-PriceMIN)/_Point)/100;

x1=iBarShift(NULL,0,(datetime)x1)。

x2=iBarShift(NULL,0,(datetime)x2)。

double x1x2=MathAbs(x1-x2)*_Period*60;

double y1y2=MathAbs(y1-y2)/_Point;

double x1x2_proc=x1x2/Bar1proc。

double y1y2_proc=y1y2/Price1proc。

//---

double theta=MathArctan(y1y2_proc/x1x2_proc)*(180/3.1415926535);

如果(y2<y1){theta=NormalizeDouble(theta*(-1),2);}。

return(theta)。

}

//+------------------------------------------------------------------+

纯粹的功能,用于计算角度,在自动模式下,通过图表比例进行修正,我自己也在使用,效果非常好)至于趋势策略,通过角度,你可以估计趋势的强度和大概的持续时间。

在这里。

double Bar1proc=(double)(ChartGetInteger(0,CHART_WIDTH_IN_BARS,0)*_Period*60) /100;

double Price1proc=((PriceMAX-PriceMIN)/_Point)/100;

除以100是多余的。在最后的公式中,它们(100)在计算theta时被放在分子和分母中。而且它们是缩写的。


在这里。

double Price1proc=((PriceMAX-PriceMIN)/_Point)/100;

double y1y2=MathAbs(y1-y2)/_Point;

除以_Point是多余的。除以100的情况也是如此。

在最后的公式中,双y1y2_proc=y1y2/Price1proc。

分子和分母中的点数被减少。

这些简化首先减少了计算量(CPU负载),其次,可能会提高最终结果的准确性。


===============================

或者你应该尝试使用ChartTimePriceToXY 函数来确定图形工具的锚点的像素值

用水平和垂直方向的像素数来计算三角函数比较容易。没有了条形和点的转换。

这应该是更简单的。


//-----------------------------------------------------------------------------------

//xAngle ///////////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------------

double xAngle(datetime x1,double y1,datetime x2,double y2) // x1,x2 Time[] - y1, y2 Price

{

如果(x1==0 || x2==0 || y1==y2){返回(0);}。

int _x1, _y1, _x2, _y2;

ChartTimePriceToXY(0,0,x1,y1,_x1, _y1)。

ChartTimePriceToXY(0,0,x2,y2,_x2,_y2)。

double theta=MathArctan((double)MathAbs(_y1-_y2)/(double)MathAbs(_x1-_x2)) *(180/3.1415926535)。

如果(y2<y1){theta=NormalizeDouble(theta*(-1),2);}。

return(theta)。

}

这里如果(y2<y1){theta=NormalizeDouble(theta*(-1),2);}通过结果调整符号。
 
Eugeni Neumoin:

在这里。

.........

应该会简单得多。

是的,所有这些都是完全无用的,因为它取决于用户设置的比例,在不同的图表上可能是不同的。

唯一真正的解决办法是衡量每单位时间内的价格趋势。

一个 "每小时0.0001欧元 "的趋势将被任何人以完全相同的方式画出来,不管任何规模,甚至平台。

 
George Merts:

这都是完全无用的,因为它取决于用户设置的比例,在不同的图表上可能是不同的。

唯一正确的解决方案是衡量每单位时间内的价格趋势。

一个 "每小时0.0001欧元 "的趋势将被任何人以完全相同的方式画出来,不管任何规模,甚至平台。

我没有注意到这个话题的主题。计算角度以使斜面铭文与趋势平行是很有趣的。我写了一个计算上述角度的简化函数。它完全不取决于规模。为了避免在改变比例和其他图表属性 时铭文失真,你可以使用CHARTEVENT_CHART_CHANGE

=========

我想在线条附近显示一个标题,就像图片上那样。随着上述功能的改变,结果是这样的。


 
Eugeni Neumoin:

我想在线条附近显示标签,如图所示。上述功能的结果是这样的。

很漂亮!
 
Eugeni Neumoin:

我同意你的观点,我不喜欢这样,但是当我最初创建这个函数时,我检查了几种不同的方式,然后我没有改变它),关于像素,我完全同意你的观点,对我个人来说,最理想的角度计算方式是这样的,这是我的函数。

//-----------------------------------------------------------------------------------

// xAnglePixels /////////////////////////////////////////////////////////////////////

//-----------------------------------------------------------------------------------

double xAnglePixels(datetime x1,double y1,datetime x2,double y2) // x1,x2 Time[] - y1,y2

{

如果(x1==0 || x2==0 || y1==y2){返回(0);}。

//---

int x[2],y[2];

ChartTimePriceToXY(0,0,x1,y1,x[0],y[0])。

ChartTimePriceToXY(0,0,x2,y2,x[1],y[1]) 。

//---

if(x[1]<x[0]){return(-1000);}

//---

double x1x2=MathAbs(x[0]-x[1]);

double y1y2=MathAbs(y[0]-y[1]);

//---

双theta。

if(x1x2!=0){theta=MathArctan(y1y2/x1x2)*(180/3.1415926535);}

else{theta=90;}

如果(y2<y1){theta=NormalizeDouble(theta*(-1),2);}else{theta=NormalizeDouble(theta,2);}。

return(theta)。

}

//---------------------------------------------------------------------------------

p.s. 在函数if(x[1]<x[0]){return(-1000);}可以去掉,因为我自己用了它),更具体地说,如果用户 对象的 两个 交换了位置,就需要它

//-----------------

顺便说一下,对于图表上的铭文,我使用它。 早些时候,我在分支中发布了这个指标的工作实例,在那里你可以看到它。

//-----------------

特别感谢你和尊重)

 
Eugeni Neumoin:

计算角度以使斜面铭文与趋势平行是很有趣的。上面我写了一个计算角度的简化函数。它完全不取决于规模。

是的,这是一个相当不同的情况。这里的任务不是确定趋势,而是确定显示器上绘制的直线的斜率。而在这种情况下,这是正确的方式。而且图片上的一切都很美。
 
George Merts:
是的,这是一个不同的问题。这里的任务不是确定趋势,而是确定显示器上显示的直线的斜率。而在这种情况下,这是正确的方式。而且图片上的一切都很美。
根据你的说法,我们可以画出趋势线,它们将显示趋势方向,并且相对于所画的线,将显示正确的角度,而不需要玩游戏。我在图片中附上了一个例子,我的机器人是按照所有的规则建造的,但本质是清楚的。
附加的文件:
 
Daniil Kurmyshev:
如果我们从你的话出发,意思是我们可以画出趋势线,它们会显示出趋势方向,相对于画出的线,直角会显示出来,没有任何篡改。我在图片中附上了一个例子,我的机器人是按照规则建造的,但本质是清楚的。
这张图是你的计算结果的可视化。可视化比例可以被扭曲(改变图表的比例),图像将发生显著变化--线条将改变其斜率角,单位为度。但当你改变比例时,你的计算结果不会改变。当然,除非你用像素来计算趋势
 
Alexander Puzanov:
这张图是你的计算结果的可视化。你可以扭曲可视化的比例(改变图表的比例),画面会发生明显的变化--线条会改变其斜率角的度数。但当你改变比例时,你的计算结果不会改变。当然,除非你在计算像素的趋势。
我同意,但你要意识到,在每个TF上,趋势是不同的;在小TF上看起来很大的,在大TF上变得很小,斜率也会改变;这改变的只是趋势的呈现,而不是角度测量系统;如果测量系统改变了,就不会有什么好结果。
 
Daniil Kurmyshev:
我同意你的观点,但你要明白,在每个TF上,趋势是不同的,在小的上看起来很大,在大的上变得很小,斜率也会改变,只是趋势的表现形式改变了,而不是角度测量系统,如果测量系统会改变,没有什么好的结果。
改变TF与此无关--当你改变TF时,你的计算方法就会改变。而当你改变比例时(用+/-按钮或终端上的按钮,有时只是滚动图表),计算中没有任何变化,而°是漂浮在中间的。
原因: