新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 973

 

你好。

请帮助我理解。当检查一个简单数组的操作时(赋值)。

a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

H= 1/(1+exp(-a[0][2]))。

a[0][2]=H。

打印(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2])), " H=",H," a[0][2]=",a[0][2])。


我得到的结果是。

2019.09.21 13:21:44.328 2011.01.03 14:54:20 W EURUSD,H4: a[0][2]=91.49999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18 W EURUSD,H4: 1/(1+exp(-a[0][2])) =0.7310585786300049 H=1.0 a[0][2]=1.0

怎么说呢?

 
im-zvv:

你好。

请帮助我理解。当检查一个简单数组的操作时(赋值)。

a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

H= 1/(1+exp(-a[0][2]))。

a[0][2]=H。

打印(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2])), " H=",H," a[0][2]=",a[0][2])。


我得到的结果是。

2019.09.21 13:21:44.328 2011.01.03 14:54:20 W EURUSD,H4: a[0][2]=91.49999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18 W EURUSD,H4: 1/(1+exp(-a[0][2])) =0.7310585786300049 H=1.0 a[0][2]=1.0

怎么说呢?

这是一个很难重现的例子,但我怀疑由于类型转换 的原因,你得到的结果与你预期的不同。

用这个代码做实验。

void OnStart()
{
   double a;
   int b = 2;
   a = b / 5;     //    a = 0.0
   Print("a = ",a);  
}

然后用这个。

void OnStart()
{
   double a;
   int b = 2;
   a = b /(double) 5;     //    a = 0.4
   Print("a = ",a);  
}

и

void OnStart()
{
   double a;
   int b = 2;
   a = b / 5.0;     //  a = 0.4
   Print("a = ",a);  
}

并在论坛上搜索一下 "实数",总之,C转换一开始是有点混乱的;)

 

你已经展示了一堆使用int 变量的例子。

我的变量都是双倍的。

所以,将变量转换为相同的格式是行不通的。

 
im-zvv:

你已经展示了一堆使用int 变量的例子。

我的变量都是双倍的。

因此,将变量转换为相同的格式是行不通的。

a[0][2]=91.49999999993754;

Print("a[0][2]=",a[0][2]);

H=1/(1+exp(-a[0][2]))。

a[0][2]=H。

打印(" 1/(1+exp(-a[0][2]))=",1/(1+exp(-a[0][2])), " H=",H," a[0][2]=",a[0][2])。


我得到的结果是。

2019.09.21 13:21:44.328 2011.01.03 14:54:20 W EURUSD,H4: a[0][2]=91.49999999993754

2019.09.21 13:21:44.328 2011.01.03 14:54:18 W EURUSD,H4: 1/(1+exp(-a[0][2]))=0.7310585786300049 H=1.0 a[0][2]=1.0

怎么说呢?

你有整数常数 以及例子本身是不可复制的--没有变量类型,好在一般来说--我的 "一堆例子 "可以不用PC计算,你的例子...请告诉我e^(-91.49999)是什么。

好吧,算了,我帮不了你。

 

遗憾的是,"不能帮助"...

问题不在于e^(-91.49999)的多少。问题是,为什么一个double=H类型 的变量,被错误地写成了

早期计算出的双数类型=0.7310585786300049,但它被写成了1.0(顺便说一下双数)

如果你尝试在测试器中使用我的代码,我想你的MT4会显示同样的东西。

如果是这样,你根本就不能用MQL4来工作,这很危险!

 
im-zvv:

太糟糕了。"不能帮助"......

我帮助了,帮助并不意味着为我做,否则我反正不会看,我关心的是结果!"。

im-zvv

如果是这样,MQL4根本不能用于工作,是很危险的!

MQL4/MQL5在计算数学表达式方面的行为与C++相同。 你可以到任何一个C++论坛上提出你的问题,也许那里的资产会帮助你。

你的问题已经从帮助/解释/教学转移到讨论MT平台,不喜欢它,你是免费收到的?

...在古代,由于缺乏对物理过程的了解,人们对雷声或地震感到恐慌。起初,它引起了恐慌和猜测,然后是宗教))))。

 

你不应该如此生气。

如果我伤害了你的个人感情,我真诚地道歉。

我根本不是在讨论或评判MT4。我只是建议你运行

我只是提出在MT4的测试器中运行我发给你的代码,如果所有的变量(H,a[0][2])都在

