記事「指標やEAのデータを表示するダッシュボードの作成」についてのディスカッション - ページ 3

 
Denis Kirichenko #:
今のところ、これがCHARTEVENT_CHART_CHANGE(9)イベントの処理方法であることがわかりました。

つまり、チャート・ウィンドウからフォーカスが離れると、そのサイズが異なるのは自然なことなのです。

これがその処理です:

//--- スケジュールが変更された場合
   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))
         {
         //--- エラーメッセージを "Experts "ログに出力する。
         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);
        }
     }


バグが消えたようだ。


Проблема с CHARTEVENT_CHART_CHANGE - Отлавливаю момент, когда изменяется размер окна графика. При переключении окон происходит событие CHARTEVENT на размер окна предыдущих установок
Проблема с CHARTEVENT_CHART_CHANGE - Отлавливаю момент, когда изменяется размер окна графика. При переключении окон происходит событие CHARTEVENT на размер окна предыдущих установок
  • 2021.12.25
  • satorifx
  • www.mql5.com
чтобы она была в зоне видимости не вылазила за пределы окна графика CHANGE так же срабатывает. 26 11 при переключении окон ресурс не удаляется при переключении окон происходит событие CHARTEVENT CHANGE
 

もう一つの問題。インジケーターがチャートから取り除かれ、 パネルが 最小化された後、再びチャート上で起動すると、パネル・ウィンドウの展開が処理されないのです。




明日、このバグの原因を探ってみます。

 

Artem、オシレーターに関するこの後の記事の別の例でも、ウィンドウを最小化してチャートからプログラムを削除すると不具合が発生します。これはインジケーターではなく、Expert Advisorです。こちらです:



 
Denis Kirichenko #:

もう一つの問題。インジケータがチャートから取り除かれ、 パネルが 最小化された後、再びチャート上で起動されると、パネル・ウィンドウの展開が処理されません。

明日、このバグの原因を探ってみます。

ここで、Expert Advisor(またはインジケーター)をチャートから削除する際に、初期化を解除し、パネルの状態をグローバルターミナル変数に保存しない原因を確認することができます。これは問題の解決ではなく、問題の隠蔽です。もちろん良いことではありません。しかし、手っ取り早い解決策としては有効でしょう。

あるいは、この動作について調べる必要がある。残念ながら、今は時間が限られている。

 
Denis Kirichenko #:

フォーラムを見た。この問題はすでに議論されている。例えば 私はコードにそのようなチェックを 加えた:

バグが消えたようだ。

ありがとう。このパネル・クラスは後で私のコードに追加するつもりだ。ところで、このパネルが使われた記事から記事へ、いろいろと改良が加えられている。このパネルが使われた最後の記事はここ だと思う。しかし、まだ改良したかどうか覚えていない。
パネル・クラスのコードをここに添付しておく。

Цветные буферы в мультисимвольных мультипериодных индикаторах
Цветные буферы в мультисимвольных мультипериодных индикаторах
  • www.mql5.com
В статье пересмотрим структуру индикаторного буфера в мультисимвольных мультипериодных индикаторах и организуем вывод на график цветных буферов этих индикаторов.
ファイル:
Dashboard.mqh  219 kb
 

取引、自動取引システム、取引戦略のテストに関するフォーラム

記事「インジケータとExpert Advisorにデータを表示するための情報パネルの作成」についての議論

デニス・キリチェンコ, 2024.09.23 22:26

もう一つの問題があります。インジケータがチャートから削除され、 パネルが 最小化された後、パネルウィンドウが展開され、再びチャート上で開始されることを処理しません。


はい、Dashboard.mqhの最新版ではそのようなバグはありません。動作します。

 
Denis Kirichenko #:

はい、最新版のDashboard.mqhにはそのようなバグはありません。動作します。

よかった。
 

新しいビブにもバグがあります。チャート上でパネルを起動し、チャート・ウインドウのサイズを弄ると、ウインドウを元に戻したときにパネルが下の方にくっついてしまう。そしてそこから出ようとしない((


 

Artem、質問があります。void CDashboard::Move(int x, int y)メソッドの中にそのようなものがあります:

if(!m_higher_wnd)
     {
      if(y + h > m_chart_h - 2)
         y = m_chart_h - h - 2;
      if(y < 1)
         y = 1;
     }
   else
     {
      if(y > 1)
         y = 1;
      if(y < m_chart_h - h - 2)
         y = m_chart_h - h - 2;
     }


特に、この ブロックに興味があります。すなわち、パネルの高さがチャート・ウィンドウより低く、そのY点(左上隅)がウィンドウの高さとパネルの高さの差(2ピクセルで補正)より低い場合、パネルの上点はこの差の値が割り当てられます。なぜこうなるのか、何がポイントなのか。

要するに、CDashboard::Move(int x, int y) メソッドで固着が発生して いるからです。チャート・サイズを変更してからパネルを動かそうとすると、常に座標が修正されてしまい、パネル・ウィンドウを自由に動かすことができないのです...。