文章 "图形界面 X: 高级列表和表格管理。代码优化 (集成构建 7)" - 页 3 12345678910...12 新评论 Artyom Trishkin 2017.01.03 01:51 #21 Tol,我意识到这不是一个合适的主题,但自从最近的更新....。总的来说:我很久以前就注意到了这个问题,但我一直在等待这次更新(以防它被修复,但没有......)。如果有一个带图表的窗口(CStandartChart),而子图的顶部有一个窗口,那么如果与服务器的连接中断,然后又恢复,对象图会变得高于其他窗口。这就需要以某种方式重新绘制最上面的窗口。显然,您可以在 CProgram 中跟踪这一点,但在我看来,应该由程序库来做这些事情。(虽然速度会慢很多,但这可能是由于实时记录的缘故)。 Anatoli Kazharski 2017.01.03 07:14 #22 Artyom Trishkin:...如果有一个带图表的窗口(CStandartChart),而子图的顶部有一个窗口,那么如果与服务器的连接断开,然后又恢复,图表对象就会高于其他窗口。这就需要以某种方式重新绘制最上面的窗口。显然,您可以在 CP 程序中跟踪这一点,但在我看来,应该由库来做这些事情。(它的运行速度很慢,但这可能是因为实时记录的缘故)。好的,谢谢你的信息。我还没有测试过断开/重新连接。我看看能做些什么。为什么刹车如此糟糕?用什么程序录音?速度很慢。看起来好像处理器处于 100% 负载状态?我试着用Fast Stone Capture 录音,并积极使用 MQL 应用程序中的图形用户界面。一切正常,没有任何东西像这样变慢。 Artyom Trishkin 2017.01.03 07:58 #23 Anatoli Kazharski:好的,谢谢您的信息。我还没有测试过断开/重新连接。我看看能做些什么。速度变慢是怎么回事?用什么程序录制?速度很慢。看起来好像处理器是 100% 负载?我试着用Fast Stone Capture 录音,并积极使用 MQL 应用程序中的图形用户界面。一切都很正常,没有任何东西像这样变慢。 这是 oCam 的免费版本。但是,顺便说一下,如果没有实时记录,速度也会变慢。有很多对象。在计时器中,您必须扫描许多符号的价格交叉水平,每个符号都有自己的交叉水平,符号列表是动态的,还需要监控其变化。有一点很好--更新后,我不必像上次那样重做了;)))。 Anatoli Kazharski 2017.01.03 08:02 #24 Artyom Trishkin: ... 不过,顺便说一句,在没有实时录音的情况下,我也在放慢速度。有很多对象。定时器必须扫描许多符号的价格交叉水平,每个符号的价格交叉水平都不一样,而且符号列表是动态的,还需要监控其变化。... 这些检查的频率是多少? Artyom Trishkin 2017.01.03 08:05 #25 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 Discussion of article "Graphical How to make the Urgent : Please help Anatoli Kazharski 2017.01.03 08:09 #26 Artyom Trishkin:定时器:... 定时器步长 (TIMER_STEP_MSC) 16是否有必要在定时器中进行这种条件检查?如果在定时器中进行,为何如此频繁?您可以尝试减少步长,并为每组条件设置不同的时间间隔。我为此添加了CTimeCounter 类。请再次阅读文章,了解如何使用该类。部分:项目测试应用 Artyom Trishkin 2017.01.03 08:16 #27 Anatoli Kazharski:是否有必要在计时器中检查此类情况?如果在计时器中,为什么要如此频繁?您可以尝试减少步长,并为每组条件设置不同的时间间隔。我为此添加了CTimeCounter 类。请再次阅读文章,了解如何使用该类。部分:项目测试应用程序是的,我已经在考虑这个问题了。当然,对新条形图的检查可以少做一些--这并不重要。但检查价格是否越过某些符号的水平线(它们的列表会分别动态变化,并且会动态添加/删除与刻度线有关的类的实例)的频率应该足够高,以便能够及时确定越线的事实。当我读到现在可以为不同事件设置不同的时间间隔时,我立即想到了这种必要性。 Anatoli Kazharski 2017.01.03 08:35 #28 Artyom Trishkin:...但是,检查某些符号上的价格水平是否交叉(它们的列表会分别动态变化,使用 ticks 的类的实例也 会动态添加/删除)的频率应该足够高,以便能够及时确定交叉的事实。 因此,如果使用 ticks,最好在OnTick() 中进行这些检查。为什么要每隔 16 毫秒凿一次定时器? Artyom Trishkin 2017.01.03 18:13 #29 Anatoli Kazharski: 如果使用 ticks,最好在OnTick() 中进行这些检查。为什么要每隔 16 毫秒凿一次定时器? 它是多币种的。什么 OnTick()? Anatoli Kazharski 2017.01.03 19:26 #30 Artyom Trishkin: 是多币种。什么是 OnTick()?那就通过事件吧。但不是通过频率如此之高的计时器。一般来说,刹车在你这边,而不在库或视频录制这边。我没有问题了。 12345678910...12 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
Tol,我意识到这不是一个合适的主题,但自从最近的更新....。
总的来说:我很久以前就注意到了这个问题,但我一直在等待这次更新(以防它被修复,但没有......)。
如果有一个带图表的窗口(CStandartChart),而子图的顶部有一个窗口,那么如果与服务器的连接中断,然后又恢复,对象图会变得高于其他窗口。
这就需要以某种方式重新绘制最上面的窗口。显然,您可以在 CProgram 中跟踪这一点,但在我看来,应该由程序库来做这些事情。
(虽然速度会慢很多,但这可能是由于实时记录的缘故)。
...
如果有一个带图表的窗口(CStandartChart),而子图的顶部有一个窗口,那么如果与服务器的连接断开,然后又恢复,图表对象就会高于其他窗口。
这就需要以某种方式重新绘制最上面的窗口。显然,您可以在 CP 程序中跟踪这一点,但在我看来,应该由库来做这些事情。
(它的运行速度很慢,但这可能是因为实时记录的缘故)。
好的,谢谢你的信息。我还没有测试过断开/重新连接。我看看能做些什么。
为什么刹车如此糟糕?用什么程序录音?速度很慢。看起来好像处理器处于 100% 负载状态?我试着用Fast Stone Capture 录音,并积极使用 MQL 应用程序中的图形用户界面。一切正常,没有任何东西像这样变慢。
好的,谢谢您的信息。我还没有测试过断开/重新连接。我看看能做些什么。
速度变慢是怎么回事?用什么程序录制?速度很慢。看起来好像处理器是 100% 负载?我试着用Fast Stone Capture 录音,并积极使用 MQL 应用程序中的图形用户界面。一切都很正常,没有任何东西像这样变慢。
Artyom Trishkin:
...
不过,顺便说一句,在没有实时录音的情况下,我也在放慢速度。
有很多对象。
定时器必须扫描许多符号的价格交叉水平,每个符号的价格交叉水平都不一样,而且符号列表是动态的,还需要监控其变化。
...检查的频率是多少?
定时器:
//| 定时器|
//+------------------------------------------------------------------+
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();
}
//+------------------------------------------------------------------+
定时器:
是否有必要在定时器中进行这种条件检查?
如果在定时器中进行,为何如此频繁?
您可以尝试减少步长,并为每组条件设置不同的时间间隔。我为此添加了CTimeCounter 类。请再次阅读文章,了解如何使用该类。部分:项目测试应用
是否有必要在计时器中检查此类情况?
如果在计时器中,为什么要如此频繁?
您可以尝试减少步长,并为每组条件设置不同的时间间隔。我为此添加了CTimeCounter 类。请再次阅读文章,了解如何使用该类。部分:项目测试应用程序
是的,我已经在考虑这个问题了。
当然,对新条形图的检查可以少做一些--这并不重要。但检查价格是否越过某些符号的水平线(它们的列表会分别动态变化,并且会动态添加/删除与刻度线有关的类的实例)的频率应该足够高,以便能够及时确定越线的事实。
当我读到现在可以为不同事件设置不同的时间间隔时,我立即想到了这种必要性。
...但是,检查某些符号上的价格水平是否交叉(它们的列表会分别动态变化,使用 ticks 的类的实例也 会动态添加/删除)的频率应该足够高,以便能够及时确定交叉的事实。
如果使用 ticks,最好在OnTick() 中进行这些检查。为什么要每隔 16 毫秒凿一次定时器?
是多币种。什么是 OnTick()?
那就通过事件吧。但不是通过频率如此之高的计时器。一般来说,刹车在你这边,而不在库或视频录制这边。我没有问题了。