错误、漏洞、问题 - 页 3032

 
Andrey Dik:

谢谢你,安德鲁。你是唯一一个完全理解这个问题的人。


现在一切都在按计划进行,指标在第一次运行时只完全计算了一次,然后每次在其新条上只计算一次。


第二个指标的最终代码希望能对某人有用。

以下是你应该想到的开头内容

关于交易、自动交易系统和策略测试的论坛

虫子、虫子、问题

Alexey Viktorov, 2021.05.28 08:36

这个检查是为了什么?

//проверка готовности данных и индикатора на другом TF
if (SeriesInfoInteger (Symbol (), tf, SERIES_SYNCHRONIZED))
{
  if (iBars (Symbol (), tf) != BarsCalculated (handleFr)) return 0;
}
else return 0;

在没有任何条件的情况下,写成return 0;会更容易。

在每一个新的条形图上,条件将被满足,所有条形图将被重新计算,而不考虑同步性。你写了一个考虑不周的代码,并假装它是一个终端错误...


而伊戈尔-马卡努在更早的时候就说过这句话......
 

我想提醒你。

1.对于每个符号,至少有一个图表是开放的,有一个单独的线程来处理进入的ticks。一些符号的几个图表可以被打开,但仍然只有一个线程。

2.符号线程不处理图表,而是处理时间序列。也就是提交给CopyRates请求的同样的数据数组。

3.在OnTick或OnCalculate 中询问你的符号是否同步是没有用的。当然是这样!

4.所有时间序列都按顺序处理,从低到高。首先,我们应用刻度线,然后计算所有指标,在这个时间序列创建。如果你从指标中询问同一H1符号的数据,在M1上工作,你将永远不会得到应用tick的数据。无论你运用什么技巧,数据都会往后退一个刻度。因为每个符号有一个线程,有连续的时间框架处理。

5.前面的说法并不适用于EA和脚本,因为EA和脚本各自在自己的独立线程中工作。

 
Slava:

我想提醒你。

1.对于每个符号,至少有一个图表是开放的,有一个单独的线程来处理进入的ticks。一些符号的几个图表可以打开,但反正只有一个线程。

2.符号线程处理时间序列,而不是图表。也就是提交给CopyRates请求的同样的数据数组。

3.在OnTick或OnCalculate 中询问你的符号是否同步是没有用的。当然是这样!

4.所有时间序列都按顺序处理,从低到高。首先,应用刻度线,然后计算所有指标,在这个时间序列上创建。如果你从指标中询问同一符号H1的数据,在M1上工作,你将永远不会得到应用tick的数据。无论你运用什么技巧,数据都会往后退一个刻度。因为每个符号有一个线程,有连续的时间框架处理。

5.前面的声明不涉及专家顾问和脚本,因为专家顾问和脚本在他们自己的独立线程中工作。

请给我发更多像这样的详细提醒!谢谢你!

 
Slava:

我想提醒你。

4.所有的时间序列都按顺序处理,从最低到最高。首先是tick应用,然后是在这个时间序列上创建的所有指标的计算。如果你要求从一个指标中获得同一H1符号的数据,在M1上工作,你将永远不会得到有应用刻度的数据。无论你运用什么技巧,数据都会往后退一个刻度。因为每个符号有一个线程,有连续的时间框架处理。

5.前面的说法并不适用于EA和脚本,因为EA和脚本各自在自己的独立线程中工作。

我的理解是否正确,如果一个在M1上工作的EA在M1(或任何其他TF)上使用一个从上层TF获取数据的指标,那么在新条形图的第一个刻度上,它在任何情况下都无法返回实际值,因为计算上层TF的队列将在n个刻度后到达?

我只是面对这样的行为,在指标中寻找问题,现在发现应该是这样的。但如果是这样,就会严重干扰测试,因为在OHLC模式下测试时,我必须跳过一些关键的点。

 
Slava:

2.符号流不处理图形,而是处理时间序列。就是说,给CopyRates请求的数据数组就是

....

4.所有时间序列都按顺序处理,从低到高。首先是应用刻度线,然后是计算所有指标,在这个时间序列上创建。如果你要求从一个指标中获得同一H1符号的数据,在M1上工作,你将永远不会得到有应用刻度的数据。无论你运用什么技巧,数据都会往后退一个刻度。因为每个符号有一个线程,有连续的时间框架处理

