在后面的测试中发现问题,找不到根本原因! - 页 3

 

iHighest()函数是返回'i'左边还是右边的周期中的柱子?

 MaxH = High[iHighest(NULL,0,MODE_HIGH,period,i)];

另外,请参考我在本帖前面的帖子。

 

亲爱的JollyDragon。

很高兴你能看到指标的重新计算。

渔夫 的代码总是一样的,很容易识别。

该代码只是重新注入一个数据,就像许多指标通过某种手段所做的那样,(它们在第1、2、3条上存储过去的数据值),这个指标不这样做,这就是为什么它重新计算。

 for(i=limit-1; i>=0; i--)
     {
      MaxH = High[iHighest(NULL,0,MODE_HIGH,Solar_period,i)];
      MinL = Low[iLowest(NULL,0,MODE_LOW,Solar_period,i)];
      price = (High[i]+Low[i])/2;
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;
      Value=MathMin(MathMax(Value,-0.999),0.999);
      ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=ExtBuffer0[i];
     
      if(ExtBuffer0[i]>0) ExtBuffer1[i]=Solar_limit;
      else ExtBuffer1[i]=-Solar_limit;
     }
 
jollydragon:

iHighest()函数是返回'i'左边还是右边的周期中的柱子?


向左
 

ffoorr,GumRai, 谢谢你。

虽然代码存储了bar1的数据,但你可以看到它并没有重新计算bar0左边的条形。

所以我还是很困惑,是什么导致了重画,因为没有代码来重新计算bar0之前的条形。

for(i=limit-1; i>=0; i--)
     {
      MaxH = High[iHighest(NULL,0,MODE_HIGH,period,i)];
      MinL = Low[iLowest(NULL,0,MODE_LOW,period,i)];
      price = (High[i]+Low[i])/2;
      Value = 0.33*2*((price-MinL)/(MaxH-MinL)-0.5) + 0.67*Value1;
      Value=MathMin(MathMax(Value,-0.999),0.999);
      ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=ExtBuffer0[i];
      if(ExtBuffer0[i]>0) ExtBuffer1[i]=10;
      else ExtBuffer1[i]=-10;
     }
 

我们不知道极限是什么值。

我强烈建议你在这个指标上点击右键,把它移到垃圾桶里去!

      ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
      Value1=Value;
      Fish1=ExtBuffer0[i];

假设Fish1是一个全局变量或静态变量,并且最后一个条形图是重新计算的

当i==0时,Fish1被赋予一个基于Bar[0]数据的值

然后当bar[1]被重新计算时,在bar[0]中创建的Fish1的值被用来为bar[1]创建一个值。

我不知道这个指标的目的是什么,但是任何使用与i条有关的数据,然后在更早的条中使用的指标都是一个糟糕的指标。

 
GumRai:

我们不知道赋予极限的价值是什么。

请参考第20帖,其中附上了整个指标文件。下面再粘贴一下。

附件中的文件。
solarjoy.mq4(6.11 KB) 删除
GumRai:

然后当bar[1]被重新计算时,在bar[0]中创建的Fish1的值被用来为bar[1]创建一个值。

我不知道这个指标的目的是什么,但是任何使用与i bar有关的数据,然后在较早的bar中使用的指标都是一个糟糕的指标。

你可以看到'i'从'limit-1'到'0'的变化,即从左到右的Bars计算。

所以在bar[1]中计算的Fish1的值被用来为bar[0]创造一个值。为什么你会有相反的想法?

因此,根据我对代码的理解,我不认为这个指标是那种不好的指标。

无论如何,我终于观察到了重新绘制的情况,并认可它是那种不好的指标。

然而,我需要知道如何纠正代码,以防止重绘作为自我改进。

for(i=limit-1; i>=0; i--)
     { 
       ...
      }
 

这个fisher没有重绘,看起来不错,与solar_joy相比,信号晚了一格,但它是同一个指标。

https://www.forex-tsd.com/metatrader-4/474-fisher-14.html#post214965

问题不在于指标,它们是完美的,而在于市场总是在变化,它永远不会相同。

一个在某些趋势市场上给出完美信号的指标,在另一个市场上只会给出错误的信号。

人们总是要从好的摆动器中过滤信号,无论是使用止损还是止盈。

无论是否使用趋势指标。


我认为Fisher指标是有效的,它只是晚了一格,它重新计算,它不重绘,这个重绘,把它放在测试器的EA中,你会看到。

https://www.forex-tsd.com/ideas-suggestions/25934-bulletproof-11.html#post351354

 
jollydragon:

所以在bar[1]中计算的Fish1的值被用来为bar[0]创建一个值。为什么你会有相反的想法?

好吧,很公平,但是我提到的你的代码并不包括任何限制的计算,我不打算回过头来看3页纸,看看是否在其他地方包括。

所以这个指标并没有在每个tick 上对bar[1]进行重新计算。

但仍然

 ExtBuffer0[i]=0.5*MathLog((1+Value)/(1-Value))+0.5*Fish1;
 Fish1=ExtBuffer0[i];

将允许在封闭的条形图上的第一次运行与在当前条形图上的计算不同。

它在一个新条形图的第一个刻度上所做的是

ExtBuffer0[0]=0.5*MathLog((1+Value)/(1-Value))+0.5*ExtBuffer0[1];

在同一个条形图的后续刻度上,它将计算出

ExtBuffer0[0]=0.5*MathLog((1+Value)/(1-Value))+0.5*ExtBuffer0[0];

这是一种复合计算

 

这是可以交易的,与非重新计算的Fisher 相比,solar_joy/fischer会提前一栏给出一个信号。

然后在第1条和第2条中获取信号,并在第2条和第3条中查看信号是否仍然存在。

如果信号已经消失了,那么就关闭该订单。

  if(Joy2 <= EA_Limit && Joy1 >= EA_Limit)  open_order( OP_BUY); 
 if( (Joy3 <= EA_Limit && Joy2 >= EA_Limit)== false ) close_order( OP_BUY); 
 
ffoorr:

这个fisher没有重绘,看起来不错,与solar_joy相比,信号晚了一格,但它是同一个指标。

https://www.forex-tsd.com/metatrader-4/474-fisher-14.html#post214965

我认为Fisher指标确实有效,它只是晚了一格,它重新计算,它没有重绘,这个重绘,把它放在测试器的EA中,你会看到。

https://www.forex-tsd.com/ideas-suggestions/25934-bulletproof-11.html#post351354


亲爱的ffoorr,我无法打开网页,也无法访问网站,www.forex-tsd.com。也许我的网络配置有一些问题。

请让我们关注一下我的代码。它的主要内容只有大约10行代码。

但是,我们还是很难找到历史条形图重绘的根本原因。