記事"MQL5 クックブック: インジケーターサブウィンドウコンソールーボタン"についてのディスカッション - ページ 4

 
DC2008:

そして、「ボタン関数はOnInit関数に配置される」という事実は非常におかしい!

しかし、もしかしたら、私たちが話していることを理解していないのではないだろうか?ボタンを押せば、何らかのユーザー関数がトリガーされ、何らかのマイクロタスクが実行されるはずだ。

 
DC2008:

よし、笑おう。この記事は「誰も舌を引かなかった」あなたが書いたものだ。

だから、説明できないことを引用という形で説明するのは、少なくとも読者に対して失礼だ。質問には例や一次資料への リンクで答えるべきだ。

不必要な関数で混乱させ、過負荷なコードは「初心者」を惑わすだけだ。

そして、「ボタン関数はOnInit関数に配置されている」という事実は非常におかしい!

誰も君の舌を引っ張ってはいない。証明してくれるのか?というか、私の発言に対する反論は?ちなみに、ハンドブックにはまだすべてが記述されているわけではない。つまり、ハンドブックの作成は進行中で、追加や訂正が行われている。常に自分ですべてをチェックすべきだ。

信じてほしいのですが、あなたの記事のコードは初心者にとってより「わかりにくい」ものであり、それだけではありません。

しかし、多分あなたは私たちが話していることを理解していないのでは?ボタンをクリックすると、何らかのユーザー関数がトリガーされて、何らかのマイクロタスクが実行されるはずです。

はい、文字通りに受け取りました。もっと正確に質問してください。しかし、今日、あなたはそのような機能を持っているようなので、私の答えはあなたに嘲笑されることが予想される。

この場合の「マイクロタスク」はボタンの色を変えることだった。余計なものがないように、わざと余計な機能は加えなかった。コードに負荷をかけないようにするためだ。

実は、この記事のトピックはボタンだけに限らない。ほとんどがチャート・イベントに関するものだ。そのような例はほとんどないので、ひとつ書くことにした。

 

記事の作者の皆さん、あなたは私のためではなく、初心者のためにこの記事を書いたのです。確かに、私はあなたの解決策に興味はありませんが、私たちは言語を知り始めたばかりの人たちについて話しているのです。どのような「他のプログラム」について話しているのでしょうか?また、あるプログラムのOnDeinit関数が 他のプログラムの関数にどのように影響するのでしょうか?

私たちは記事について議論しているのであって、何をそんなに憤っているのですか?

私のためではなく、初心者のために質問に答えてみてください。

Документация по MQL5: Основы языка / Функции / Функции обработки событий
Документация по MQL5: Основы языка / Функции / Функции обработки событий
  • www.mql5.com
Основы языка / Функции / Функции обработки событий - Документация по MQL5
 
DC2008:

記事の著者へ、あなたは私のために書いたのではなく、初心者のために書いたのです。

その通りです。

確かに、私はあなたの解決策に興味はないが、私たちは言語を知り始めたばかりの人たちについて話しているのだ。

しかし、あなたは質問している。

私たちが話している「他のプログラム」とは何ですか?

あなたが以前リンクを貼ったものです。そして、あなたは証拠も示さずに、ヒントによって私の発言に反論しようとしている。

また、あるプログラムのOnDeinit関数が 他のプログラムの関数にどのように影響するのですか?

影響する。私はそれについて書いた。記事を掲載した編集者はそれを確認した。あなたも自分で確認してください。

私たちはその記事について議論しているのですが、あなたは何にそんなに腹を立てているのですか?

何もない。私の主張に対する反論を待っている。)

私のためではなく、新参者のための質問に答えるようにしてください。

これまでのところ、新参者からの質問はない。そして、質問はありえない。すべてが非常に明確で、コードのすべての行が詳細にコメントされている。

 

私たちは最初にこれを妨害した:

void OnTimer()
  {
//--- マウス・イベント・トラッキングが有効かどうかをチェックする。
   //CheckChartEventMouseMove();

  }

つまり、今はマウス・イベントを追跡しない。

チャート上でコードを実行してみよう:

今度は「別のプログラム」を実行する:

何かが間違っているのだろうか? それとも、それが我々のやるべきことなのだろうか?

コードの作者によれば、「マウス・トラッキング」が失われたとのことだが、そんなことは起こらない:

 
C-4:

もし、あなたがその資格がないのなら、誰がその資格があるのか私は知らない。ダナルド・クヌース?ビル・ゲイツ?

褒めてもらいたかったんだ。うまくいったよ(笑)。

C-4:
なるほど。しかし、明確でないのは、あなたによって創造された市場の主要製品は、あなたのものではないということです。残念ではありませんか?

1.まだ夕方ではない)

2.パネルとは比較にならないが、私の手工芸品も常に上位にある。

3.パネルの成功はアイデア作者の努力によるところが大きいので、私の製品というのは正しくない。

