指标问题 - 页 4

 
SDC:

或者是像这样?

但你真的应该使用 IndicatorCounted(),因为如果你这样做,你的指标在每一个新的刻度线上都会重新绘制所有的对象,而不是一次性绘制所有对象,并在新的条形图形成时添加新的对象。

这和你的另一篇关于外部bools的文章也给了我一些其他的想法,谢谢

我的关注点需要更广泛,但因为我是新手,我倾向于关注代码的一个部分,而忽略了其他部分,如外部。
我现在才开始接触数组,在理解缓冲区方面有很大的困难,但最近开始克服了这个问题。

谢谢,这也会给我一些新的想法。
 
SDC:


你必须考虑你在做什么,当你创建一个指标时,你将你的代码应用于图表上的每一个条形,这意味着你需要获得这些历史条形的macd指标值。

在你的原始代码中,你做到了。

最后一个参数1是图表中第1条的macd值,即当前条的前一个条,索引为第0条

很明显,你不想在整个历史图表中使用macd的单一值来进行条件运算。

你需要将macd索引到与每个条形图相同的条形图索引中,例如,在条形图500中你需要这样做

最后一个参数必须改变,以匹配你的指标应用其算法的条数。

这就是为什么你需要它在循环内,所以你可以使用循环周期迭代器的最后一个参数,因此你可以得到你的macd值,因为它是历史图表中的每一个条形。

我希望这能帮助你弄清楚一些事情。

对,我确实解决了这个问题。

然而,当添加诸如if(val1 > 0 && faster > slower)之类的代码时,当在循环外声明更快和更慢时,这将无法工作。

AHHHHH 我明白了,因为移位是(i),所以我需要它在循环内 OOOOPPPS LOL
 
