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

 
Alexey Viktorov:

1.我说的是检查,而不是更换。如果没有分形,iFractals返回0。我不经常使用它,自然也不会用这种琐事来堵塞尚未干涸的记忆残片。

2.这个函数虽然写得很糟糕,但仍能正常工作。

3.最后一个值显示在注释中。将其替换为。

并看看它打印了多少次

很多,但绝不是假的。仿佛条件总是得到满足。但它应该是假的。

 
Ghabo:

很多,但从不虚假。仿佛条件总是得到满足。但它应该是假的,在截图中,情况与条件相矛盾,但却是真的。


在截图中,第一个分形和第二个分形被标记出来。但根据条件,函数会进一步搜索,直到找到低于第一个的那个。而第四个分形比第一个分形要低...这就是条件中所说的。

如果条件是辅以

      if(f!=0) 
        {
        fr2=NormalizeDouble(f, d);
        if(fr2<fr1)
         return(true);
          else break;
        }

它也会打印出错误。

 
Alexey Viktorov:

第一个分形和第二个分形在截图中被标记出来。但根据条件,该函数进一步搜索,直到找到第一个下面的那个。而第四个分形比第一个分形要低...这就是条件中所说的。

如果加入条件

它也会打印出错误。

逆转了病情
 if(fr2>fr1) return(true);
        else break;

打印为假,但条件得到满足。

aqa1

 

第二个循环总是返回第一个循环中发现的分形的价格。

   for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        return(NormalizeDouble(fr2, d));
        //if(fr2>fr1) return(true);
        //else break;
        }
     }
 
Ghabo:

第二个循环总是返回第一个循环中发现的分形的价格。

你似乎在逻辑上有问题。

试着用简单的语言描述搜索的顺序。想一想你是否把所有东西都写正确了。然后做一个搜索功能,按序列号返回找到的分形的价格。一旦你这样做了,并且它返回了你用序列号指定的分形的正确价格,就开始做寻找下一个分形的价格的逻辑(这时你已经有一个返回其价格的函数)。然后剩下的就是比较这些价格。

而你一次就做了一堆的东西。

 

也许我误解了它的工作原理?

首先,我找到了一个分形,即MA上面的第一个分形--(截图中标记为1号)。

int    i,k=iBars(sy,tf),kf,num_bar;

   for(i=nf+2; i<k; i++) 
     {
      f=iFractals(sy,tf,MODE_UPPER,i);
      MA=iMA(NULL,0,35,0,MODE_EMA,PRICE_CLOSE,i);
      if(f!=EMPTY_VALUE) 
        {
        // kf++;
         if(f>MA) {num_bar=i; fr1=NormalizeDouble(f, d);break;}
         
        }
     }

我从它身上看去,进一步看向历史,第一个分形(截图中标有2号)。如果第2号分形大于第1号分形,我返回真。

      for(i=nf+ num_bar; i<k; i++) 
     {
      fx=iFractals(sy,tf,MODE_UPPER,i);
      if(fx!=EMPTY_VALUE) 
        {
        fr2=NormalizeDouble(fx, d);
        if(fr2>fr1) return(true);
        else break;
        }
     }

都正确吗?

aq11

 
Artyom Trishkin:

将返回根据序列号找到的分形的价格。

不是通过数字,我通过条件搜索,即分形在MA之上,序号可以是任何。 在第一个循环中,这个分形的价格被正确写入变量 "fr1"。

问题出在第二个循环中,当然,如果我理解正确的话。为什么没有发现分形数2的价格,目前还不清楚。

 
Ghabo:

不是通过数字,我通过条件搜索,即分形在MA之上,序号可以是任何。 这个分形在第一个周期的价格被正确写入变量 "fr1"。

问题出在第二个循环中,当然,如果我理解正确的话。我不明白为什么找不到2号分形的价格。

我必须向你复述整个逻辑。有什么是你自己能想到的吗?

1.在第一个循环中,我们发现MA上面的分形。酒吧的编号被写入num_bar变量(截图上的第11条)。

2.在第二个循环中,我们开始搜索满足条件的第二个分形。我们从num_bar开始搜索...即从第11条开始,因为nf为零。

3.分形体被发现了。该值等于前一个值。条件不会被满足,因为条件包含>然后<但不等于。如果我们设置==,同样的胡言乱语会发生,但是从另一边。

也许,我们应该从下一个条形num_bar+1甚至+2开始搜索第二个分形。

 
Alexey Viktorov:

所有的逻辑都要复述给你听。有什么是你自己能想到的吗?

1.在第一个周期中,我们发现在MA的上方有一个分形。酒吧的编号被写入num_bar变量(截图上的第11条)。

2.在第二个循环中,开始搜索满足条件的第二个分形。我们从num_bar开始搜索...即从酒吧#11,因为nf等于零。

3.分形体被发现了。该值等于前一个值。条件不会被满足,因为在条件中>然后<但不等于。如果我们设定==,同样的垃圾也会发生,但是从另一边。

也许,我们应该从下一个条形num_bar+1或甚至+2中寻找第二个分形。

一般来说,前两段的行动,我已经表达出来了)。

对于 "num_bar+1",谢谢。

我找不到最低限度。

条件未满足,箭头已设定,已满足未设定。

条件如下:如果被MA交叉的蜡烛的最小值到iLowest的 最小值的距离大于或等于100,我就放箭头。

   if(limit>60)limit=60;
   for(int i=limit; i>0; i--)
     {
      M11=iMA(NULL,0,period,shift_,method,price,i+1);
      if(open[i+1]>M11 && close[i+1]<M11){time_1=time[i+1];}

      indexS1=iBarShift(NULL,PERIOD_CURRENT,time_1,false);

      if(open[i+1]<M11 && close[i+1]>M11){time_2=time[i+1];}

      indexS2=iBarShift(NULL,PERIOD_CURRENT,time_2,false);

      //
      double val=0;
      //--- расчет минимального значения цены на indexS1 последовательных барах 
      //--- с индекса indexS2 по индекс indexS1 включительно на текущем графике 
      int val_index=iLowest(NULL,0,MODE_LOW,indexS1,i+indexS2);
      if(val_index!=-1) val=Low[val_index];
      else PrintFormat("Ошибка вызова iLowest. Код ошибки=%d",GetLastError());

      if(low[indexS1]-val>=100*Point)
        {
        BufferPointDn1[i]=high[i];
        }
      //
     }

从B到A,我发现C的最小值。

A-C=100点在B点,应该把箭头。

为什么不呢?

低1

 
Ghabo:

一般来说,前两段中的行动,我是这么说的)

关于第二点,有点错。你还没有定义我们从哪里开始寻找,什么时候能得到什么价值。而这也让你觉得你应该找得更远一点。

Ghabo

无法找到最小值。

条件未得到满足,箭头已设定,条件未得到满足。

条件是,如果从穿过MA的蜡烛的最小值到iLowest的最小值的距离在价格交叉点和MA之间大于或等于100,我把箭头。

从B到A,我发现C的最小值。

A-C=100点在B点,应该把箭头。

它为什么不把它?

这段代码也有一些难以把握的逻辑。

我们至少需要知道变量 indexS1和indexS2的定义 位置和方式,以及它们是否在每个tick上被重置。

那么,如果МА的交叉点被夹在缝隙中,会发生什么?


还有一个问题:你知道如何使用调试器吗?

原因: