帆布很酷! - 页 82

 
Vitaliy Kuznetsov #:

事实证明,通常的指标代码改进方法无法全面解决与封闭代码中使用对象的 EA 之间的冲突。

我希望通过改进智能交易系统能全面解决与所有仪表盘指标的冲突(这是我的任务)。

我在 MT4 build 1353 主题中写道,也许终端程序员会注意到这一点。

附注:我在猫头鹰中做了一些更改,但有些滑雪板没有去...

查看整个代码(指标和智能交易系统),找出调用 ObjectGetXXX、ObjectFind、ObjectsTotal、ObjectName 等的位置和原因 - 它们是同步的,会严重降低运行速度。如果可能,尽量去掉它们。

不要忘记调用上面的 ChartRedraw()!!!!...

 

各位版主,我被说成是一派胡言,却不允许我回应?太神奇了

 
Maxim Kuznetsov #:

查看整个代码(指标和 EA),找出调用 ObjectGetXXX、ObjectFind、ObjectsTotal、ObjectName 等的位置和原因 - 它们是同步的,会严重降低运行速度。如果可能的话,尽量去掉它们。

不要忘记调用上面的 ChartRedraw()!!!!...

您只需要明智地调用 OnChartEvent(),而不是连续对所有事件做出反应。否则我就不知道那里有什么了...为什么要坐在这里替那个连问题代码都不愿意展示的人思考呢?

现在,我插入了一个重复 1000000 次 ObjectFind() 和 ObjectGet() 的循环 - 一切正常。

 
Dmitry Fedoseev #:

各位版主,我被说成是一派胡言,却不允许我回应?太神奇了

你不是唯一一个受到这种选择性对待的人。

 
Dmitry Fedoseev #:

您只需明智地使用 OnChartEvent(),而不是连续对所有事件做出反应。或者我不知道这是什么....。为什么要坐在这里替一个连代码都懒得显示的人思考问题呢?

现在,我插入了一个重复 1000000 次 ObjectFind() 和 ObjectGet() 的循环 - 一切正常。

好吧,我写第四次,这对我来说并不难。

https://www.mql5.com/ru/forum/379526/page9#comment_25865481


如果您打开链接,会在帖子底部发现一个包含代码的附件。然后,您就可以阅读帖子,了解讨论是由谁以及如何展开的。

问题并不特别出在提议的代码中(您可以自己编写任何带有对象的智能交易系统),而是出在一个全局错误上,该错误会影响所有带有对象的智能交易系统(只有一个例外),即在通过指标使用图表切换功能时。

Nikolay 提供了他的解决方案,但我在编写此类代码时出现了错误,因此我正在进一步处理这个问题。

Новая версия платформы MetaTrader 4 build 1350 - Если у вас проблемы с дешбордами, то придется удалять объекты чарта.
Новая версия платформы MetaTrader 4 build 1350 - Если у вас проблемы с дешбордами, то придется удалять объекты чарта.
  • 2021.11.10
  • www.mql5.com
точнее в очередностях OnInit удалении своих объектов чарта. Тут ремонт терминала не имеет смысла не создавайте объектов по крайней мере до первого OnChartEvent. И удалять объекты пачкой лучше по ChartObjectsDelete
 
Dmitry Fedoseev #:

您只需明智地使用 OnChartEvent(),而不是连续对所有事件做出反应。或者我不知道这是什么....。为什么要坐在这里替一个连代码都懒得显示的人思考问题呢?

现在,我插入了一个重复 1000000 次 ObjectFind() 和 ObjectGet() 的循环- 一切正常。

我有一个模糊的疑问:你写过比循环更复杂的东西吗?

 
Vitaliy Kuznetsov #:

好吧,我写第四次,对我来说没问题。

https://www.mql5.com/ru/forum/379526/page9#comment_25865481


如果您打开链接,会在帖子底部发现一个带有代码的附件。然后,您就可以阅读帖子的内容、作者以及讨论是如何展开的。

问题并不特别出在提议的代码中(您可以自己编写任何带有对象的智能交易系统),而是出在一个全局错误中,当通过指标使用图表切换功能时,这个错误会影响所有带有对象的智能交易系统(只有一个例外)。

Nikolay 提供了他的解决方案,但我在编写此类代码时出现了错误,因此我正在进一步处理这个问题。

改动如下:

   if(sparam=="Win_Ea_"){ // вот тут надо поцивильней сделать, из класса брать имя... но уж сами как-нибудь 
      if(id == CHARTEVENT_OBJECT_CLICK){
         if(win.BtnClickUP()){
         
            win.Process();
            
            ChartPeriodSet(true);
            
         }
         if(win.BtnClickDN()){
         
            win.Process();
            
            ChartPeriodSet(false);
            
         }
      }
   }
   if(id == CHARTEVENT_MOUSE_MOVE){
      MouseX=(int)lparam;
      MouseY=(int)dparam;
      
   }

我成功摆脱了糟糕的挂起现象。如果你以有节奏的速度按下按钮,一切都会好起来。

但如果你开始像啄木鸟一样敲击,就会再次出现挂起,只是挂起的时间不同而且更短。我不认为

你无法摆脱它们。也许这与时间框架结构有关。

我需要在按钮上下功夫,使按钮有按下/未按下的位置,并引入惯性,使按钮不会立即被按下。

延迟 0.1 秒就可以解决这个问题,用户也不会注意到。

--

事实上,如果没有专家,您可以以极快的速度敲击按钮....。

 

现在,我已经完全摆脱了悬挂。

虽然可能有点歪,但重点是最重要的:

void windows_class::~windows_class(){
   //Canvas.Destroy();
}
int OnDeinit(const int r){
   if(r==REASON_REMOVE){
      Canvas.Destroy();
   }
}

重点是切换图表时不要删除对象。

我们应该看看 Destroy() 时会发生什么...如果可以这样做的话...

 

大家好!)

很抱歉,如果我们谈论的是 mq4,那么也许可以这样解决:?)

void OnChartEvent(const int     id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
{
   if(id == CHARTEVENT_CLICK
   || id == CHARTEVENT_CHART_CHANGE)
   {ChartSetSymbolPeriod(0,NULL,0);}
}
 

否则就会造成刹车失灵:

void OnTick(void){
  win.Process();
}

为什么?