你应用一个函数,与图表一起工作。对于指标来说,创建图表的保证是第一次进入OnCalculate,对于专家顾问来说,是第一次进入OnTick()。但之前没有。
没问题。如果还没有图形,让该函数返回false和相应的错误代码。但事实并非如此,该函数很自豪地报告说执行成功。请注意,文档中没有说这是向图形成功发送消息的一个标志。它明确地说:成功地执行了职能。
另外,这也是回放的代码。事实上,甚至在ChartNavigate调用 之前,我就有一个对时间序列的调用。而且事实证明,所有这些都是正确填写的。也就是说,已经有了一个图表,有了它的数据。此外,还可以从图表中读出在终端关闭前已经放置到图表中的图形对象。
因此,从所有迹象来看,该图表已经存在。
这很奇怪。它对我来说没有任何问题。
还有一点要注意:在偏移图形之前,你必须禁用其自动偏移CHART_AUTOSCROLL。
没问题。如果还没有图形,让该函数返回false和相应的错误代码。但事实并非如此,该函数很自豪地报告说执行成功。请注意,文档中并没有说这是向图形成功发送消息的标志。它明确地说:成功地执行了职能。
另外,这也是回放的代码。事实上,甚至在ChartNavigate调用 之前,我就有一个对时间序列的调用。而且事实证明,所有这些都是正确填写的。也就是说,已经有了一个图表,有了它的数据。此外,还可以从图表中读出在终端关闭前已经放置到图表中的图形对象。
因此,从所有迹象来看,该图表已经存在。
图表和数据是两个很大的区别。
所有提及图表的功能都是异步的:即单向的--射出后就被遗忘。而在这种情况下,真实只是意味着你已经正确地填写了这个函数的字段,仅此而已。
当所有的数据都准备好了,并且绘制好了图形,这个标志就是Oncalculate/OnTick的第一个输入。
图表和数据是两个很大的区别。
所有图的访问功能都是异步的:也就是单程的--拍了就忘。在这种情况下,真实只意味着你已经正确地填写了这个函数的字段,没有别的意思。
当所有的数据都准备好了,并且绘制好了图形,这个标志就是Oncalculate/OnTick的第一个输入。
那么你如何解释它对我来说是完美无缺的呢?在OnInit()中,与该主题的第一篇帖子完全一样...你为什么要胡说八道呢?
这很奇怪。它对我来说没有任何问题。
你有什么构造?我有1861年。
还有一点要注意:在偏移图形之前,你应该禁用其自动偏移CHART_AUTOSCROLL。
是的,我在第一个步骤中指出了这一点,以便进行回放。
你的构造是什么?我有1861年。
是的,这就是我在第一步指出的重放。
我也有1861年的。只设法复制了一次。所有其他的尝试都运作良好。
图表和数据是两个很大的区别。
所有图的访问功能都是异步的:即单程旅行--拍了就忘。
不,不是所有的人。有的则被特别注释出来。例如,同样的ChartApplyTemplate。
在这种情况下,真实只意味着你已经正确地填写了这个函数的字段,没有别的意思。
如果图表本身还不存在,该函数是如何确定图表的ID是正确的?
当所有的数据都准备好并绘制出图形时的标志是对Oncalculate/OnTick的第一个输入。
不幸的是,没有。下面是代码。
#property indicator_chart_window int OnInit() { Print(__FUNCTION__, ", баров: ", Bars(Symbol(), PERIOD_CURRENT)); return(INIT_SUCCEEDED); } void OnDeinit(const int reason) { } int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { Print(__FUNCTION__, ", баров: ", Bars(Symbol(), PERIOD_CURRENT)); return(rates_total); }
它的工作原理是这样的。
16:01:31.765 Test (XBNUSD,M1) OnInit, баров: 0 16:01:33.531 Test (XBNUSD,M1) OnCalculate, баров: 37026 16:01:34.010 Test (XBNUSD,M1) OnCalculate, баров: 46484
我在一个新的符号上运行该指标,该符号的图表从未被打开过,也就是说还没有在其上生成数据。
在第一行(OnInit),确实没有数据。然而,有了图表ID,我们可以在OnInit()中创建对象,这些对象将被成功地显示在图表上。
第二行已经有了数据,但它是不完整的。数据在第三次迭代时是完整的。
我们有理由得出结论,对OnCalculate的第一次调用并不能保证数据的加载。它只是打开图表后符号上的第一个刻度,它可能在一些数据后出现,或者根本没有任何其他数据。
回到主题中提出的问题,我们得到ChartNavigate()函数 并没有检查参数的正确性。如果在OnInit()中还没有数据(0条),而数值-1000被传递给了函数,那么如果没有条,我们怎么能认为这个数值是正确的?毕竟,任何其他函数在用不存在的索引访问酒吧时都会返回一个错误。但它在这里是成功的。究竟什么是成功?
这里是指标--专门设置了9个点的延迟,两种类型的图表运动和强制重绘的标志(开/关)。
//+------------------------------------------------------------------+ //| ProjectName | //| Copyright 2012, CompanyName | //| http://www.companyname.net | //+------------------------------------------------------------------+ #property indicator_chart_window #property indicator_plots 0 //--- input parameters input bool redraw=true; input ENUM_CHART_POSITION position=CHART_BEGIN; //--- long count=0; //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnInit() { count=0; //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { Comment(""); } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total, const int prev_calculated, const datetime &time[], const double &open[], const double &high[], const double &low[], const double &close[], const long &tick_volume[], const long &volume[], const int &spread[]) { count++; Comment(count); if(count==9) { ResetLastError(); if(position==CHART_BEGIN) { if(ChartNavigate(0,CHART_BEGIN,100)) Print("Успешно. redraw ",redraw,". position ",EnumToString(position)); else Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position)); } if(position==CHART_END) { if(ChartNavigate(0,CHART_END,-100)) Print("Успешно. redraw ",redraw,". position ",EnumToString(position)); else Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position)); } if(redraw) ChartRedraw(); } return(rates_total); } //+------------------------------------------------------------------+
初步:CHART_BEGIN 是稳定的。
但如果没有虱子,是周末呢?然后,必须连接定时器。
而要解决的问题只有一个:如何确定ChartNavigate是否已经成功执行?事实上,它返回的是真,它只是 "滴答",对实际工作没有帮助。
我遇到了一个关于ChartNavigate函数 的问题。做错了什么,还是功能真的有问题。如果你经常使用它,请回信。
所以问题的关键在这里:ChartNavigate并没有转移图表的位置 当启动终端时 如果该函数是在OnInit()中调用的。我特意看了几遍文档。没有任何地方说在初始化过程中不能调用该函数。
编码 指标 用于播放。
玩的步骤。