为什么我切换TF的时候会出现黑色的 "更新 "屏幕?

打开我之前使用的图表(欧元兑美元的H1),离开指标,2-3分钟什么都没做,然后切换到较低的图表(M30...M1),黑屏 "更新 "可能出现10秒钟。

而这个黑屏取决于构建--当终端没有黑屏时,当它真的让我恼火时,因为你清楚地知道加载的是什么历史,你只需要向终端呈现一个图表,为什么要等待这个黑屏?


例如,如果指标在M5上运行,每30分钟调用H1上的指标,CopyBuffer()是否总能从H1上获得正确的数据?

或者不是一个事实,因此在H1的每一个刻度 上 "拉动指标"(还没有考虑连接的断裂)。

 

如何处理一个循环/函数中的变量到另一个函数中?

能否使能见度更加全球化?

 
Igor Makanu:

为什么切换TF时出现黑色的 "更新 "屏幕?

打开我之前使用的图表(欧元兑美元的H1),离开指标,2-3分钟什么都没做,然后切换到较低的图表(M30...M1),可能出现10秒钟的 "黑屏更新"

而这个黑屏取决于构建--当终端没有黑屏时,当它真的让我恼火时,因为你清楚地知道加载的是什么历史,你只需要向终端呈现一个图表,为什么要等待这个黑屏?


例如,如果指标在M5上运行,每30分钟调用H1上的指标,CopyBuffer()是否总能从H1上获得正确的数据?

或者不是一个事实,因此在H1的每一个tick 上 "拉动指标"(我们还没有考虑连接中断的变体)。

我认为,根据斯拉瓦的话,这不是一个事实。

由于所有的计算都只在tick上进行,绑定的指标链可能无法完成,我们将不得不等待下一个tick。

但也有一些有趣的问题,我在文档中没有找到答案。

如果没有嘀嗒声,该怎么办? 如果你放置一个在当前时间框架内工作的指标,它将被顺利绘制,而且有趣的是--它不需要接收嘀嗒声!但如果该指标要求从另一个时间框架获得数据,它将不会做任何事情,直到一个新的嘀嗒声到来,而没有嘀嗒声到来--周末

如果我们在定时器中调用ChartRedraw(ChartID()),那么对于某些评论(cnt);其中cnt递增1,我们看到cnt在屏幕上正常工作,但指标没有被绘制

当我用上下文菜单中的刷新按钮刷新屏幕时,指标从头到尾被重新绘制。

但只要你用 "刷新 "按钮 刷新屏幕,指标就会顺利绘制。


HH 你的第二个指标的例子可以使用,但专家的代码更快。

 
Andrey Dik:

如果你把一个指标放在当前的TF上工作,它将毫无问题地被画出来,而且有趣的是--嘀嗒声的到来对这一点是没有要求的!

没必要

当你在图表上绘制指标时,有一个严格定义的调用顺序:OnInit()和立即OnCalculated()。也就是说,第一个OnCalculated()是在收到tick之前调用的,这就是为什么prev_calc 需要与0 比较。

Andrey Dik:

事实证明,ChartRedraw()和Update by button并不是一回事,尽管我可以反过来想。

最有可能的是,你应该使用ChartSetSymbolPeriod(),参数为NULL 和当前周期,应该有帮助。

 
Igor Makanu:

最有可能的是,你应该使用ChartSetSymbolPeriod(),参数为NULL 和当前周期,应该有帮助。

设置符号周期(ChartSetSymbolPeriod)

使用相同符号和时间框架的ChartSetSymbolPeriod调用可以用来刷新图表(类似于终端中的Refresh命令)。图表的刷新,反过来又会触发附属于它的指标的重新计算。因此,你可以在图表上重新计算指标,即使在没有刻度的时候(例如周末)。

我现在还记得,普希金曾经说过。

哦,有多少奇妙的发现
,为我们 开明的精神做准备
,还有经验,艰难错误的儿子,
,天才,悖论的朋友,
,机会,上帝的发明者。

 
Andrey Dik:


当滴答声没有到来时(例如周末)该怎么办? 如果指标在当前的时间框架内工作,它将顺利绘制,而且有趣的是--它不需要滴答声来!但如果指标要求从另一个时间框架获得数据,它不能做任何事情,直到新的滴答声到来,而它没有到来--周末


从另一个时间框架中,将获得目前已经准备好的数据。因此,在输出中,所有的数据将完全同步。

原因: