[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 29

 
hoz:

你能告诉我如何从 "之 "字形指标中提取数值吗?这在一般情况下是如何实施的?也就是说,如果我想拿起某个极值,而不仅仅是最后一个极值。

例如,现在我想把这个人字形附加到我的专家顾问上。

我明白我需要使用iCustom 函数,因为它通常用于解决一个自定义指标,但问题是如何连接这些节点...

缓冲区根据原则寻找NEUTRAL(EMPTY_VALUE)值。

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}
并通过iCustom()访问指标缓冲区。
 
TarasBY:

根据原则,缓冲区正在寻找一个EMPTY_VALUE值。

//+-------------------------------------------------------------------------------------+
//| Поиск последнего элемента ZZBuf с непустым значением                                |
//+-------------------------------------------------------------------------------------+
int GetLastIndexNoEmptyValue(int index)
{
   while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
      index++;                                     // Пока не будет найден экстремум или
                                                   // ..пока не достигнем конца истории
   return(index);                                  // Индекс бара с непустым значением..
                                                   // ..зиг-зага
}

并通过iCustom()访问指标缓冲区。


这是有道理的。但它将以这种方式进行搜索,直到我们遇到一个非空值。例如,如果我,而且,事实上,我想要的不是最后的非空值,即不是最后的极值,而是另一个...例如,在这里的截图中。

 
hoz:


有道理。但这样一来,搜索将直到我们遇到一个非空值。例如,如果我,而且,事实上,我想要的不是最后的非空值,即不是最后的极值,而是另一个...例如,在这里的截图中。

我们应该在循环中引入极值的计数器,并通过极值的数量(一行中的非空值)来打破循环。
 
TarasBY:
在循环中输入一个极值计数器,在极值的数量上(一行中的非空值),打破循环。

明白了。谢谢你。现在我们需要在实践中应用所有这些。我明白了大意,但我的脑子里充满了过滤器,让我的大脑沸腾起来......。
 
hoz:

明白了。谢谢你。现在我们需要在实践中应用它。我得到了这个想法,但我的脑海中有许多过滤器,我的大脑正在沸腾...

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


如果你需要峰值的条数,请将函数类型改为int,并将return(ind)改为return(i)。

还要注意,如果你在代码中使用i,特别是在搜索中(如教程中),那么在这个函数中把i改为任何其他变量,例如k。

并确保在函数内为你的指标配置iCustom。

 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1)  

         if(ind!=0) n--;

         else

         if(ind!=0) return(ind);

      }

   }


如果你需要峰值的条数,请将函数类型改为int,并将return(ind)改为return(i)。

还要注意,如果你在代码中使用i,特别是在搜索中(如教程中),那么在这个函数中把i改为任何其他变量,例如k。

并确保在函数内为你的指标配置iCustom。

尼古拉,这很有趣,当然,你有条件写我看着它在想......

if(ind!=0) n--;

else

if(ind!=0) return(ind);

事实证明,如果自定义指标的 缓冲区返回值为零,那么n--如果自定义指标的缓冲区返回值为零,那么......。我们返回指标缓冲区的值。

但条件是一样的。在那里,所以如果不是零...

 
hoz:

尼古拉,这很有趣,当然,你有写的条件当我看着它时,我想...

事实证明,如果自定义指标缓冲区返回的值为零,那么n--如果自定义指标缓冲区返回的值为零,那么......。我们返回指标缓冲区的值。

但条件是一样的。在那里,所以如果不是零...

在试图正确插入代码时,大括号掉了出来。

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(n>1) {

         if(ind!=0) n--;

         }else{

         if(ind!=0) return(ind);

         } 

      }

   }

如果n>1 {

如果缓冲区不是空的,就从n中减去1

}反之亦然{

如果缓冲区不是空的,返回其值

}

 

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


或像这样,这更简洁。我对代码的速度和美感很着迷,别介意 )
 
keep87:

double get_extrem(int n) {

   for(int i=1;;i++) {

      double ind=iCustom(Symbol(),0,"indicator_name",0,i);

      if(ind!=0) {

         if(n>1) n--; else return(ind);

         }

      }

   }


或像这样,这更简洁。我对代码的速度和美感很着迷,别介意)。


一般来说,两种方式都很好。我只是习惯于用不同的编码方式。 这样读起来比较容易,而你的则不同。你的每段代码中的第一个括号都没有移动。我把它放在我的EDITOR里,一切都像这样归位了。

double get_extrem(int n)
{
   for(int i=1;;i++)
   {
     double ind=iCustom(Symbol(),0,"indicator_name",0,i);
       if(n>1)
        {
          if(ind!=0) n--;
        }
        else
        {
          if(ind!=0) return(ind);
        } 
   }
}
 
hoz:


基本上,两种方式都很好。我只是习惯于用不同的方式写代码:这种方式更容易阅读,而你的代码则不同。你的每段代码中的第一个括号都没有移动。我把它放在编辑器里,所有的东西都在这个表格里各就各位。


当代码超过1000行时,你就开始写得很紧凑了)。

在MT4中,性能也受到影响,特别是在运行测试时。简洁的版本表现得更快。