Agent86:
为什么for(int i = Bars-1 ? <----------------------- Bars的索引就像数组一样,第一个bar=0,而不是1。所以最后一个Bar是Bars-1;

为什么这比for(int i = Bars?? <----- 见上文。

请指示,谢谢


还有。

我想这对所有的人来说都是如此,而不仅仅是指标/自定义指标?<------我和 WHRoeder: 讨论的是相当普遍的问题。没什么特别的。 我们只是互相讨论了变量的声明和它们的赋值,等等,关于循环。

 
diostar:

还有。


for(int i=Bars; i>=0; i--) 是我使用的代码

for(int i=Bars-1; i>=0: i--) 是我建议的。

我以为Bars=当前图表中的条数,至少根据字典是这样的。

所以--i我认为是从最高条数开始倒数,比如1002或其他什么,然后把--i倒数到实际的-1。
因为当i>=0时,它应该倒数到实际的-1,然后再变成假的。如果它是0或更大,它将是真实的,并最后循环一次,直到它达到-1。

至少我是这样认为的,它的工作方式是这样的?我错了吗?

如果i=0和++i并向上计数,那么我认为它将计数到最后一栏。

但是在这种情况下,你说的Bars-1并不是所有的收盘Bars,而是包括尚未收盘的Bar[0],还是什么?

我不太明白Bars-1和Bars之间的区别。它是否与当前的Bar 0有关,因为当简单地提到Bars时,它没有被计算在内?

请指教 谢谢


 

是的,因为你有一个0条,所以Bars给你图表中的条数,包括0条。

所以考虑一个小图表,图表中只有2个条形,bar[0]和bar[1]。

Bars给你计数,所以Bars == 2

如果你想让你的指标从图表中的最后一个柱子开始应用

你可以试试i=Bars。

正如我们所知,Bars = 2,但没有bar[2]的索引,最后一个bar是Bar[1]。

所以你需要做的是i=Bars-1

 
Agent86:
当i=Bars时,close[i]是否存在?

当i=Bars-1 时,close[i]是否存在?

我认为Bars=当前图表中的条数,至少根据字典是这样。

所以--i我认为是从最高条数开始倒数,比如1002或其他什么,然后倒数--i到实际的-1, close[1002], close[-1]是否存在?
因为当i>=0时,它应该倒数到实际的-1,然后再变成假的。如果它是0或更大,它将是真实的,并且最后一次循环,直到它达到-1<---- at close[-1],它返回0。不是假的

至少我是这样认为的,它的工作方式是这样的?我错了吗?<---见下面的参考文献。

如果 i=0 和 ++i 并向上计数,那么我认为它将计数到最后一栏。<--- 它将顺从地做到这一点。

但在这种情况下,你说的Bars-1并不是真正的所有收盘Bars,而是实际上包括尚未收盘的Bar[0],还是什么?<---在这种情况下,收盘价将返回当前Bid tick价格

我不太明白Bars-1和Bars之间的区别。它是否与当前的Bar 0有关,因为当简单地提到Bars时,它不被计算在内?

请指教 谢谢欢迎





double Close[]
系列数组,包含当前图表中每个条形的收盘价。

系列数组元素的索引顺序是相反的,即从最后一个到第一个。当前的条形图是数组中的最后一个,其索引为0。最古老的条形图,即图表中的第一个,索引为Bars-1。
 
我明白了,由于某些原因,我认为缓冲区对这个问题的处理有些不同,因为从技术上讲,我甚至没有声明数组中的元素数量,所以我认为缓冲区已经解决了这个问题。

总之,我明白了,这很有意义,谢谢

 
Agent86:
我明白了,由于某种原因,我认为缓冲区对这个问题的处理有点不同,因为从技术上讲,我甚至没有声明数组中的元素数量,所以我认为缓冲区已经解决了这个问题。

不管怎样,我确实理解了这一点,而且很有意义,谢谢



什么?我没有意识到你实际上指的是指标缓冲区。现在我知道了,请阅读以下参考资料:https://www.mql5.com/en/articles/1500

(1) 指示器缓冲区和用户数组 - 它们既相同又不同。 & 指示器缓冲区的大小不由用户决定的原因,与它已经被计算出来无关。

double ExtMapBuffer1[];

这是一个普通的数组。但没有指明尺寸,也没有进行初始化。这个数组以后将被设置为一个数据缓冲区。

(2) 输出和输入的指标缓冲区(上面的数据缓冲区)可能看起来相同,但不同。

SetIndexBuffer(0,ExtMapBuffer1);

这个函数将一个数组与一个缓冲区的编号 "绑定" 。也就是说,它表明具有指定编号的缓冲区将使用指定的数组来存储数据。所以,改变这个数组的元素就会改变缓冲区的值。实际上一个数组就是一个数据缓冲区。第一个参数 是应该被绑定的数组的名称


你看,这一切都在运作。现在让我们看看这段代码是怎么做的。

for(int i=0;i<Bars;i++)

我们使用循环for浏览数据缓冲区的所有元素。由于缓冲区的每个元素都对应着一个条形图,我们使用循环,从零条形图(最后一个可用的条形图)开始,以第一个可用的条形图结束,这个条形图比变量Bars 少一个(因为我们从零开始计算条形图)。

{
   ExtMapBuffer1[i]=MathRand()%1001;
}

在每一次迭代中,计数器都会增加一个,我们从最后一个 可用的条形图移动 到第一个 条形图,同时给每个缓冲区元素(对应于某个条形图)分配一个 从0到1000的随机数。如果你很难理解某个缓冲区元素是如何对应某个条形图的,可以尝试用以下方式改变周期,并在终端看到结果。

for(int i=0;i<Bars;i++)
{
   ExtMapBuffer1[i]=i;
}



 
diostar:

双关[]
系列数组,包含当前图表中每个条形的收盘价。

系列数组元素的索引顺序是相反的,即从最后一个到第一个。当前的条形图是数组中的最后一个,其索引为0。最古老的条形图,即图表中的第一个,其索引为Bars-1。

好的,我想我现在明白了,谢谢
 
谢谢大家

随着我对指标的进一步了解,我所使用的设计对于在EA中使用不是很有用,可能只适合于视觉和/或手动使用。

由于计数器向下计数为1--似乎使用这种方法将不利于在交易中引用任何数组对象,除非我只引用一个特定的shift[i],在这种情况下,我将不得不想办法只引用那些我想用于交易信号的数组元素,而这些元素只位于那些特定的Bars。

按照目前的情况使用它,可能会导致交易在整个图表上发生,就像指标一样。

所以我想我现在要学习的是如何在任何指标中引用各种数组元素,以便引用这些值/时间/熊等。

谢谢大家的帮助,这将给我带来很多思考,让我知道如何创建iCustom指标并让它们在EA中发挥作用。