daoyi 2008-5-24 15:27
mt4的数学运算方式
请教各位老师:
我写了一个指标,其中使用了一个公式:x=i*i*i*i,若用指数表达方式:x=Mathpow(i,4),就会有不同的计算结果。
请问这是怎么回事?
xfxyldj 2008-5-24 17:05
测试过两个语句得到的X值相同。
请详细描述你的问题。
daoyi 2008-5-24 19:12
谢谢老师的关注。以下是我的指标:
其中 函数 RC3 中的变量 x4+=i*i*i*i*4;换为 x+=mathpow(i,4)*4;
在图表中,发现第128根 K 线之前的 middle[i] 的值会有变化。
请帮我看看是哪里出了问题?多谢!!
for (i=Bars-1;i>=0;i--)
{
middle[i]=RC3(i+26,i);
}
//+++-----------------------------------------------------------------------------------------+++
double RC3(int start,int stop)
{
int i,j;
double RC,A,B,C,O;
double a1,a2,a3,b1,b2,b3,c1,c2,c3,d1,d2,d3;
double x1,x2,x3,x4,y1,x1y1,x2y1,n;
if (start<stop) start=stop;
x1=0;x2=0;x3=0;x4=0;y1=0;x1y1=0;x2y1=0;n=0;
for (i=start;i>=stop;i--)
{
y1+=Open[i]+High[i]+Low[i]+Close[i];
x1+=i*4;x2+=i*i*4;x3+=i*i*i*4;x+=i*i*i*i*4;
x1y1+=i*(Open[i]+High[i]+Low[i]+Close[i]);
x2y1+=i*i*(Open[i]+High[i]+Low[i]+Close[i]);
n+=4;
}
a1=n;a2=x1;a3=x2;b1=x1;b2=x2;b3=x3;c1=x2;c2=x3;c3=x4;d1=y1;d2=x1y1;d3=x2y1;
O=a1*b2*c3+a2*b3*c1+a3*b1*c2-c1*b2*a3-c2*b3*a1-c3*b1*a2;
A=d1*b2*c3+d2*b3*c1+d3*b1*c2-c1*b2*d3-c2*b3*d1-c3*b1*d2;
B=a1*d2*c3+a2*d3*c1+a3*d1*c2-c1*d2*a3-c2*d3*a1-c3*d1*a2;
C=a1*b2*d3+a2*b3*d1+a3*b1*d2-d1*b2*a3-d2*b3*a1-d3*b1*a2;
if (O==0) RC=Close[stop];
else {A=A/O;B=B/O;C=C/O;RC=A+B*stop+C*stop*stop;}
return(RC);
}
daoyi 2008-5-24 22:40
谢谢老师的提示,但问题还是没有解决,改用 a=a+ 的形式后,情况未有改善,和之前的 a+= 是一样的结果。
您可以帮我看看是不是我的算法有问题?这是一个三阶行列式的求解算法。
xfxyldj 2008-5-24 22:55
应该是发生溢出了。
x+=i*i*i*i*4;
先是以整形变量进行计算然后再转化成浮点数赋给x。当i到154(128+26)的时候i*i*i*i*4超出了整形变量的表达范围(变成一个负值),计算后赋给x一个负数。
而mathpow(i,4)*4运算不会,mathpow(i,4)*4运算得到一个浮点数。不会发生溢出。
既然你的i变量比较大,建议使用mathpow(i,4)*4来进行计算。
xfxyldj 2008-5-24 22:56
相关内容帮助(运算种类型转换)
Type casting
MQL 4 表达式中使用强制的数据转换,转换时类型的优先级如下:
int (bool,color,datetime);
double;
string;当运算完成之前(除了数据已被定义的),数据会根据优先级被转换。当定义数据的操作完成前 ,数据会转换成被定义的数据类型。
示例:
int i = 1 / 2; // 没有类型转换,结果为 0
int i = 1 / 2.0; // 表达式中有浮点型数据,但会转换成整型数据,结果为 0
double d = 1.0 / 2.0; // 没有类型转换,结果为 0.5
double d = 1 / 2.0; // 表达式计算的结果是浮点型数据,和定义的类型一样,结果为 0.5
double d = 1 / 2; // 表达式是整型数据的计算,然后被定义为浮点型数据,结果为 0.0
类型转换不但运用在常量中,还被运用在相应的变量中。
xfxyldj 2008-5-24 22:59
相关帮助内容(MathPow函数定义)
double MathPow( double base, double exponent)
返回上升的基数指定的乘方(方次数价值)。
参量:
base - 基数。
exponent - 方次数价值。
例子:
double x=2.0,y=3.0,z;
z=MathPow(x,y);
Printf(x," to the power of ",y," is ", z);
//Output: 2 to the power of 3 is 8
可以看到他的返回值是一个浮点数。
整形数取值范围“-2147483648 ~ 2147483647 ”
整型数据占用 4 字节的空间,其数值范围介于 -2147483648 ~ 2147483647 之间。如果超出这个范围,则视为无效。
daoyi 2008-5-25 00:32
讲解的真是透彻啊!多谢老师!
可是问题又来了:
将该指标运行于任一货币对的任一时间段,当函数 RC3 的参数 start 取值较小时(比如:middle[i]=RC3(i+9,i);),
图表中的柱数取1700,此时,该指标线的中段(大概在第300柱至800柱之间)会出现异常的值(超大或超小),而图表两头的指标线表现正常。
请老师再帮忙看看是哪里的问题?很想和你交朋友,我的QQ:503505396。
xfxyldj 2008-5-25 07:35
我想可能还是溢出的问题造成的。
y1+=Open+High+Low+Close;
x1+=i*4;x2+=i*i*4;x3+=i*i*i*4;x+=i*i*i*i*4;
x1y1+=i*(Open+High+Low+Close);
x2y1+=i*i*(Open+High+Low+Close);
将这段中的运算式都乘一个1.0(强制转换为浮点数进行计算),在看看
daoyi 2008-5-25 09:05
按照您的提示更改过后,仍然不行。
我也觉得是溢出的问题,就是找不到毛病所在啊!
xfxyldj 2008-5-25 10:48
你可以通过print()函数输出一些中间变量的值。检查下是哪个环节出现异常。
startexcel 2008-5-25 20:38
光看代码本身的计算没什么问题
但我不知道你这样做的目的是什么
比如i+12
daoyi 2008-5-25 22:37
谢谢老师的指导!!
虽然我仍未找出语句的问题,但肯定是变量值溢出的问题。因为我用了其它方式把超出范围的变量值置换成合法的变量值。得出了相当不错的指标线。
对老师的关注再次表示感谢!与你的交流获益匪浅,呵呵。