4.私はタダ働きはしていない)

 
DC2008:

...

コードの作者によると、「マウス・トラッキング」が失われたとのことですが、これは起こりません:

次に、OnDeinit()イベントがインジケーターでトリガーされるかどうか確認してください。これが前に述べた興味深い点です。:)つまり、記事の例のOnDeinit()では、モーション・トラッキング・イベントは無効になっています。これはバグなので、開発者に知らせるべきです。

さらに、私の発言が正しいことを確認するために、空白のExpert Advisorを作成する必要があります(OnDeinit()関数はExpert Advisorで機能します):

//+------------------------------------------------------------------+
//|TEST.mq5
//| Copyright 2013, MetaQuotes Software Corp.
//|http://mql5.commql5.com
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int OnInit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| エキスパートの初期化機能
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- マウス・イベントのトラッキングを無効にする
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
| オンティック|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+

//---

これで、記事のインジケーターがチャート上にあるときにExpert Advisorを削除すると、インジケーターでも移動イベントのトラッキングが無効になります。

これについては:

それとも、このように設計されているのでしょうか?

知っています。そのように設計されているのではなく、この記事で考慮されていないだけです。いつものように、この記事は単純な例であり、すべてのケースに対応する既製の解決策ではありません。)

 
セルゲイ、騒ぐな。例えば、なぜタイマーを使うのかがわからなかった。しかし、すぐに記事の説明を見つけ、すぐにすべてを理解することができた。タイマーを導入したのであれば、それなりの理由があったのだろう。
 
void OnDeinit(const int reason)
  {
//--- マウス・イベントのトラッキングを無効にする
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }

一般的に、このコードは非常に問題が多いようです。Expert Advisor/Indicator を無効にするときにマウスの動きのトラッキングをオフにする本当の理由はない。 そんなに悩むなら、Expert Advisor を開始する前の状態に戻すべきである:

bool mouseStatus;
void OnInit()
  {
  mouseStatus = ChartGetInteger(0,CHART_EVENT_MOUSE_MOVE);
  }

void OnDeinit(const int reason)
  {
   //--- マウス・イベントのトラッキングを無効にする
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,mauseStatus);
  }
 
C-4:

一般的に、このコードはかなり問題があるようです。Expert Advisor/Indicatorを無効にするときにマウスの動きのトラッキングをオフにする本当の理由はありません。

いいえ、それは間違いです。マウストラッキングを無効にする本当の理由があります。今からそれを証明します。)

例えば、チャート上で2つのプログラムが動いているとします。マウスの動きをトラッキングする必要があるExpert Advisor。そして、マウスの移動イベントをトラッキングする必要はないが、他のチャートイベントをトラッキングする必要があるインジケーター。

Expert Advisorのコードを実行します:

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int OnInit()
  {
//--- マウス・イベントのトラッキングを有効にする
   ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,true);
//---
   return(0);
  }
//+------------------------------------------------------------------+
//| エキスパートの初期化機能
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- マウス・イベントのトラッキングを無効にする
   /ChartSetInteger(0,CHART_EVENT_MOUSE_MOVE,false);
  }
//+------------------------------------------------------------------+
| オンティック|
//+------------------------------------------------------------------+
void OnTick()
  {
  }
//+------------------------------------------------------------------+
//| チャートイベント機能|
//+------------------------------------------------------------------+
void OnChartEvent(const int    id,
                  const long   &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- マウスの動きとマウスの左ボタン押下を追跡する。
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static int count=1;
      Print("CHARTEVENT_MOUSE_MOVE; EXPERT; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

このコードでは、初期化中のOnInit() 関数で、マウス移動イベントのトラッキングが有効になっています。しかし、OnDeinit()関数の、このトラッキングを無効にすべき行は意図的にコメントアウトされています。

インジケータをチャート上にもロードします。これがそのコードです:

#property copyright "Copyright 2010, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property indicator_chart_window
//+------------------------------------------------------------------+
//| カスタムインジケータ初期化関数
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| エキスパートの初期化機能
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| カスタム・インジケータ反復関数
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   
//--- 次の呼び出しのためにprev_calculatedの値を返す
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| チャートイベント機能|
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//--- マウスの動きとマウスの左ボタン押下を追跡する。
   if(id==CHARTEVENT_MOUSE_MOVE)
     {
      static long count=1;
      Print("CHARTEVENT_MOUSE_MOVE; INDICATOR; ",count);
      count++;
     }
  }
//+------------------------------------------------------------------+

最初のプログラムも2番目のプログラムも、イベントを受信したというメッセージをログに出力します。次に、チャートからExpert Advisorを削除します。ExpertAdvisorの助けを借りていくつかの計算を行ったので、もう必要ないとします。削除後も、マウス移動追跡イベントは無効化されていないため、インジケーターはこのイベントを受信し続けます。そして、あなたはそれを必要としません。

同意しますか?)