初始化过程中的ChartNavigate

 

我遇到了一个关于ChartNavigate函数 的问题。做错了什么,还是功能真的有问题。如果你经常使用它,请回信。

所以问题的关键在这里:ChartNavigate并没有转移图表的位置 当启动终端时 如果该函数是在OnInit()中调用的。我特意看了几遍文档。没有任何地方说在初始化过程中不能调用该函数。

编码 指标 用于播放。

#property indicator_chart_window 
int OnInit()
{
   if (ChartNavigate(0, CHART_END, -1000))
      Alert("Успешно");
   else
      Alert("Ошибка №", GetLastError());

   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[])
{
   return(rates_total);
}

玩的步骤。

  1. 关掉图表自动播放。
  2. 将指标附在图表上。ChartNavigate将通过移动图表到所需位置来触发。
  3. 卸载终端。
  4. 加载终端。显示没有偏移量的图表,ChartNavigate将无法工作。
好的,如果该函数会出现错误。但它并没有。所有的调用都是成功的,但就是在终端重新加载时,图表没有移位。

 
你应用一个函数,与图表一起工作。对于一个指标来说,图表创建的保证是OnCalculate 的第一个条目,对于一个EA来说,是OnTick()的第一个条目。但之前没有。
 
Vladimir Karputov:
你应用一个函数,与图表一起工作。对于指标来说,创建图表的保证是第一次进入OnCalculate,对于专家顾问来说,是第一次进入OnTick()。但之前没有。

没问题。如果还没有图形,让该函数返回false和相应的错误代码。但事实并非如此,该函数很自豪地报告说执行成功。请注意,文档中没有说这是向图形成功发送消息的一个标志。它明确地说:成功地执行了职能。

另外,这也是回放的代码。事实上,甚至在ChartNavigate调用 之前,我就有一个对时间序列的调用。而且事实证明,所有这些都是正确填写的。也就是说,已经有了一个图表,有了它的数据。此外,还可以从图表中读出在终端关闭前已经放置到图表中的图形对象。

因此,从所有迹象来看,该图表已经存在。

 

这很奇怪。它对我来说没有任何问题。

还有一点要注意:在偏移图形之前,你必须禁用其自动偏移CHART_AUTOSCROLL

 
Ihor Herasko:

没问题。如果还没有图形,让该函数返回false和相应的错误代码。但事实并非如此,该函数很自豪地报告说执行成功。请注意,文档中并没有说这是向图形成功发送消息的标志。它明确地说:成功地执行了职能。

另外,这也是回放的代码。事实上,甚至在ChartNavigate调用 之前,我就有一个对时间序列的调用。而且事实证明,所有这些都是正确填写的。也就是说,已经有了一个图表,有了它的数据。此外,还可以从图表中读出在终端关闭前已经放置到图表中的图形对象。

因此,从所有迹象来看,该图表已经存在。

图表和数据是两个很大的区别。

所有提及图表的功能都是异步的:即单向的--射出后就被遗忘。而在这种情况下,真实只是意味着你已经正确地填写了这个函数的字段,仅此而已。

当所有的数据都准备好了,并且绘制好了图形,这个标志就是Oncalculate/OnTick的第一个输入。

 
Vladimir Karputov:

图表和数据是两个很大的区别。

所有图的访问功能都是异步的:也就是单程的--拍了就忘。在这种情况下,真实只意味着你已经正确地填写了这个函数的字段,没有别的意思。

当所有的数据都准备好了,并且绘制好了图形,这个标志就是Oncalculate/OnTick的第一个输入。

那么你如何解释它对我来说是完美无缺的呢?在OnInit()中,与该主题的第一篇帖子完全一样...你为什么要胡说八道呢?

 
Alexey Viktorov:

这很奇怪。它对我来说没有任何问题。

你有什么构造?我有1861年。

还有一点要注意:在偏移图形之前,你应该禁用其自动偏移CHART_AUTOSCROLL

是的,我在第一个步骤中指出了这一点,以便进行回放。

 
Ihor Herasko:

你的构造是什么?我有1861年。

是的,这就是我在第一步指出的重放。

我也有1861年的。只设法复制了一次。所有其他的尝试都运作良好。

 
Vladimir Karputov:

图表和数据是两个很大的区别。

所有图的访问功能都是异步的:即单程旅行--拍了就忘。

不,不是所有的人。有的则被特别注释出来。例如,同样的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稳定的

附加的文件:
Test.mq5  6 kb
 
Vladimir Karputov:

这里是指标--专门设置了9个点的延迟,两种类型的图表运动和强制重绘的标志(开/关)。


初步:CHART_BEGIN 稳定地工作。

但如果没有虱子,是周末呢?然后,必须连接定时器。

而要解决的问题只有一个:如何确定ChartNavigate是否已经成功执行?事实上,它返回的是真,它只是 "滴答",对实际工作没有帮助。

原因: