文章 "图形界面 X: 高级列表和表格管理。代码优化 (集成构建 7)" - 页 3

 

Tol,我意识到这不是一个合适的主题,但自从最近的更新....。

总的来说:我很久以前就注意到了这个问题,但我一直在等待这次更新(以防它被修复,但没有......)。

如果有一个带图表的窗口(CStandartChart),而子图的顶部有一个窗口,那么如果与服务器的连接中断,然后又恢复,对象图会变得高于其他窗口。

这就需要以某种方式重新绘制最上面的窗口。显然,您可以在 CProgram 中跟踪这一点,但在我看来,应该由程序库来做这些事情。

(虽然速度会慢很多,但这可能是由于实时记录的缘故)。


 
Artyom Trishkin:

...

如果有一个带图表的窗口(CStandartChart),而子图的顶部有一个窗口,那么如果与服务器的连接断开,然后又恢复,图表对象就会高于其他窗口。

这就需要以某种方式重新绘制最上面的窗口。显然,您可以在 CP 程序中跟踪这一点,但在我看来,应该由库来做这些事情。

(它的运行速度很慢,但这可能是因为实时记录的缘故)。

好的,谢谢你的信息。我还没有测试过断开/重新连接。我看看能做些什么。

为什么刹车如此糟糕?用什么程序录音?速度很慢。看起来好像处理器处于 100% 负载状态?我试着用Fast Stone Capture 录音,并积极使用 MQL 应用程序中的图形用户界面。一切正常,没有任何东西像这样变慢。

 
Anatoli Kazharski:

好的,谢谢您的信息。我还没有测试过断开/重新连接。我看看能做些什么。

速度变慢是怎么回事?用什么程序录制?速度很慢。看起来好像处理器是 100% 负载?我试着用Fast Stone Capture 录音,并积极使用 MQL 应用程序中的图形用户界面。一切都很正常,没有任何东西像这样变慢。

这是 oCam 的免费版本。但是,顺便说一下,如果没有实时记录,速度也会变慢。有很多对象。在计时器中,您必须扫描许多符号的价格交叉水平,每个符号都有自己的交叉水平,符号列表是动态的,还需要监控其变化。有一点很好--更新后,我不必像上次那样重做了;)))。
 

Artyom Trishkin:
...

不过,顺便说一句,在没有实时录音的情况下,我也在放慢速度。

有很多对象。

定时器必须扫描许多符号的价格交叉水平,每个符号的价格交叉水平都不一样,而且符号列表是动态的,还需要监控其变化。

...
这些检查的频率是多少?
 
Anatoli Kazharski:
检查的频率是多少?

定时器:

//+------------------------------------------------------------------+
//| 定时器|
//+------------------------------------------------------------------+
void CProgram::OnTimerEvent(void)
  {
   CWndEvents::OnTimerEvent();
//---
   static int count=0;
   if(count<500)
     {
      count+=TIMER_STEP_MSC;
      return;
     }
//-- 将计数器清零
   count=0;
//--- 在市场观察中捕捉变化
   if(IsChangeSymbolListInMW()) {
      UpdateAllDataAndTables();
      }
//--- 捕捉新条形的出现
   bool need_update=false;
   for(int i=0; i<ArraySize(m_array_new_bar); i++) {
      if(m_array_new_bar[i].isNewBar()>0) {
         string sy=m_array_new_bar[i].GetSymbol();
         ENUM_TIMEFRAMES timeframe=m_array_new_bar[i].GetPeriod();
         Print("新酒吧",sy,"上,GetNameTF(timeframe));
         if(timeframe==PERIOD_D1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_d1); j++) delete m_array_symbols_new_sig_d1[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_d1);
            }
         if(timeframe==PERIOD_W1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_w1); j++) delete m_array_symbols_new_sig_w1[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_w1);
            }
         if(timeframe==PERIOD_MN1) {
            for(int j=0; j<ArraySize(m_array_symbols_new_sig_mn); j++) delete m_array_symbols_new_sig_mn[j].symbol_tick;
            ZeroMemory(m_array_symbols_new_sig_mn);
            }
         need_update=true;
         }
      }
   if(need_update) {
      UpdateAllDataAndTables();
      }
//--- 更改主窗口中的数值文本
   short row=(short)m_table_base_symbol_list.SelectedItem();
   ChangeTextData(row);

//--- 寻找通知标准 D1、W1、MN1
   GetNotify(m_sorted_struct_symbols_d1,m_array_symbols_new_sig_d1,PERIOD_D1);
   GetNotify(m_sorted_struct_symbols_w1,m_array_symbols_new_sig_w1,PERIOD_W1);
   GetNotify(m_sorted_struct_symbols_mn,m_array_symbols_new_sig_mn,PERIOD_MN1);
//--- 重绘图形
   m_chart.Redraw();
  }
//+------------------------------------------------------------------+
定时器步长 (TIMER_STEP_MSC) 16
 
Artyom Trishkin:

定时器:

...
定时器步长 (TIMER_STEP_MSC) 16

是否有必要在定时器中进行这种条件检查?

如果在定时器中进行,为何如此频繁?

您可以尝试减少步长,并为每组条件设置不同的时间间隔。我为此添加了CTimeCounter 类。请再次阅读文章,了解如何使用该类。部分:项目测试应用

 
Anatoli Kazharski:

是否有必要在计时器中检查此类情况?

如果在计时器中,为什么要如此频繁?

您可以尝试减少步长,并为每组条件设置不同的时间间隔。我为此添加了CTimeCounter 类。请再次阅读文章,了解如何使用该类。部分:项目测试应用程序

是的,我已经在考虑这个问题了。

当然,对新条形图的检查可以少做一些--这并不重要。但检查价格是否越过某些符号的水平线(它们的列表会分别动态变化,并且会动态添加/删除与刻度线有关的类的实例)的频率应该足够高,以便能够及时确定越线的事实。

当我读到现在可以为不同事件设置不同的时间间隔时,我立即想到了这种必要性。

 
Artyom Trishkin:

...但是,检查某些符号上的价格水平是否交叉(它们的列表会分别动态变化,使用 ticks 的类的实例也 会动态添加/删除)的频率应该足够高,以便能够及时确定交叉的事实。

因此,如果使用 ticks,最好在OnTick() 中进行这些检查。为什么要每隔 16 毫秒凿一次定时器?
 
Anatoli Kazharski:
如果使用 ticks,最好在OnTick() 中进行这些检查。为什么要每隔 16 毫秒凿一次定时器?
它是多币种的。什么 OnTick()?
 
Artyom Trishkin:
是多币种。什么是 OnTick()?

那就通过事件吧。但不是通过频率如此之高的计时器。一般来说,刹车在你这边,而不在库或视频录制这边。我没有问题了。