初始化过程中的ChartNavigate - 页 2

 
Ihor Herasko:

如果没有虱子,周末怎么办?然后必须连接一个定时器。

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

我需要检查我在上面发布的专家顾问的代码...

 
Vladimir Karputov:

我需要检查我上面在EA中发布的代码...

EA与此有什么关系?

 
Ihor Herasko:

这与议员有什么关系呢?

我们应该检查...

//+------------------------------------------------------------------+
//|                                                  Test EA.mq5.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//--- input parameters
input bool redraw=true;
input ENUM_CHART_POSITION position=CHART_BEGIN;
//---
long count=0;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   count=0;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   count++;
//Comment(count);
   if(count==9 || count==19)
     {
      ResetLastError();
      if(position==CHART_BEGIN)
        {
         if(ChartNavigate(ChartID(),CHART_BEGIN,100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(position==CHART_END)
        {
         if(ChartNavigate(ChartID(),CHART_END,-100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(redraw)
         ChartRedraw();
     }
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
   long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
//--- добавим символ переноса строки 
   string comm="\r\n";
//--- дополним коментарий 
   comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
//--- выведем комментарий 
   Comment(comm);
  }
//+------------------------------------------------------------------+
附加的文件:
Test_EA.mq5  6 kb
 

Vladimir Karputov:

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

你不是一个初学者。你为什么要误导呢?你为什么无视Renat Fatkhullin所说的话?

在你的代码中(如这里,所以在这里),它通过在每一个tick上创建注释来强制重绘图表。


也就是说,无论输入参数中的标志是启用还是禁用。


而在这种情况下,在输入参数中加入你的标志,只会导致通过ChartRedraw() 进行额外的重绘。

也就是说,它不是有用的,而是通过创造评论给已经存在的人带来了额外的负担。

P./S.。

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

错误、漏洞、问题

Renat Fatkhullin, 2017.12.05 02:51

...

在MT5中,评论功能明确地导致图表被重新绘制...

区别就在于此。


如果在MT4中调用Comment后,你强行把ChartRedraw(),行为还是和MT5中不一样。Metatrader 4中的ChartRedraw()忽略了注释值,自己决定是否从最后一帧开始更新图表。当然,在没有每秒数百个报价会导致图表数据失效的情况下,ChartRedraw决定 "为什么要画一个没有变化的图表",并跳过绘制框架。

Metatrader 5也有同样的系统,但有更多的情况下,无条件的渲染会优先考虑。

终端是图形化的应用,可以提供每秒数百帧的画面,并为了性能而在精益显示模式下运行。


因此,在运行基准时有额外的结论。

  • 我们不应该把ChartRedraw的调用看作是真正的图表绘制。

  • 你必须始终知道并证明 "为什么图表会被重新绘制 "和 "我是否使市场的内部图景失效,从而使终端决定重新绘制图表 "的说法。

  • 在MT5的基准测试中,你不应该做多个结论,你应该始终考虑你是如何影响渲染的。

  • MT5有一个更正确的系统来改变图表上的对象,有必要清楚地了解读/写命令的后果。
    建议不要混合使用读/写命令,并分别进行大量读和大量写。

  • 在基准测试中频繁重绘图表导致结果对显卡的高度依赖性。
    事实上,一些测试最终可能会测试显卡,而不是算法或功能。在笔记本电脑和台式电脑上的测试可能会显示多次不同的结果,仅仅是因为显卡慢了3-5倍。

这些错误每个人都会犯。


 

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

初始化过程中的ChartNavigate

Vladimir Karputov, 2018.06.25 18:52

得检查一下...

...
void OnTick()
  {
//---
   count++;
//Comment(count);
   if(count==9 || count==19)
     {
      ResetLastError();
      if(position==CHART_BEGIN)
        {
         if(ChartNavigate(ChartID(),CHART_BEGIN,100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(position==CHART_END)
        {
         if(ChartNavigate(ChartID(),CHART_END,-100))
            Print("Успешно. redraw ",redraw,". position ",EnumToString(position));
         else
            Print("Ошибка №",GetLastError(),". redraw ",redraw,". position ",EnumToString(position));
        }
      if(redraw)
         ChartRedraw();
     }
//--- получим номер самого первого видимого на графике бара (нумерация как в таймсерии) 
   long first_bar=ChartGetInteger(0,CHART_FIRST_VISIBLE_BAR,0);
//--- добавим символ переноса строки 
   string comm="\r\n";
//--- дополним коментарий 
   comm=comm+"Первый бар на графике имеет номер "+IntegerToString(first_bar)+"\r\n";
//--- выведем комментарий 
   Comment(comm);
  }
//+------------------------------------------------------------------+

P./S.: 除了你的第二个代码:在通过同一评论更新文本输入和发布之前,请检查数据是否已经改变。如果没有,最好推迟文本更新和出版。

也就是说,在这种情况下,它是指图表上第一根柱子的数量是否发生了变化。

 
Vladimir Karputov:

我必须检查...

嗯。我不太清楚那是怎么回事。好吧,那么。我已经安装好了。在CHART_BEGIN 和CHART_END模式下检查了它。 它的工作情况与宣传的一样。重新启动后,就可以了。

或者你已经到了需要使用拐杖的地步--在ChartNavigate之后检查图表上第一个条形图的编号,如果不是正确的,再运行ChartNavigate。

是的,出路,当然,我也想过这个问题。但是,不断地记住这样的终端设备是令人厌烦的。毕竟,这很有可能是一个错误。

 
Dina Paches:

P./S.: 除了你的第二个代码外:在更新一个文本条目并通过同一评论发表之前,请检查数据是否已经改变。如果没有,最好推迟文本更新和出版。

也就是说,在这种情况下,它是指图表上第一个条形的数字是否发生了变化

当然,感谢你提供的信息,但我们在这里谈论的不是性能。我们讨论的问题是在一个稍微不同的平面上,这只是测试代码,以检查问题是否已经表现出来 ))

 
Ihor Herasko:

当然,谢谢你提供的信息,但我们在这里谈论的不是性能。我们讨论的问题是在一个稍微不同的平面上,这只是测试代码,以检查问题是否出现 ))

不客气。但也请看我的 另一篇文章,你引用的那篇是后记。

P./S.: 请不要贬值。我不会在我的车上运行这样的代码,因为我知道它所带来的后果。我的设备不是政府发放的

 
Ihor Herasko:

嗯。我不太清楚那是怎么回事。好吧,那么。安装好了。在CHART_BEGIN 和CHART_END模式下进行了检查。 一切都像宣传的那样工作。重新启动后,就可以了。

或者你已经到了需要使用拐杖的地步--在ChartNavigate之后检查图表上第一个条形图的编号,如果不是正确的,再运行ChartNavigate。

是的,出路,当然,我也想过这个问题。但是,不断地记住这样的终端设备是令人厌烦的。毕竟,这很有可能是一个错误。

我曾经有一个工作导航。现在我得故意检查一下。


补充:不要注意评论 :)

 
Vladimir Karputov:

我的导航曾经工作过。现在我得故意检查一下。


新增: 忽略评论 :)

为什么?我写了/报告了胡言乱语吗?