被定义为双倍,结果和我一样,我有一个问题。

问题是什么?我把它送给了你。

再一次:我很抱歉...... "帮不上忙"......

再见。

 
im-zvv:

即所有变量(H,a[0][2])都是

被定义为双

再次强调--你的数学表达式中是否有常数?- 我的例子也有常数5 ...然后我写了5.0--对编译器来说是不一样的!然后我明确地把整数常数5带到了double类型--->对编译器来说,它将与上面的例子5.0一样。


你的问题在论坛上经常重复,尽管我可能看不出你的问题是什么--你有一个 "沉重的公式 "和不明显的变量--从例子中删除不必要的东西--数组和指数--然后你会看到问题是什么,尽管如果你删除所有不必要的东西,你很可能会发现你得到的东西不是你所期望的--我通常会这样做;)


HH:和指数到负91.49的幂--不是一个非常小的数字吗?"双 "型有很大的准确性,但到百位数并考虑到减号--在我看来,这种表达方式将失去准确性,我不想谷歌,但 我翻阅这个Wiki 的第一件事是

 

谢谢您的耐心等待!

试过这个:

A=91.49999999993754;//a[0][2]=91.49999999993754;

Print("A=",A)。

H= 1/(1+exp(-A))。

//A=H;

Print("1/(1+exp(-A))=",1/(1+exp(-A)), " H=",H," a[0][2]=",a[0][2])。

结果。

2019.09.21 16:14:17.691 2011.01.04 22:29:51 w eurusd,h4: a=91.4999999999993754

2019.09.21 16:14:17.690 2011.01.04 22:29:50 w EURUSD,H4: 1/(1+exp(-A))=1.0 H=1.0 a[0][2]=0.0

!!!!!这表明1/(1+exp(-91.499999993754))=1.0,但如果我保持代码中的A=H,那么在打印命令中继续计算(

我将尝试找出为什么1/(1+exp(-91.49999999993754))=1.0。

请理解我。我现在正忙于调整和训练神经网络。 代码本身很粗糙,连我自己都感到困惑......:)

我注意到,网络重复出现错误。而主要的错误是在计算sigmoid的时候。它不应该是=1。


 
im-zvv:

谢谢您的耐心等待!

试过这个:

A=91.49999999993754;//a[0][2]=91.49999999993754;

Print("A=",A)。

H= 1/(1+exp(-A))。

//A=H;

Print("1/(1+exp(-A))=",1/(1+exp(-A)), " H=",H," a[0][2]=",a[0][2])。

结果。

2019.09.21 16:14:17.691 2011.01.04 22:29:51 w eurusd,h4: a=91.4999999999993754

2019.09.21 16:14:17.690 2011.01.04 22:29:50 w EURUSD,H4: 1/(1+exp(-A))=1.0 H=1.0 a[0][2]=0.0

!!!!!这表明1/(1+exp(-91.499999993754))=1.0,但如果我保持代码中的A=H,那么在打印命令中继续计算(

我将尝试找出为什么1/(1+exp(-91.49999999993754))=1.0。

请理解我。我现在正忙于调整和训练神经网络。 代码本身很粗糙,连我自己都感到困惑......:)

我注意到,网络重复出现错误。而主要的错误是在计算sigmoid的时候。它一定不是=1。


所以你不会发现什么,这就是我决定要检查的,你必须寻找代码中的错误或不准确之处。

void OnStart()
  {
      double a=91.49999999993754;
      Print("1. a = ",a);
      double H= 1/(1+exp(-a));
      a=H;
      Print("2. a = ",a);
      Print("3. H = ",H);
      double e = exp(-91.49999999993754);
      Print("4. e = ",e);
  }

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 4. e = 1.828331349163451e-40

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 3.H = 1.0

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 2. a = 1.0

2019.09.21 16:53:01.516 tst_template EURUSD,H1: 1. a = 91.49999999993754

然后按步骤计算并重印结果,但在我看来,在第4步,准确度已经下降,我的结果如下:1.82 x 10^(-40) - 这是一个非常小的数字,今后用这样的小数字进行任何操作都会进一步失去更多的准确性,这是在用实数工作时的一个所谓的 "魔法" - 为了不失去准确性,用这样的小数字尝试用整数或双数进行计算,但不会失去尾数 - 你需要乘以10^40 ... - 然后在一般情况下需要计数,所以继续我不会帮助