//--- Если график изменёнif(id==CHARTEVENT_CHART_CHANGE)
{
//--- Получаем номер подокна графика (он может измениться при удалении окна какого-либо индикатора)this.m_wnd=this.GetSubWindow();
//--- Получаем новые размеры графикаint w=(int)::ChartGetInteger(this.m_chart_id,CHART_WIDTH_IN_PIXELS,this.m_wnd);
int h=(int)::ChartGetInteger(this.m_chart_id,CHART_HEIGHT_IN_PIXELS,this.m_wnd);
//--- Определяем выход размеров панели за пределы окна графикаthis.m_higher_wnd=this.HigherWnd();
this.m_wider_wnd=this.WiderWnd();
//--- Если высота графика изменилась - корректируем расположение панели по вертикалиif(this.m_chart_h!=h)
{
this.m_chart_h=h;
int y=this.m_y;
if(this.m_y+this.m_h>h-1)
y=h-this.m_h-1;
if(y<1)
y=1;
this.Move(this.m_x,y);
}
//--- Если ширина графика изменилась - корректируем расположение панели по горизонталиif(this.m_chart_w!=w)
{
this.m_chart_w=w;
int x=this.m_x;
if(this.m_x+this.m_w>w-1)
x=w-this.m_w-1;
if(x<1)
x=1;
this.Move(x,this.m_y);
}
}
//--- Если график изменёнif(id==CHARTEVENT_CHART_CHANGE)
{
//--- Получаем номер подокна графика (он может измениться при удалении окна какого-либо индикатора)this.m_wnd=this.GetSubWindow();
l ong value;
//--- сбросим значение ошибки
::ResetLastError();
//--- получим значение свойстваif(!::ChartGetInteger(m_chart_id, CHART_BRING_TO_TOP, m_wnd, value))
{
//--- выведем сообщение об ошибке в журнал "Эксперты"Print(__FUNCTION__ + ", Error Code = ", ::GetLastError());
return;
}
// если это не показ графика поверх всех других - выходимif(value == 0)
return;//--- Получаем новые размеры графикаint w=(int)::ChartGetInteger(this.m_chart_id,CHART_WIDTH_IN_PIXELS,this.m_wnd);
int h=(int)::ChartGetInteger(this.m_chart_id,CHART_HEIGHT_IN_PIXELS,this.m_wnd);
//--- Определяем выход размеров панели за пределы окна графикаthis.m_higher_wnd=this.HigherWnd();
this.m_wider_wnd=this.WiderWnd();
//--- Если высота графика изменилась - корректируем расположение панели по вертикалиif(this.m_chart_h!=h)
{
this.m_chart_h=h;
int y=this.m_y;
if(this.m_y+this.m_h>h-1)
y=h-this.m_h-1;
if(y<1)
y=1;
this.Move(this.m_x,y);
}
//--- Если ширина графика изменилась - корректируем расположение панели по горизонталиif(this.m_chart_w!=w)
{
this.m_chart_w=w;
int x=this.m_x;
if(this.m_x+this.m_w>w-1)
x=w-this.m_w-1;
if(x<1)
x=1;
this.Move(x,this.m_y);
}
}
чтобы она была в зоне видимости не вылазила за пределы окна графика CHANGE так же срабатывает. 26 11 при переключении окон ресурс не удаляется при переключении окон происходит событие CHARTEVENT CHANGE
В статье пересмотрим структуру индикаторного буфера в мультисимвольных мультипериодных индикаторах и организуем вывод на график цветных буферов этих индикаторов.
到目前为止,我发现 CHARTEVENT_CHART_CHANGE(9) 事件就是这样处理的。
因此,当焦点从图表窗口移开时,它的大小就会发生变化,这是很自然的。
下面是处理过程:
应尽量控制图表的焦点,而不是在图表窗口失去焦点时对变化做出反应。或者其他类似的想法。遗憾的是,我还无法运行和测试它,以找出确切的原因和修复方法。
我浏览了论坛。这个问题已经被讨论过了。举个例子。我在代码中 添加了这样一个检查:
错误似乎消失了。
另一个问题。首先从图表中删除指标,然后将面板最小化,再重新在图表中启动后, 面板 窗口的展开没有得到处理。
明天我将尝试找出问题所在....。
Artem,后续文章中关于震荡指标的另一个例子,也是在最小化窗口后从图表中删除程序时出现故障。这不是一个指标,而是一个智能交易系统。这里:
另一个问题。首先从图表中移除指标,将面板最小化,然后再次在图表中启动后, 面板 窗口的展开没有得到处理。
明天我将尝试找出问题所在....。
在这里您可以检查去初始化的原因,以及从图表中移除智能交易系统(或指标)时面板状态未保存到全局终端变量的原因。这不是解决问题的办法,而是掩盖问题。当然,这并不好。但它可以快速解决问题。
或者你需要研究一下这种行为。遗憾的是,我现在时间有限。
我浏览了论坛。这个问题已经被讨论过了。举个例子。我在代码中 添加了这样一个检查:
错误似乎消失了。
谢谢。我稍后会把这个面板类添加到我的代码中。顺便说一下,在使用该面板的每一篇文章中,都有各种各样的改进。我想这是 使用该面板的最后一篇文章。但我不记得是否已经改进过了。
我在这里附上了面板类的代码。
关于交易、自动交易系统和交易策略测试的论坛
讨论文章 "制作用于在指标和智能交易系统中显示数据的信息面板"
Denis Kirichenko, 2024.09.23 22:26
另一个问题。当指标从图表中移除,面板最小化,然后在图表....,它无法处理 面板 窗口的展开。
是的,在最新版本的 Dashboard.mqh 中没有这个错误。它可以正常工作。
是的,在最新版本的 Dashboard.mqh 中没有这样的错误。它可以运行。
新的围兜还有一个错误。如果在图表上启动面板,然后调整图表窗口大小,当窗口恢复时,面板会粘在底部。而且它不想离开那里((