//+-------------------------------------------------------------------------------------+//| Поиск последнего элемента ZZBuf с непустым значением |//+-------------------------------------------------------------------------------------+int GetLastIndexNoEmptyValue(int index)
{
while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
index++; // Пока не будет найден экстремум или// ..пока не достигнем конца историиreturn(index); // Индекс бара с непустым значением..// ..зиг-зага
}
//+-------------------------------------------------------------------------------------+//| Поиск последнего элемента ZZBuf с непустым значением |//+-------------------------------------------------------------------------------------+int GetLastIndexNoEmptyValue(int index)
{
while (ZZBuf[index] == EMPTY_VALUE && index < Bars)// Поиск по графику справа налево
index++; // Пока не будет найден экстремум или// ..пока не достигнем конца историиreturn(index); // Индекс бара с непустым значением..// ..зиг-зага
}
你能告诉我如何从 "之 "字形指标中提取数值吗?这在一般情况下是如何实施的?也就是说,如果我想拿起某个极值,而不仅仅是最后一个极值。
例如,现在我想把这个人字形附加到我的专家顾问上。
我明白我需要使用iCustom 函数,因为它通常用于解决一个自定义指标,但问题是如何连接这些节点...
缓冲区根据原则寻找NEUTRAL(EMPTY_VALUE)值。
并通过iCustom()访问指标缓冲区。根据原则,缓冲区正在寻找一个EMPTY_VALUE值。
并通过iCustom()访问指标缓冲区。
这是有道理的。但它将以这种方式进行搜索,直到我们遇到一个非空值。例如,如果我,而且,事实上,我想要的不是最后的非空值,即不是最后的极值,而是另一个...例如,在这里的截图中。
有道理。但这样一来,搜索将直到我们遇到一个非空值。例如,如果我,而且,事实上,我想要的不是最后的非空值,即不是最后的极值,而是另一个...例如,在这里的截图中。
在循环中输入一个极值计数器,在极值的数量上(一行中的非空值),打破循环。
明白了。谢谢你。现在我们需要在实践中应用所有这些。我明白了大意,但我的脑子里充满了过滤器,让我的大脑沸腾起来......。
明白了。谢谢你。现在我们需要在实践中应用它。我得到了这个想法,但我的脑海中有许多过滤器,我的大脑正在沸腾...
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。
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。
尼古拉,这很有趣,当然,你有条件写。我看着它在想......
事实证明,如果自定义指标的 缓冲区返回值为零,那么n--,如果自定义指标的缓冲区返回值为零,那么......。我们返回指标缓冲区的值。
但条件是一样的。在那里,所以如果不是零...
尼古拉,这很有趣,当然,你有写的条件。当我看着它时,我想...
事实证明,如果自定义指标缓冲区返回的值为零,那么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);
}
}
}
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里,一切都像这样归位了。
基本上,两种方式都很好。我只是习惯于用不同的方式写代码:这种方式更容易阅读,而你的代码则不同。你的每段代码中的第一个括号都没有移动。我把它放在编辑器里,所有的东西都在这个表格里各就各位。
当代码超过1000行时,你就开始写得很紧凑了)。
在MT4中,性能也受到影响,特别是在运行测试时。简洁的版本表现得更快。